往返時間的估計與逾時
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)除估算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又使用上述公式。
此文為《計算機網絡 自頂向下方法》的學習筆記4
每天進步一點點,不要停止前進的腳步~