TCP/IP詳解學習筆記(14)-- TCP可靠傳輸的實現


1.概述

     為方便描述可靠傳輸原理,假定數據傳輸只在一個方向上進行,即A發送數據,B給出確認
2.以字節為單位的滑動窗口
     TCP的滑動窗口是以字節為單位的。為了便於說明,字節編號取得很小。先假定A收到B發來的確認報文字段,其中窗口是20字節,而確認號是31字節。(表明B期望接收到的下一個序號是31,序號30之前的數據已經收到了)。如圖所示。
  • A的發送窗口:
          發送窗口表示:在沒有收到B的確認的情況下,可以連續把窗口內的數據發送出去。凡是已經發送過的數據,在未收到確認之前都必須暫時保留,以便超時重傳使用。
     發送窗口有如下特點:
          1)發送窗口里面的序號表示允許發送的序號(如31~50)
          2)發送窗口的位置由窗口的前沿和后沿的位置共同確定。發送窗口的后沿可能不動(沒有收到確認),或者前移(收到新的確認)。發送窗口的前沿通常是不斷的向前移動,但也可能不動。
     現在假定A發送了序號為31-41的數據,如上圖所示,圖種可以看出要描述一個發送窗口的狀態需要三個指針P1, P2, P3。
     小於P1的是已發送並收到確認的部分,大於P3的是不允許發送部分。
     P3-P1 = A的發送窗口(又稱為通知窗口)
     P2-P1 = 已發送但尚未收到確認的字節數
     P3-P2 = 允許發送但尚未收到的字節數(又稱為可用窗口或有效窗口)
  • B的接收過程:
     B的接收窗口大小為20。在接收窗口外面,到30號為止的數據均發送過確認並交付主機使用,因此B不再保留(之前的數據)。
     如圖所示,B收到了32和33的數據。這些數據沒有按序到達,因為序號為31的數據沒有收到。由於B只能對按序到達的數據中的最高序號給出確認,因此B的發送的確認號仍然是31,而不能是32或33。現在假定B收到序號為31的數據並把序號為31-33的數據交付給主機,然后B刪除這些數據。接着把接收窗口向前移動3個序號,同時給A發出確認。其窗口值仍未20,但確認號34,表明B已經接收到序號33為止的數據。而B收到的37 38 40的數據沒有按序到達,先暫存在接收窗口中。
     如果按照以上的方式進行發送數據。當發送窗口已滿,可用窗口減小到0,因此發送停止。如果發送窗口內所有數據都正確到達B,而發出的確認由於網絡問題沒有到達A,為保證傳輸,此時A只能認為B還沒有收到這部分數據。於是A經過一段時間過(由超時計時器控制)重傳這部分數據,直到收到B的確認為止。
3.緩存機制
     發送方的應用進程把字節流寫入了TCP的發送緩存,接收方的應用進程從TCP的接受緩存中讀取字節流。下面進一步談論窗口與緩存的關系。注:緩存空間和序號空間都是有限的並且循環使用的。
  • 發送緩存和發送窗口
     發送緩存用來暫時存放:1.發送應用程序傳送給發送方TCP准備的數據2.TCP已發送但尚未收到確認的數據。
     發送窗口通常只是發送緩存的一部分。已被確認的數據應當從發送緩存中刪除,因此發送緩存與發送窗口的后沿是重合的。發送應用程序必須控制寫入緩存的速率,不能太快,否則發送緩存就會沒有存放數據的空間。
  • 接收緩存與接收窗口
     接收緩存用來暫時存放:1.按序到達的,但尚未被接收應用程序讀取的數據。2,未按序到達的數據。
     如果收到的分組檢測出有差錯,則要丟棄。如果接收應用程序來不及讀取收到的數據,接收緩存最終就會被填滿。使接收窗口減小到0.反之,接收應用程序能夠及時從接收緩存中讀取收到數據,接收窗口就會變大,但最大也不能超過接收緩存的大小。
4.超時重傳的時間選擇
     TCP每發送一個報文段,就對這個報文段設置一次計時器。只要計時器設置的重傳時間到還沒有收到確認,就要重傳這個報文段。由於數據鏈路層和運輸層的往返實驗概率分布存在很大差異,因此有必要選擇合適的超時重傳時間。
     報文段的往返時延是指收到確認報文的時間與每一個報文段發出的時間之差。報文段的平均往返時延RTT是由各個報文段的往返時延樣本加權平均得出來的。計算公式為:
     平均往返時延RTT=α×(舊的RTT)+(1-α)×(新的往返時延樣本),1 ≤ α < 1 典型的值為α為7/8.
 
     即使有一個好的RTT,要選擇一個合適的超時重傳時間RTO(Restransmission Time out)仍然不是一個容易的事情。, 顯然RTO要大於RTT。其計算公式為 RTO = β × RTT, β > 1, 推薦是2
 
5.選擇確認SACK
     若收到的報文段無差錯,只是未按序號,中間還缺少一些序號的數據,采用選擇確認的方法來傳送缺少的數據,而不重傳已經正確接收到的數據。
     用一個例子來說明(Selctive ACK)工作原理。如圖所示,接收放收到了前面的字節流不連續的兩個字節塊。如果這些字節的序號都在接收窗口內,那么接收方就先收下這些數據,但要把這些信息准確的告訴發送放,使發送方不要在重復發送這些已經收到的數據。
     
     TCP首部沒有哪個字段能夠提供上述這些字節快的邊界信息。如果要使用選擇確認,那么在建立TCP連接時,就要在TCP首部的選項上加上“允許SACK”的選項。
     


免責聲明!

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



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