TCP 滑動窗口原理

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)整進行流量控制。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容