TCP協議中的窗口機制------滑動窗口詳解

一、窗口機制的分類

在TCP協議當中窗口機制分爲兩種:

1.固定的窗口大小

2.滑動窗口

二、固定窗口存在的問題

如下圖所示:


我們假設這個固定窗口的大小爲1,也就是每次只能發送一個數據,只有接收方對這個數據進行了確認後才能發送第二個數據。在圖中我們可以看到,發送方每發送一個數據接收方就要給發送方一個ACK對這個數據進行確認。只有接收了這個確認數據以後發送方纔能傳輸下個數據。


存在的問題:如果窗口過小,當傳輸比較大的數據的時候需要不停的對數據進行確認,這個時候就會造成很大的延遲。

                    如果窗口過大,我們假設發送方一次發送100個數據,但接收方只能處理50個數據,這樣每次都只對這50個數據進行確認。發送方下一次還是發送100個數據,但接受方還是隻能處理50個數據。這樣就避免了不必要的數據來擁塞我們的鏈路。


因此,我們引入了滑動窗口

二、滑動窗口(以字節爲單位)

1.概述

    滑動窗口通俗來講就是一種流量控制技術。

    它本質上是描述接收方的TCP數據報緩衝區大小的數據,發送方根據這個數據來計算自己最多能發送多長的數據,如果發送方收到接收方的窗口大小爲0的TCP數據報,那麼發送方將停止發送數據,等到接收方發送窗口大小不爲0的數據報的到來

2.工作原理


第一次發送數據這個時候的窗口大小是根據鏈路帶寬的大小來決定的。

假設這時候的窗口是3.這個時候接收方收到數據以後會對數據進行確認告訴哦發送方我下次希望收到的數據是多少。

在上圖中:我們看到接收方發送的ACK = 3(這是對發送方發送序列2的回答確認,下一次接收方期望接收到的是3序列信號),這個時候發送方收到這個數據以後就知道我第一次發送的3個數據對方只收到了兩個,就知道第三個數據對方沒有收到,下次返送的時候就從第3個數據開始發。這時候窗口大小就變爲了2.

如下圖所示:


看到接收方發送的ACK是5就表示他下一次希望收到的數據是5,發送方就知道我剛纔發送的2個數據對方收到了,這個時候開始發送第5個數據。


*****當鏈路變好或者變差,這個窗口還會發生變化,並不是第一次協商好了以後就永遠不會變化了。

3.死鎖狀態

(1)概述:

    當接收端向發送端發送零窗口報文段後不久,接收端的接收緩存又有了一些存儲空間,於是接收端向發送端發送了Windows size = 2的報文段,然而這個報文段在傳輸過程中丟失了。發送端一直等待收到接收端發送的非零窗口的通知,而接收端一直等待發送端發送數據,這樣就死鎖了。

(2)解決方法

    TCP爲每個連接設有一個持續計時器。只要TCP連接的一方收到對方的零窗口通知,就啓動持續計時器,若持續計時器設置的時間到期,就發送一個零窗口探測報文段(僅攜帶1字節的數據),而對方就在確認這個探測報文段時給出了現在的窗口值。

4.TCP報文段的發送時機(傳輸效率問題)

可以用以下三種不同的機制控制TCP報文段的發送時機:

(1)TCP維持一個變量MSS,等於最大報文段的長度。只要緩衝區存放的數據達到MSS字節時,就組裝成了一個TCP報文段發送出去

(2)由發送方的應用進程指明要發送的報文段,即:TCP支持推送操作

(3)發送方的一個計時器期限到了,這時就把當前已有的緩存數據裝入報文段(但長度不能超過MSS)發送出去。

5.Nagle算法(控制TCP報文段的發送時機)

(1)主旨:避免大量發送小包

(2)初衷:避免發送大量的小包,防止小包氾濫於網絡,在理想情況下,對於一個TCP連接而言,網絡上每次只能有一個小包存在。它更多的是端到端意義上的優化

【CORK算法:提高網絡利用率,理想情況下,完全避免發送小包,僅僅發送滿包以及不得不發的小包】

    發送方將第一個數據字節發送出去,把後面到達的數據字節緩存起來。當發送方接收對第一個數據字符的確認後,再把發送緩存中的所有數據組裝成一個報文段再發送出去,同時繼續對隨後到達的數據進行緩存。只有在收到對前一個報文段的確認之後,才繼續發送下一個報文段。規定一個TCP連接最多只能有一個未被確認的未完成的小分組,在該分組的確認到達之前不能發送其它的小分組。當數據到達較快而網絡速率較慢時,用這樣的方法可以明顯的減少所用的網絡帶寬。

    Nagle算法還規定:當達到的數據已經達到發送窗口大小的一半或者已經達到報文段的最大長度時,就可以立即發送一個報文段。

6.糊塗窗口綜合症(接收端糊塗,網絡上小包氾濫的原因之一)

(1)概述:

        TCP接收方的緩存已滿,而交互式的應用進程一次只從接收緩存區中讀取1字節(這樣就使接收緩存空間僅騰出1字節),然後向發送方發送確認,並把窗口設置爲1個字節(但發送的數據報爲40字節的話),然後,發送方又發來1字節的數據(發送方的IP數據報是41字節),接收方發回確認,仍將窗口設置爲1個字節,這樣,網絡效率就會很低

(2)解決辦法

        a.你糊塗我不糊塗法。即Nagle算法。

         可讓接收方等待一段時間,使得或者  接收緩存已有足夠的空間容納一個  最長的報文段,或者等到接收方緩存已有一半的空閒空間。只要出現這兩種情況,接收方就發回確認報文,並向發送方通知當前的窗口大小。此外,發送方也不要發送太小的報文段,而是把數據報文積累爲足夠大的報文段或達到接收方緩存的空間的一半大小。

            b.治療接收端的糊塗(其中一種機制是延遲ACK(還有其它機制,例如不發送小窗口通告等))

               對於接收方而言, 延遲ACK可以拖延ACK發送時間,進而延遲窗口通告,在這段時間內,接收窗口有機會進一步放大

               對於發送方而言, 不理會接收端的小窗口通告等於說不馬上1發送小包,小包有時間積累成大包



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章