TCP可靠傳輸原理


停止等待協議

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

超時重傳

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

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緩存是一個環形結構,還負責緩存應用程序數據


免責聲明!

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



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