停止等待協議
“停止等待”就是傳送方在傳送完一個分組後停止傳送,等待接收方的確認後再繼續傳送。
超時重傳
傳送方在等待一定時間後如果還沒有收到接收方的確認,此時傳送方將認定分組沒有送達,從而重新傳送分組。
TCP通過以下的方式實現超時重傳:
- 超時計時器:每傳送完一個分組後,tcp都會設定一個超時計時器。超時計時器的超時時間往往要大於報文的平均往返時間。
- 分組副本:傳送分組後,tcp會保留分組的副本,只有收到分組的確認後才會清除
- 分組編號:TCP會對每一個分組編號,確認分組和傳送的分組編號對應。
連續ARQ協議
如果TCP每傳送一個分組就要等待的話,勢必會浪費大量的時間,使得網路利用率降低。所以TCP採用了連續ARQ的方式,也就是每次傳送多個分組,然後使用累積確認的方式確認。
- 累積確認:接收方只對按序到達的最後一個分組傳送確認。
假如傳送方一次性傳送了[1,2,3,4,5]五個分組,接收方只接受到了[1,2,4,5]四個分組。按照按序最後一個的規則,接收方只會傳送 2 號分組的確認。傳送方將收不到後面三個分組的確認,所以會重傳3,4,5。
累積確認使用了滑動視窗實現,它的優點是不需要對每個分組傳送確認,從而減少了網路開銷。缺點是不能向傳送方真實反映收到分組的資訊,比如上面例子裡,傳送方認為 3 號分組以後的都沒有收到,但是接收方其實是收到了4,5號分組的。
以位元組為單位的滑動視窗
傳送方和接收方分別維護 傳送視窗 和 接收視窗 兩個滑動視窗。
傳送視窗維護了三個指標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既然能夠保留未確認的分組以及按序傳送確認,它肯定需要一個記憶體空間作為快取,而不是直接用應用程式的記憶體。
如圖所示,接收方和傳送方各自維護了一個快取,傳送視窗和接收視窗都在這個快取中。首先TCP快取有以下特點:
- 因為快取空間和序號有限,TCP快取是迴圈使用的,是一個環形的結構。
- 滑動視窗只是快取的一部分,已經確認的資料會被刪除。
傳送快取和接收快取結構相同但是作用不同。
傳送快取
- 快取應用程式讓TCP傳送的資料
- 暫存已經傳送但未收到確認的資料
接收快取
- 暫存未按序到達的資料
- 快取按序到達但沒有被應用程式讀取的資料
總結
- TCP可靠傳輸的原理是超時重傳和連續ARQ
- 超時重傳時間大於分組平均往返時間
- 連續ARQ採用了累積確認的方式傳送確認
- TCP通過傳送視窗和接收視窗實現可靠傳輸
- 傳送視窗大小受到接收方的視窗值控制
- 滑動視窗是TCP快取的一部分,TCP快取是一個環形結構,還負責快取應用程式資料