協議森林11 涅槃 (TCP重新發送)


作者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉載,也請保留這段聲明。謝謝!

 

TCP協議是一個可靠的協議。它通過重新發送(retransmission)來實現TCP片段傳輸的可靠性。簡單的說,TCP會不斷重復發送TCP片段,直到片段被正確接收。

 

TCP片段丟失

 

TCP頭部的checksum

接收方(receiver)可以通過校驗TCP片段頭部中checksum區域來檢驗TCP片段是否出錯。我們已經接觸過了IP協議詳解的checksum算法。TCP片段的checksum算法與之類似。IP協議的checksum只校驗頭部,TCP片段頭部的checksum會校驗包括IP頭部、TCP頭部和TCP數據在內的整個序列,確保IP地址、端口號和其他相關信息正確。如果TCP片段出錯,接收方可以簡單的丟棄改TCP片段,也就相當於TCP片段丟失

TCP片段包裹在一個IP包中傳輸。IP包可能在網絡中丟失。導致IP包丟失的原因可能有很多,比如IP包經過太多的路由器接力,達到hop limit;比如路由器太過擁擠,導致一些IP包被丟棄;再比如路由表(routing table)沒有及時更新,導致IP包無法送達目的地。

下面我們要介紹兩種重新發送TCP片段的機制:超時重新發送快速重新發送。 

 

超時重新發送

我們之前已經簡單介紹過重新發送的機制:當發送方送出一個TCP片段后,將開始計時,等待該TCP片段的ACK回復。如果接收方正確接收到符合次序的片段,接收方會利用ACK片段回復發送方。發送方得到ACK回復后,繼續移動窗口,發送接下來的TCP片段。如果直到計時完成,發送方還是沒有收到ACK回復,那么發送方推斷之前發送的TCP片段丟失,因此重新發送之前的TCP片段。這個計時等待的時間叫做重新發送超時時間(RTO, retransmission timeout)。

 

RTO:沙漏中沙子的多少

發送方應該在等待多長時間之后重新發送呢?這是重新發送的核心問題。上述過程實際上有往返兩個方向:1. 發送片段從發送方到接收方的傳輸,2. ACK片段從接收方到發送方的傳輸。整個過程實際耗費的時間稱做往返時間(RTT, round trip time)。如果RTT是固定的,比如1秒,那么我們可以讓RTO等於RTT。但實際上,RTT的上下浮動很大。比如某個時刻,網絡中有許多交通,那么RTT就增加。在RTT浮動的情況下,如果我們設置了過小的RTO,那么TCP會等待很短的時間之后重新發送,而實際上之前發送的片段並沒有丟失,只是傳輸速度比較慢而已,這樣,網絡中就被重復注入TCP片段,從而浪費網絡傳輸資源。另一方面,如果RTO時間過長,那么當TCP片段已經實際丟失的情況下,發送方不能及時重新發送,會造成網絡資源的閑置。所以,RTO必須符合當前網絡的使用狀況。網絡狀況越好,RTO應該越短;網絡狀況越差,RTO應該越長。

 

RTT: 往返時間

 

TCP協議通過統計RTT,來決定合理的RTO。發送方可以測量每一次TCP傳輸的RTT (從發送出數據片段開始,到接收到ACK片段為止),這樣的每次測量得到的往返時間,叫做采樣RTT(srtt, sampling round trip time)。建立連接之后,每次的srtt作為采樣樣本,計算平均值(mean)和標准差(standard deviation),並讓RTO等於srtt平均值加上四倍的srtt標准差。

RTO = mean + 4 std

(上述算法有多個變種,根據平台不同有所變化)

平均值反映了平均意義上的RTT,平均往返時間越大,RTO越大。另一方面,標准差越大也會影響RTO。標准差代表了RTT樣本的離散程度。如果RTT上下劇烈浮動,標准差比較大。RTT浮動大,說明當前網絡狀況相對不穩定。因此要設置更長的RTO,以應對不穩定的網絡狀況。

 

快速重新發送

我們剛才介紹了超時重新發送的機制:發送方送出一個TCP片段,然后開始等待並計時,如果RTO時間之后還沒有收到ACK回復,發送方則重新發送。TCP協議有可能在計時完成之前啟動重新發送,也就是利用快速重新發送(fast-retransmission)。快速發送機制如果被啟動,將打斷計時器的等待,直接重新發送TCP片段。

由於IP包的傳輸是無序的,所以接收方有可能先收到后發出的片段,也就是亂序(out-of-order)片段。亂序片段的序號並不等於最近發出的ACK回復號。已接收的文本流和亂序片段之間將出現空洞(hole),也就是等待接收的空位。比如已經接收了正常片段5,6,7,此時又接收亂序片段9。這時片段8依然空缺,片段8的位置就是一個空洞。

補上空洞

TCP協議規定,當接收方收到亂序片段的時候,需要重復發送ACK。比如接收到亂序片段9的時候,接收方需要回復ACK。回復號為8 (7+1)。此后接收方如果繼續收到亂序片段(序號不是8的片段),將再次重復發送ACK=8。當發送方收到3個ACK=8的回復時,發送方推斷片段8丟失。即使此時片段8的計時器還沒有超時,發送方會打斷計時,直接重新發送片段8,這就是快速重新發送機制(fast-retransmission)。

 

快速重新發送機制利用重復的ACK來提示空洞的存在。當重復次數達到閾值時,認為空洞對應的片段在網絡中丟失。快速重新發送機制提高了檢測丟失片段的效率,往往可以在超時之前探測到丟失片段,並重復發送丟失的片段。

 

總結

鳳凰浴火重生。而TCP協議利用重新發送(retransmission)來實現TCP傳輸的可靠性。重新發送的基本形式是超時重新發送,根據統計的往返時間來設置超時標准;如果超時,則重新發送TCP片段。另一方面,快速重新發送則通過亂序片段的ACK來更早的推斷出片段的丟失。

 

歡迎繼續閱讀“協議森林”系列

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM