TCP超時重傳時間的選擇


  1. 超時重傳時間的選擇

    ​ 1. 在之前說到,TCP的發送方在規定的時間內沒有收到確認就要重傳已發送的報文段。這種重傳的概念是很簡單 的,但重傳時間的選擇卻是卻是TCP最復雜的問題之一。

    ​ 由於TCP下層是互聯網環境,每個IP報選擇的路由並不會相同,如果把超時重傳時間設置的太短,就會引起很多很多報文段不必要的重傳,浪費網絡資源;如果把超時重傳時間設置的太長,會使得網絡的空閑時間增大,降低了傳輸效率。那么運輸層的超時重傳時間究竟設置為多大?

    1. TCP采用的是自適應算法,它記錄一個報文發出的時間,以及收到相應確認的時間。這兩個時間差就是**報文段往返時間RTT。TCP保留了RTT的一個加權平均往返時間RTTs(又稱平滑的往返時間,S代表Smoothed。因為進行的是加權平均,因此得到的救國更絲滑)。每當第一次測量到RTT時間樣本的時候,RTTs值就取為所測量到的RTT樣本的加權平平均值,每測量一次新的RTT樣本值:
      1. 新的RTTs=(1-a) * (舊的RTTs)+a*(新的Rtts樣本)
      2. 上式中0<=a<1,如果a-->0,說明新的RTT樣本對已有的RTT樣本影響不大(RTT更新較慢),若a-->1,說明RTT樣本對已有RTT樣本影響較大(RTT更新較快),現在標准建議的a值為1/8。這種方法計算出來的RTTs比測量出的RTTs值更絲滑。
    2. 顯然,超時計時器設置的超時重傳時間RTO(RetransmissionTimeOut)應該概略大於RTTs。標准給出的計算公式:

    RTO=RTTs+4*RTTD

    ​ RTTD是RTT的偏差的加權平均值,它與RTTs和新的RTT樣本差有關。標准這樣計算RTTD:當第一次測量時, RTTD值取測到的RTT值得一半,在以后的測量中,則使用下式計算偏差加權平均值:

    新的RTTD=(1-b)x(舊的RTTD值)+bx|RTTS-新的RTT樣本值|,這里b是一個小於1的系數,推薦值為1/4。

    1. 這種自適應算法有很大的弊端,且非常的復雜。

    2. 根據自適應算法的弊端,Karn提出了一個算法:在計算加權平均RTTS時候,只要報文段重傳了,就不采用其往返時間。這樣得到的RTTS和RTO就比較准確。但是Karn提出的算法也有一些弊端,那就是當報文段的時延突然增大了許多,因此在原來的超時重傳時間內,並不會收到確認報文段,於是就重傳報文,由於該算法又不考慮超時重傳的報文段的往返時間,。這樣超時重傳時間就無法更新。因此我們要對Karn算法進行修正:報文段每重傳一次,就把超時時間RTP增大一下,做法就是取新的重傳時間為舊的重傳時間2倍。當不再發生報文段的重傳時,再根據公式計算出超時重傳時間。

  2. 選擇確認SACK

    1. 如果接收方收到的報文無差錯,只是未按序號,中間號缺少一些序號的數據,那么能否只傳送缺少的數據而不重傳已經正確接收到的數據?答案是可以的。選擇確認就是一種可行的處理方法。
    2. image
    3. TCP在接收到對方發送過來的數據字節流的序號不連續的時候,結果就形成了一些不連續的字節塊(圖5-21),1-1000收到了,但1001-1500並沒有接收到,1501-3000收到了,但3001-3500並沒有接收到,如果這些字節的的序號都在窗口內,那么接收方會先接收下這些數據,但要把這些信息轉卻的發送方,是發送方不要再重復發送這些已經收到的數據。
    4. 由於TCP的首部沒有哪個字段能夠准確的提供上述這些字塊的邊界信息,RFC2018規定,如果要使用選擇確認SACK,那么在建立TCP連接之前,就要在TCP的首部的選項加上允許SACK的選項。


免責聲明!

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



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