底層的網絡是不可靠的, 超時、丟包各類問題, 但 TCP 協議的設計初衷是做爲一個可靠的數據傳輸協議, 超時重傳機制是實現可靠性很重要的一個設計.html
每次 TCP 握手過程都會啓動一個定時器, 若是在定時器時間內沒有收到, 則進行重傳.算法
而重傳的超時時間 則成爲 RTO (Retransmission TimeOut)網絡
咱們知道網絡是一直在波動的, 因此超時重傳也是隨着網絡一直變化的, 那咱們基於什麼來計算 RTO 呢?tcp
答案是 基於 TCP 單次握手的往返時間. 鏈接的往返時間成爲 RTT (Round Trip Time)設計
經過上圖咱們發現其實還有幾種特殊場景的計算, 但實際計算是以發送數據包時間算起, 基於協議實現裏面的 timestamp 值計算差值就能夠了.cdn
簡單概念理解:htm
RTT 和 RTO 的關係是:因爲網絡波動的不肯定性,每一個RTT都是動態變化的,因此 RTO 也應隨着 RTT 動態變化。blog
當 RTO < RTT 時, 將會觸發大量的重傳, 當 RTO > RTT 時候, 若是頻繁出現丟包, 重傳不及時, 又會形成網絡的反應慢, 最好的結果是 RTO 略大於 RTT.ip
上面說到了 網絡是一直波動的, RTT 是一直變化的, RTO 的值基於上次 RTT 往返時間動態計算出來的.文檔
這裏基於一套公式(主要Jacobson / Karels 算法), 內容過於炸裂, 這裏我要偷懶, 詳情查看RFC6298 tools.ietf.org/html/rfc629…
sgros.blogspot.com/2012/02/cal…
更多精彩內容關注公衆號 (呆呆熊的技術路):