TCP可靠傳輸原理

XXJAY發表於2021-09-12

停止等待協議

“停止等待”就是傳送方在傳送完一個分組後停止傳送,等待接收方的確認後再繼續傳送。

超時重傳

傳送方在等待一定時間後如果還沒有收到接收方的確認,此時傳送方將認定分組沒有送達,從而重新傳送分組。

TCP通過以下的方式實現超時重傳:

  • 超時計時器:每傳送完一個分組後,tcp都會設定一個超時計時器。超時計時器的超時時間往往要大於報文的平均往返時間。
  • 分組副本:傳送分組後,tcp會保留分組的副本,只有收到分組的確認後才會清除
  • 分組編號:TCP會對每一個分組編號,確認分組和傳送的分組編號對應。

連續ARQ協議

如果TCP每傳送一個分組就要等待的話,勢必會浪費大量的時間,使得網路利用率降低。所以TCP採用了連續ARQ的方式,也就是每次傳送多個分組,然後使用累積確認的方式確認。

  • 累積確認:接收方只對按序到達的最後一個分組傳送確認。

假如傳送方一次性傳送了[1,2,3,4,5]五個分組,接收方只接受到了[1,2,4,5]四個分組。按照按序最後一個的規則,接收方只會傳送 2 號分組的確認。傳送方將收不到後面三個分組的確認,所以會重傳3,4,5。

累積確認使用了滑動視窗實現,它的優點是不需要對每個分組傳送確認,從而減少了網路開銷。缺點是不能向傳送方真實反映收到分組的資訊,比如上面例子裡,傳送方認為 3 號分組以後的都沒有收到,但是接收方其實是收到了4,5號分組的。

以位元組為單位的滑動視窗

IMG_0470(20210912-144940).PNG

傳送方和接收方分別維護 傳送視窗接收視窗 兩個滑動視窗。

傳送視窗維護了三個指標p1、p2、p3,它們劃分了傳送視窗的區域:

  • [p1, p2):等待確認區域,記錄已傳送但沒收到確認的分組。
  • [p2, p3] :可用視窗,允許傳送但是還未傳送的分組。

既然是滑動視窗,那麼它的左右邊界應該是能夠移動的,下面來分析傳送視窗的左右邊界的移動。

p2前移

p2指標指向的是第一個允許傳送但還未傳送的分組,所以p2的前移是傳送方傳送了新的分組。

p1前移

p1指標只有在收到確認後才會移動到被確認分組的下一個分組。

因為採用的累積確認的方式,接收方只會傳送按序到達最後一個分組的確認,所以p1的前移可能不止一個分組。

比如向上圖的情況,假如接收方收到了31,32,33三個分組,它只會傳送按序到達最後分組的確認,也就是33號分組的確認。此時傳送方的p1指標將會直接從31號位置移動到34號位置,也就是收到確認分組的下一個。

p3前移

p3的前移是收到接收方傳送的確認報文視窗欄位控制的。

視窗值表示從確認分組號開始到p3的分組數量。比如確認分組號為101,視窗值為200,那麼p3就會移動到301的位置。

接收方通過視窗值來控制傳送視窗的大小也叫做流量控制,這裡不過多介紹。

TCP快取

TCP既然能夠保留未確認的分組以及按序傳送確認,它肯定需要一個記憶體空間作為快取,而不是直接用應用程式的記憶體。

IMG_0471(20210912-152048).PNG

如圖所示,接收方和傳送方各自維護了一個快取,傳送視窗和接收視窗都在這個快取中。首先TCP快取有以下特點:

  • 因為快取空間和序號有限,TCP快取是迴圈使用的,是一個環形的結構。
  • 滑動視窗只是快取的一部分,已經確認的資料會被刪除。

傳送快取和接收快取結構相同但是作用不同。

傳送快取

  • 快取應用程式讓TCP傳送的資料
  • 暫存已經傳送但未收到確認的資料

接收快取

  • 暫存未按序到達的資料
  • 快取按序到達但沒有被應用程式讀取的資料

總結

  1. TCP可靠傳輸的原理是超時重傳和連續ARQ
  2. 超時重傳時間大於分組平均往返時間
  3. 連續ARQ採用了累積確認的方式傳送確認
  4. TCP通過傳送視窗和接收視窗實現可靠傳輸
  5. 傳送視窗大小受到接收方的視窗值控制
  6. 滑動視窗是TCP快取的一部分,TCP快取是一個環形結構,還負責快取應用程式資料

相關文章