天天看點

【TCP】往返時間的估計與逾時

往返時間的估計與逾時

  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

每天進步一點點,不要停止前進的腳步~

繼續閱讀