TCP 流量控制-滑動視窗
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- TCP的滑動視窗和擁塞控制TCP
- TCP 重傳、滑動窗⼝、流量控制、擁塞控制TCP
- Sentinel 原理-滑動視窗
- 細聊滑動視窗
- 滑動視窗演算法演算法
- 一篇帶你讀懂TCP之“滑動視窗”協議TCP協議
- 滑動視窗演算法思路演算法
- Sentinel滑動視窗演算法演算法
- 滑動視窗分析SQL實踐SQL
- 滑動視窗問題總結
- 滑動視窗與雙指標指標
- Flink的滾動視窗、會話視窗、滑動視窗及其應用會話
- mysql視窗函式中的滑動視窗MySql函式
- 自己實現一個滑動視窗
- 力扣刷題-滑動視窗(字串)力扣字串
- TCP流量控制TCP
- WeetCode2滑動視窗系列
- 滑動視窗法——Leetcode例題LeetCode
- 239. 滑動視窗最大值
- Hive實戰—時間滑動視窗計算Hive
- 氣球遊戲騰訊面試題滑動視窗解法遊戲面試題
- 【演算法】滑動視窗三步走演算法
- 滑動視窗最大值的golang實現Golang
- 滑動視窗相關的題目總結
- 滑動視窗(Sliding Window)技巧總結
- 滑動視窗法——子串相關問題
- [Python手撕]滑動視窗最大值Python
- TCP的流量控制TCP
- TCP流量控制、擁塞控制TCP
- 騰訊面試題-求滑動視窗的最大值面試題
- 使用 Redis 實現限流——滑動視窗演算法Redis演算法
- 演算法~利用zset實現滑動視窗限流演算法
- 對滑動視窗單調性的一點思考
- 滑動視窗演算法(Sliding Window Algorithm)演算法Go
- 「LeetCode Top100」之滑動視窗LeetCode
- TCP流量控制和擁塞控制TCP
- 滑動視窗(Sliding Window)演算法介紹演算法
- Golang的滑動視窗計數器Redis限速實現GolangRedis