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」的選項。
相關文章
相關標籤/搜索