TCP中的RTT和RTO
一、RTT和RTO的概念
TCP作為一個面向連接的、可靠的傳輸協議,內部實現了一個重傳計時器來保證數據能傳輸到對方。每發送一個數據包,就給這個數據設置一個重傳計時器。如果在計時器超時之前收到了針對這個數據包的ack,就取消這個計時器。如果沒有收到,則開始發起重傳。計時器超時的時間被稱為RTO,這個時間的確定取決于RTT。
關于兩者詳細的解釋:
- RTT(Round Trip Time):一個連接的往返時間,即數據發送時刻到接收到確認的時刻的差值;
- RTO(Retransmission Time Out):重傳超時時間,即從數據發送時刻算起,超過這個時間便執行重傳。
關于RTT和RTO值的確定一直以來都是值得討論的地方,如何讓RTO能適應網絡變化。
二、RTT的測量
每發送一個分組,TCP都會進行RTT采樣,這個采樣并不會每一個數據包都采樣,同一時刻發送的數據包中,只會針對一個數據包采樣,這個采樣數據被記為sampleRTT,用它來代表所有的RTT。
采樣的方法一般有兩種:
linux內核中,更新rtt的函數為tcp_ack_update_rtt:
三、RTO的計算
3.1 經典方法
為了避免單次RTT波動,計算RTO時新引入了變量SRTT,表示更加平滑的RTT數值,它的計算方法:
?
| 1 | SRTT = x(SRTT) + (1 - x)RTT; |
x被稱為平滑因子,一般建議設置在[0.8, 0.9],意思是SRTT值百分之八十來自于之前的值,百分之二十來自于當前值。然后計算RTO的方法為:
?
| 1 | RTO = min(ubound, max(lbound, y(SRTT))); |
y是時延離散因子,推薦值為[1.3, 2.0],ubound是RTO的上邊界,lbound是RTO的下邊界。
算法的缺點
在RTT波動較大時,RTO不能明顯適應網絡變化。
3.2 標準方法
標準方法引入了平均偏差的概念,它類似于統計學里面的方差,但是因為方差的計算過程代價較大,對于快速TCP來說不太適合。假設rtt的值為M,RTO的計算方式為:
?
| 1 2 3 | srtt = (1 - g)srtt + g(M); rttval = (1 - h)rttval + h(|M - rttval|); RTO = srtt + 4(rttval); |
其中g設置為1/8,h設置為1/4,對srtt而言,它有1/8取決于當前值,7/8取決于現有值。當RTT變化時,偏差增量越大,RTO的增量也越大。
關于計算RTT和RTO的算法,還有很多種,歷史上針對這個的探討從未停止過。
比較出名的擁塞算法還有谷歌的bbr算法,高版本的linux內核已經合入了bbr算法作為擁塞控制算法。
四、其他
4.1 TCP Timestamps選項
時間戳選項的作用是為了方便計算RTT,每發出一個數據包,就記錄下發送時間,收到數據包時就能準確的獲知到數據包往返時間了。
通過TCPDUMP抓包很容易就能看到Timestamps選項:
總結
以上是生活随笔為你收集整理的TCP中的RTT和RTO的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TCP滑动窗口和拥塞控制机制
- 下一篇: 二叉树中任意两个节点的距离