RTT Round-Trip Time
比如重傳定時器,那么到底多長時間沒接到ACK才重傳呢?
測量的RTT
RTT的測量可以采用兩種方法:
(1)重傳隊列中數據包的TCP控制塊
在TCP重傳隊列中保存着發送而未被確認的數據包,數據包skb中的TCP控制塊包含着一個變量,
tcp_skb_cb->when,記錄了該數據包的第一次發送時間。
RTT = 當前時間 – when
(2)TCP Timestamp選項
在前面的blog中有詳細的介紹過這個選項,TCP時間戳選項可以用來精確的測量RTT。
RTT = 當前時間 - 數據包中Timestamp選項的回顯時間
這個回顯時間是該數據包發出去的時間,知道了數據包的接收時間(當前時間)和發送時間
(回顯時間),就可以輕松的得到RTT的一個測量值。
為什么用時間戳選項測量RTT?
既然不用時間戳選項就可以實現RTT測量,為何還增加時間戳選項呢?看下面解釋:
“TCP must use Karn's algorithm for taking RTT samples. That is, RTT samples MUST NOT be made using segments that were retransmitted (and thus for which it is ambiguious whether the reply was for the first instance of the packet or a later instance). The only case when TCP can safely take RTT samples from retransmitted segments is when the TCP timestamp option is employed, since the timestamp option removes the ambiguity regarding which instance of the data segment triggered the acknowledgement.”
上面這段話的意思是,不能確定ACK是對原包的回復還是對重傳包的回復。
畫個圖就明白了,如下
平滑的RTT
(Smoothed RTT): 因為RTT對不同的往返有不同的數值,而且其起伏比較大,以致不能為重傳超時做標准,所以需要平滑的RTT,記為SRTT它對和前一個SRTT加權平均。
即SRTT=(α * SRTT)+((1-α) * RTT),α推薦為0.9.
如需深入了解,可以查看鏈接