TCP採用超時/重傳機制來處理報文段的丟失問題。儘管這在概念上面很簡單,可是在實際中還
是會產生不少微妙的問題。最明顯仍是超時時間間隔的設置。很顯然,這個時間間隔確定會大於RTT
時間,可是具體爲多大呢?如何估計最開始的往返時間呢?下面將介紹這些問題的一些解決辦法。網絡
報文段的樣本RTT(表示爲SampleRTT)爲某報文段發出到對該報文段的確認被收到之間的時間
量大多數TCP的實現僅在某個時刻作一次SampleRTT測量,而不是爲每一個報文段測量一個SampleRTT。
也就是說,在任什麼時候刻,僅爲一個已發送可是目前還沒有被確認的報文段估計SampleRTT,從而產生
一個接近每一個RTT的新SampleRTT值。
另外,TCP毫不爲被重傳的報文計算SampleRTT;它僅爲傳輸一次的報文段測量SampleRTT。學習
因爲路由器的擁塞和端系統負載的變化,這些報文段的SampleRTT是波動的,因此給定的任何
SampleRTT都是非典型的。所以要取得典型的RTT,就要對SampleRTT進行加權取值。計算機網絡
EstimatedRTT = (1-α)*EstimatedRTT + α*SampleRTT
[RFC 6298]中給出α的參考值爲0.125
對於最近的樣本賦予較大的權值,是由於越近的樣本越能反應網絡當前的擁塞情況。
從統計學觀點講,這種平均被稱爲指數加權移動平均(EWMA)code
除估算RTT外,測量RTT變化也是頗有用的!
[RFC 6298]定義了RTT誤差 DevRTT,用於估算SampleRTT偏離EstimatedRTT的程度:路由
DevRTT = (1-β)*DevRTT + β*|SampleRTT - EstimatedRTT|
DevRTT是SampleRTT和EstimatedRTT之差的指數加權移動平均
若是SampleRTT的波動小那麼DevRTT的波動便會小,反之亦此。
第一次的DevRTT=1/2(SampleRTT),之後按公式來計算,推薦β爲0.25路由器
超時時間間隔應該大於EstimatedRTT而且不能大於太多。超時時間間隔爲EstimatedRTT加
上一些餘量。而且在SampleRTT值波動大時,餘量較大;當波動較小時,餘量較小。所以就用
到了DevRTT。由此得出TCP重傳時間間隔計算公式:學習筆記
TimeoutInterval = EstimatedRTT + 4*DevRTT
推薦的初始TimeoutInterval爲1秒。
出現超時後,TimeoutInterval直接加倍。
由於這次重傳多是報文確認ACK由於網絡擁塞而延遲到達從而致使報文重傳,重傳報文
後,不久,ACK到達,會致使SampleRTT變小,進而使TimeoutInterval變小,使後面的報文出
現過早超時!
一旦報文段收到並更新EstimatedRTT後,TimeoutInterval又使用上述公式。方法
此文爲《計算機網絡 自頂向下方法》的學習筆記4im