TCP 流量控制-滑動視窗

post200發表於2021-09-09

TCP 滑動視窗

TCP 使用滑動視窗做流量控制與亂序重排

RTT 和 RTO

  • RTT
    傳送一個資料包到收到對應的 ACK所花費的時間

  • RTO
    定時器重傳時間間隔
    沒有回應 ACK 則等到 RTO 到期進行重傳根據 RTT 計算出來

TCP 使用滑動視窗做流量控制與亂序重排

  • 保證TCP 的可靠性
  • 保證TCP 的流量控制特性
    圖片描述
    window 欄位的流量控制用於接收方通知傳送方自己還有多少緩衝區可以接收資料傳送方根據接收方的處理能力來傳送資料不會導致接收方處理不過來。
    滑動視窗機制體現了tcp面向位元組流的設計

視窗資料的計算過程

左右為傳送方接收方緩衝區
圖片描述

  • 傳送方
    LastByteWritten: 傳送方上層應用寫出的資料長度
    LastByteSent: 透過 TCP 最後傳送到接收方的資料位置
    LastByteAcked: 已經收到接收方的連續最大 ACK 的位置(二次握手)

  • 接收方
    MaxRcvBuffer: 最大緩衝區
    LastByteRead: 接收方上層應用在 TCP 緩衝區中已經讀完的最後一個位元組的位置
    NextByteExpected: 收到的連續最大 Seq 包的位置(排好序可以讀的資料)
    LastByteRcvd: 已收到的最後一個位元組的位置
    NextByteExpected 與 LastByteRcvd 之間會有部分空隙表示這些資料還無法讀或者應用無法讀到。

  • 接收方視窗 AdvertisedWindow 接收方還能夠接收的資料量
    AdvertisedWindow = MaxRcvBuffer – (LastByteRcvd - LastByteRead)
    接收方把 AdvertisedWindow 告知傳送方傳送方 LastByteSent - LastByteAcked 不能大於 AdvertisedWindow 接收方還能接收的量

  • 傳送方視窗 EffectiveWindow 傳送方視窗內剩餘可傳送的大小
    EffectiveWindow = AdvertisedWindow - (LastByteSent - LastByteAcked) 保證接收方可以處理資料
    LastByteSent - LastByteAcked 傳送方可以傳送的資料減去已經確認好可傳送的資料就是傳送方將要傳送的資料這個資料不能大於接收方還能夠接收的資料量。

接收方還能夠接收的資料量 AdvertisedWindow = MaxRcvBuffer – (LastByteRcvd - LastByteRead)接收方把 AdvertisedWindow 告知傳送方傳送方 LastByteSent - LastByteAcked 不能大於 AdvertisedWindow 接收方還能接收的量。
傳送方視窗內剩餘可傳送的大小 EffectiveWindow = AdvertisedWindow - (LastByteSent - LastByteAcked) 保證接收方可以處理資料

滑動視窗基本原理

TCP 傳送方

  • 傳送方來看資料分為四類
    1.得到伺服器確認且已經傳送的
    2.還沒得到伺服器確認但已經傳送的
    3.未傳送但伺服器允許傳送的
    4.未傳送且因為達到了 window 的大小不允許傳送的資料
    [2-3]就是傳送方的滑動視窗
    圖片描述
  • 滑動視窗在被連續確認後才進行滑動
    當 ACK 連續被確認比如32-36連續確認4為後才開始把分類2的資料傳送同時擴大分類3向右的範圍
    圖片描述

TCP 接收方

  • 接收方快取內三種狀態
    1.已接收並且已經傳送 ACK 回執的資料
    2.未接收但可以接收狀態 - 接收視窗 滑動方式一致
    3.未接收且不能接收的狀態 - 達到視窗閾值
    ACK 直接由 TCP 回覆預設沒有應用延遲不存在已接收未回覆 ACK 的狀態
    [2]就是接收視窗
    圖片描述

總結

TCP 最基本的傳輸可靠性來源於確認重傳機制TCP 的滑動視窗機制也是建立在確認重傳基礎上的。
傳送視窗收到接收端對於本段視窗內位元組的 ACK 確認才會移動傳送視窗的左邊界。
接收視窗只有在前面所有的段都確認的情況下才會移動左邊界當前面還有位元組未接收但收到後面位元組的情況下(亂序)視窗是不會移動的並不對後續位元組確認, 確保這段資料重傳。
可以根據滑動視窗的調整進行流量控制。

  • 參考

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2249/viewspace-2822950/,如需轉載,請註明出處,否則將追究法律責任。

相關文章