TCP相關技術:重發機制

重發機制

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

接收方(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片段的機制:超時重新發送和快速重新發送:

1.超時重新發送

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

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

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,以應對不穩定的網絡狀況。

2.快速重新發送

我們剛纔介紹了超時重新發送的機制:發送方送出一個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來提示空洞的存在。當重複次數達到閾值時,認爲空洞對應的片段在網絡中丟失。快速重新發送機制提高了檢測丟失片段的效率,往往可以在超時之前探測到丟失片段,並重復發送丟失的片段。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章