TCP 滑動窗口
TCP 使用滑動窗口做流量控制與亂序重排
RTT 和 RTO
RTT
發(fā)送一個數(shù)據(jù)包到收到對應(yīng)的 ACK,所花費的時間RTO
定時器,重傳時間間隔
沒有回應(yīng) ACK 則等到 RTO 到期進行重傳,根據(jù) RTT 計算出來
TCP 使用滑動窗口做流量控制與亂序重排
- 保證TCP 的可靠性
-
保證TCP 的流量控制特性
Window 字段
window 字段的流量控制:用于接收方通知發(fā)送方自己還有多少緩沖區(qū)可以接收數(shù)據(jù),發(fā)送方根據(jù)接收方的處理能力來發(fā)送數(shù)據(jù),不會導(dǎo)致接收方處理不過來。
滑動窗口機制體現(xiàn)了tcp面向字節(jié)流的設(shè)計
窗口數(shù)據(jù)的計算過程
左右為發(fā)送方接收方緩沖區(qū)

發(fā)送方
LastByteWritten: 發(fā)送方上層應(yīng)用寫出的數(shù)據(jù)長度
LastByteSent: 通過 TCP 最后發(fā)送到接收方的數(shù)據(jù)位置
LastByteAcked: 已經(jīng)收到接收方的連續(xù)最大 ACK 的位置(二次握手)接收方
MaxRcvBuffer: 最大緩沖區(qū)
LastByteRead: 接收方上層應(yīng)用在 TCP 緩沖區(qū)中已經(jīng)讀完的最后一個字節(jié)的位置
NextByteExpected: 收到的連續(xù)最大 Seq 包的位置(排好序可以讀的數(shù)據(jù))
LastByteRcvd: 已收到的最后一個字節(jié)的位置
NextByteExpected 與 LastByteRcvd 之間會有部分空隙表示這些數(shù)據(jù)還無法讀或者應(yīng)用無法讀到。接收方窗口 AdvertisedWindow 接收方還能夠接收的數(shù)據(jù)量
AdvertisedWindow = MaxRcvBuffer – (LastByteRcvd - LastByteRead)
接收方把 AdvertisedWindow 告知發(fā)送方,發(fā)送方 LastByteSent - LastByteAcked 不能大于 AdvertisedWindow 接收方還能接收的量發(fā)送方窗口 EffectiveWindow 發(fā)送方窗口內(nèi)剩余可發(fā)送的大小
EffectiveWindow = AdvertisedWindow - (LastByteSent - LastByteAcked) 保證接收方可以處理數(shù)據(jù)
LastByteSent - LastByteAcked 發(fā)送方可以發(fā)送的數(shù)據(jù)減去已經(jīng)確認好可發(fā)送的數(shù)據(jù)就是發(fā)送方將要發(fā)送的數(shù)據(jù),這個數(shù)據(jù)不能大于接收方還能夠接收的數(shù)據(jù)量。
接收方還能夠接收的數(shù)據(jù)量 AdvertisedWindow = MaxRcvBuffer – (LastByteRcvd - LastByteRead),接收方把 AdvertisedWindow 告知發(fā)送方,發(fā)送方 LastByteSent - LastByteAcked 不能大于 AdvertisedWindow 接收方還能接收的量。
發(fā)送方窗口內(nèi)剩余可發(fā)送的大小 EffectiveWindow = AdvertisedWindow - (LastByteSent - LastByteAcked) 保證接收方可以處理數(shù)據(jù)
滑動窗口基本原理
TCP 發(fā)送方
-
發(fā)送方來看數(shù)據(jù)分為四類
1.得到服務(wù)器確認且已經(jīng)發(fā)送的
2.還沒得到服務(wù)器確認但已經(jīng)發(fā)送的
3.未發(fā)送但服務(wù)器允許發(fā)送的
4.未發(fā)送且因為達到了 window 的大小不允許發(fā)送的數(shù)據(jù)
[2-3]就是發(fā)送方的滑動窗口
-
滑動窗口在被連續(xù)確認后才進行滑動
當 ACK 連續(xù)被確認,比如32-36連續(xù)確認4為后才開始把分類2的數(shù)據(jù)發(fā)送,同時擴大分類3向右的范圍
TCP 接收方
-
接收方緩存內(nèi)三種狀態(tài)
1.已接收并且已經(jīng)發(fā)送 ACK 回執(zhí)的數(shù)據(jù)
2.未接收但可以接收狀態(tài) - 接收窗口 滑動方式一致
3.未接收且不能接收的狀態(tài) - 達到窗口閾值
ACK 直接由 TCP 回復(fù),默認沒有應(yīng)用延遲,不存在已接收未回復(fù) ACK 的狀態(tài)
[2]就是接收窗口
總結(jié)
TCP 最基本的傳輸可靠性來源于確認重傳機制,TCP 的滑動窗口機制也是建立在確認重傳基礎(chǔ)上的。
發(fā)送窗口收到接收端對于本段窗口內(nèi)字節(jié)的 ACK 確認才會移動發(fā)送窗口的左邊界。
接收窗口只有在前面所有的段都確認的情況下才會移動左邊界,當前面還有字節(jié)未接收但收到后面字節(jié)的情況下(亂序)窗口是不會移動的,并不對后續(xù)字節(jié)確認, 確保這段數(shù)據(jù)重傳。
可以根據(jù)滑動窗口的調(diào)整進行流量控制。



