1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        滑動(dòng)窗口協(xié)議這樣理解更簡單

        共 2868字,需瀏覽 6分鐘

         ·

        2022-04-15 21:18

        引言

        想象一下這個(gè)場(chǎng)景:主機(jī) A 一直向主機(jī) B 發(fā)送數(shù)據(jù),不考慮主機(jī) B 的接收能力,則可能導(dǎo)致主機(jī) B 的接收緩沖區(qū)滿了而無法再接收數(shù)據(jù),從而導(dǎo)致大量的數(shù)據(jù)丟包,引發(fā)重傳機(jī)制。而在重傳的過程中,若主機(jī) B 的接收緩沖區(qū)情況仍未好轉(zhuǎn),則會(huì)將大量的時(shí)間浪費(fèi)在重傳數(shù)據(jù)上,降低傳送數(shù)據(jù)的效率。

        所以引入了流量控制機(jī)制,主機(jī) B 通過告訴主機(jī) A 自己接收緩沖區(qū)的大小,來使主機(jī) A 控制發(fā)送的數(shù)據(jù)量。總結(jié)來說:所謂流量控制就是控制發(fā)送方發(fā)送速率,保證接收方來得及接收。

        TCP 實(shí)現(xiàn)流量控制主要就是通過 滑動(dòng)窗口協(xié)議。

        對(duì)于發(fā)送方來說,窗口大小就是指無需等待確認(rèn)應(yīng)答,可以連續(xù)發(fā)送數(shù)據(jù)的最大值。


        窗口大小具體由誰來設(shè)定呢?

        窗口大小和 TCP 報(bào)文首部中 16 位的 窗口大小 Window 字段有關(guān):

        TCP 報(bào)文段首部

        該字段的含義是指自己接收緩沖區(qū)的剩余大小,于是發(fā)送端就可以根據(jù)這個(gè)接收端的處理能力來發(fā)送數(shù)據(jù),而不會(huì)導(dǎo)致接收端處理不過來。

        所以,通常來說窗口大小是由接收方來決定的

        滑動(dòng)窗口詳解

        說了半天,窗口其實(shí)就是操作系統(tǒng)開辟的一個(gè)緩沖區(qū)

        發(fā)送方在收到確認(rèn)應(yīng)答報(bào)文之前,必須在緩沖區(qū)中保留已發(fā)送的報(bào)文段(因?yàn)閳?bào)文段可能在網(wǎng)絡(luò)中丟失,所以必須把這些未確認(rèn)的報(bào)文段保留這,以便必要時(shí)重傳);如果在規(guī)定時(shí)間間隔內(nèi)收到接收方發(fā)來的確認(rèn)應(yīng)答報(bào)文,就可以將這些報(bào)文段從緩沖區(qū)中清除。

        站在發(fā)送方的角度,滑動(dòng)窗口可以分為四個(gè)部分:

        1. 已發(fā)送且已確認(rèn),這部分已經(jīng)發(fā)送完畢,可以忽略;
        2. 已發(fā)送但未確認(rèn),這部分可能在網(wǎng)絡(luò)中丟失,數(shù)據(jù)必須保留以便必要時(shí)重傳;
        3. 未發(fā)送但可發(fā)送,這部分接收方緩沖區(qū)還有空間保存,可以發(fā)出去;
        4. 未發(fā)送且暫不可發(fā)送,這部分已超出接收方緩沖區(qū)存儲(chǔ)空間,就算發(fā)出去也沒意義;

        第 2 和第 3 部分加起來就剛好就是接收方窗口(緩沖區(qū))大小,它規(guī)定了當(dāng)前發(fā)送方能發(fā)送的最大數(shù)據(jù)量。

        當(dāng)發(fā)送方收到接收方發(fā)來的確認(rèn)應(yīng)答后,就將緩沖區(qū)中那些被確認(rèn)的報(bào)文清除出去,然后窗口向右移動(dòng),如下圖所示:

        隨著雙方通信的進(jìn)行,窗口將不斷向右移動(dòng),因此被形象地稱為滑動(dòng)窗口(Sliding Window)


        對(duì)于 TCP 的接收方,窗口稍微簡單點(diǎn),分為三個(gè)部分:

        1. 已接收
        2. 未接收準(zhǔn)備接收 (也即接收窗口,再強(qiáng)調(diào)一遍,接收窗口的大小決定發(fā)送窗口的大小,或者說,決定緩沖區(qū)的大小。)
        3. 未接收并未準(zhǔn)備接收

        由于 ACK 直接由 TCP 協(xié)議?;貜?fù),默認(rèn)無應(yīng)用延遲,不存在 “已接收未回復(fù) ACK”


        綜上,舉個(gè)例子,假設(shè)發(fā)送方需要發(fā)送的數(shù)據(jù)總長度為 400 字節(jié),分成 4 個(gè)報(bào)文段,每個(gè)報(bào)文段長度是 100 字節(jié):

        1)三次握手連接建立時(shí)接收方告訴發(fā)送方,我的接收窗口大小(rwnd) 是 300 字節(jié)

        此時(shí)的接收方滑動(dòng)窗口如下:

        接收方滑動(dòng)窗口

        此時(shí)的發(fā)送方滑動(dòng)窗口如下:

        發(fā)送方滑動(dòng)窗口

        2)發(fā)送方發(fā)送第一個(gè)報(bào)文段(序號(hào) 1 - 100),還能再發(fā)送 200 個(gè)字節(jié)

        3)發(fā)送方發(fā)送第二個(gè)報(bào)文段(序號(hào) 101 - 200),還能再發(fā)送 100 個(gè)字節(jié)

        4)發(fā)送方發(fā)送第三個(gè)報(bào)文段(序號(hào) 201 - 300),還能再發(fā)送 0 個(gè)字節(jié)

        此時(shí),發(fā)送方的窗口(緩沖區(qū))中存了三個(gè)報(bào)文段了

        此時(shí)的發(fā)送方滑動(dòng)窗口如下:

        發(fā)送方滑動(dòng)窗口

        5)接收方接收到了第一個(gè)報(bào)文段和第三個(gè)報(bào)文段,中間第二個(gè)報(bào)文段丟失。此時(shí)接收方返回一個(gè)報(bào)文段 ack = 101, rwnd = 200(假設(shè)這里發(fā)生流量控制,把窗口大小降到了 200,允許發(fā)送方繼續(xù)發(fā)送起始序號(hào)為 101,長度為 200 的報(bào)文)

        此時(shí)的接收方滑動(dòng)窗口如下(本來窗口右端應(yīng)該右移,但是這里發(fā)生了流量控制,接收方希望縮小窗口大小,所以正好,這里就不需要向右擴(kuò)展了):

        接收方滑動(dòng)窗口

        發(fā)送方收到了第一個(gè)報(bào)文段的確認(rèn),從窗口(緩沖區(qū))中移除掉第一個(gè)報(bào)文段

        此時(shí)的發(fā)送方滑動(dòng)窗口如下:

        發(fā)送方滑動(dòng)窗口

        6)發(fā)送方一直沒有收到第二個(gè)報(bào)文段的確認(rèn)應(yīng)答,在等待超時(shí)后重傳第二個(gè)報(bào)文段(序號(hào) 101 - 200)

        7)接收方成功收到第二個(gè)報(bào)文段(緩沖區(qū)中有第二個(gè)和第三個(gè)報(bào)文段了),于是向發(fā)送方返回一個(gè)報(bào)文段 ack = 301, rwnd = 100(假設(shè)這里發(fā)生流量控制,把窗口大小降到了 100)

        此時(shí)的接收方滑動(dòng)窗口如下:(本來窗口右端應(yīng)該右移,但是這里發(fā)生了流量控制,接收方希望縮小窗口大小,所以正好,這里就不需要向右擴(kuò)展了)

        接收方滑動(dòng)窗口

        發(fā)送方收到了第二個(gè)和第三個(gè)報(bào)文段的確認(rèn),從窗口(緩沖區(qū))中移除掉這倆報(bào)文段

        8)發(fā)送方發(fā)送第四個(gè)報(bào)文段(序號(hào) 301 - 400)

        此時(shí)的發(fā)送方滑動(dòng)窗口如下:

        發(fā)送方滑動(dòng)窗口

        通俗的例子

        下面來更通俗地解釋下滑動(dòng)窗口,看下面這個(gè)場(chǎng)景,老師說一段話,學(xué)生來記

        最原始的模式,一股腦把所有的報(bào)文段全都發(fā)出去。

        老師說 "危樓高百尺,手可摘星辰,不敢高聲語,恐驚天上人"(咱把每個(gè)字看成一個(gè)報(bào)文段,總共 20 個(gè)報(bào)文段)

        學(xué)生寫道"危樓高百尺,手可......."

        上面的模式過于簡單粗暴,發(fā)送方發(fā)送速度太快,接收方跟不上,并且重傳成本過高。

        于是他們換了一種模式:每發(fā)送一個(gè)報(bào)文段就等待確認(rèn)一個(gè)報(bào)文段,收到確認(rèn)后才能發(fā)送下一個(gè)

        老師說 "危",學(xué)生說"確認(rèn)"

        老師說 "樓",學(xué)生說"確認(rèn)"

        老師說 "高",學(xué)生說"高"

        .........

        上面的模式每發(fā)一個(gè)報(bào)文段,必須等到確認(rèn)后才能再次發(fā)送,效率低下。

        于是他們又換了一種模式:累積確認(rèn),既不是一股腦把所有的報(bào)文段全都發(fā)出去,也不是一次只發(fā)一個(gè)報(bào)文段,而是分組發(fā)送,每次發(fā)幾個(gè)報(bào)文段。

        老師說 "危樓高百尺" (5 個(gè)報(bào)文段),學(xué)生說 "確認(rèn)"

        老師說 "手可摘星辰",學(xué)生說 "手可..."(3 個(gè)報(bào)文段丟失)

        老師說 "不敢高聲語",學(xué)生說 "確認(rèn)"

        老師一直沒有收到 "摘星辰" 的確認(rèn),于是重新說了一遍 "摘星辰",學(xué)生說 "確認(rèn)"

        老師說 "恐驚天上人",學(xué)生說 "確認(rèn)"

        上面的模式提高了效率,連續(xù)多個(gè)報(bào)文段一起進(jìn)行發(fā)送, 但是到底該怎么決定多少個(gè)報(bào)文段一起發(fā)送呢呢?

        于是他們?cè)谏厦婺J降幕A(chǔ)上,做出了一些改進(jìn):滑動(dòng)窗口,接收方認(rèn)為狀態(tài)好(窗口比較大)的時(shí)候, 讓發(fā)送方每次多發(fā)一點(diǎn);接收方認(rèn)為狀態(tài)不好(窗口比較?。┑臅r(shí)候,讓發(fā)送方每次少發(fā)送一點(diǎn),起到一個(gè)流量控制的作用,限制發(fā)送方的速度。

        學(xué)生告訴老師,我一次性可以接收 10 個(gè)報(bào)文段

        老師說 "危樓高百尺,手可摘星辰",學(xué)生說 "危樓高百尺,手可..."(3 個(gè)報(bào)文段丟失,返回 ”可" 的確認(rèn)應(yīng)答,一共確認(rèn)了 7 個(gè)報(bào)文段,老師的可用窗口右移,窗口中現(xiàn)在還有 “摘星辰” 3 個(gè)報(bào)文段)

        學(xué)生說,我狀態(tài)不行,一次性現(xiàn)在只能接收 5 個(gè)報(bào)文段(流量控制,縮小窗口)

        老師說 "不敢"(窗口中還有 “摘星辰” 3 個(gè)報(bào)文段,所以只能發(fā)送 2 個(gè)),學(xué)生說 "確認(rèn)"

        老師一直沒有收到 "摘星辰" 的確認(rèn),于是重新說了一遍,學(xué)生說 "確認(rèn)"

        (可用窗口恢復(fù)為 5 個(gè))老師說 "恐驚天上人",......


        心之所向,素履以往,我是小牛肉,小伙伴們下篇文章再見 ??

        瀏覽 90
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            广东少妇大战黑人34厘米视频 | 亚洲视频在线视频 | 啊啊啊好痛轻点 | 将军猛烈顶弄双性世子h生子 | 搞基网站免费 | 欧美日韩亚洲另类 | 中文字幕成人电影 | 王雨纯裸体 | 亚洲无码网站 | 黄污视频免费观看 |