TCP協議的滑動窗口具體是怎樣控制流量的


首先明確:

1)TCP滑動窗口分為接受窗口,發送窗口
滑動窗口協議是傳輸層進行流控的一種措施,接收方通過通告發送方自己的窗口大小,從而控制發送方的發送速度,從而達到防止發送方發送速度過快而導致自己被淹沒的目的。

對ACK的再認識,ack通常被理解為收到數據后給出的一個確認ACK,ACK包含兩個非常重要的信息:
一是期望接收到的下一字節的序號n,該n代表接收方已經接收到了前n-1字節數據,此時如果接收方收到第n+1字節數據而不是第n字節數據,接收方是不會發送序號為n+2的ACK的。舉個例子,假如接收端收到1-1024字節,它會發送一個確認號為1025的ACK,但是接下來收到的是2049-3072,它是不會發送確認號為3072的ACK,而依舊發送1025的ACK。

二是當前的窗口大小m,如此發送方在接收到ACK包含的這兩個數據后就可以計算出還可以發送多少字節的數據給對方,假定當前發送方已發送到第x字節,則可以發送的字節數就是y=m-(x-n).這就是滑動窗口控制流量的基本原理

重點:發送方根據收到ACK當中的期望收到的下一個字節的序號n以及窗口m,還有當前已經發送的字節序號x,算出還可以發送的字節數。

發送端窗口的第一個字節序號一定是ACK中期望收到的下一個字節序號,比如下圖:

 

 
上圖52 53 54 55 字節都是可以新發送的字節序


接受端窗口的第一個字節序之前一定是已經完全接收的,后面窗口里面的數據都是希望接受的,窗口后面的數據都是不希望接受的。


TCP的滑動窗口分為接收窗口和發送窗口
不分析這兩種窗口就討論是不妥當的。

TCP的滑動窗口主要有兩個作用,一是提供TCP的可靠性,二是提供TCP的流控特性。同時滑動窗口機制還體現了TCP面向字節流的設計思路。TCP 段中窗口的相關字段。

 

TCP的Window是一個16bit位字段,它代表的是窗口的字節容量,也就是TCP的標准窗口最大為2^16-1=65535個字節。

另外在TCP的選項字段中還包含了一個TCP窗口擴大因子,option-kind為3,option-length為3個字節,option-data取值范圍0-14。窗口擴大因子用來擴大TCP窗口,可把原來16bit的窗口,擴大為31bit。

滑動窗口基本原理

1)對於TCP會話的發送方,任何時候在其發送緩存內的數據都可以分為4類,“已經發送並得到對端ACK的”,“已經發送但還未收到對端ACK的”,“未發送但對端允許發送的”,“未發送且對端不允許發送”。“已經發送但還未收到對端ACK的”和“未發送但對端允許發送的”這兩部分數據稱之為發送窗口。

 

當收到接收方新的ACK對於發送窗口中后續字節的確認是,窗口滑動,滑動原理如下圖。

當收到ACK=36時窗口滑動。

2)對於TCP的接收方,在某一時刻在它的接收緩存內存在3種。“已接收”,“未接收准備接收”,“未接收並未准備接收”(由於ACK直接由TCP協議棧回復,默認無應用延遲,不存在“已接收未回復ACK”)。其中“未接收准備接收”稱之為接收窗口。

發送窗口與接收窗口關系

TCP是雙工的協議,會話的雙方都可以同時接收、發送數據。TCP會話的雙方都各自維護一個“發送窗口”和一個“接收窗口”。其中各自的“接收窗口”大小取決於應用、系統、硬件的限制(TCP傳輸速率不能大於應用的數據處理速率)。各自的“發送窗口”則要求取決於對端通告的“接收窗口”,要求相同。

 


滑動窗口實現面向流的可靠性

1)最基本的傳輸可靠性來源於“確認重傳”機制。

2)TCP的滑動窗口的可靠性也是建立在“確認重傳”基礎上的。

3)發送窗口只有收到對端對於本段發送窗口內字節的ACK確認,才會移動發送窗口的左邊界。

4)接收窗口只有在前面所有的段都確認的情況下才會移動左邊界。當在前面還有字節未接收但收到后面字節的情況下,窗口不會移動,並不對后續字節確認。以此確保對端會對這些數據重傳。


滑動窗口的流控特性

TCP的滑動窗口是動態的,我們可以想象成小學常見的一個數學題,一個水池,體積V,每小時進水量V1,出水量V2。當水池滿了就不允許再注入了,如果有個液壓系統控制水池大小,那么就可以控制水的注入速率和量。這樣的水池就類似TCP的窗口。應用根據自身的處理能力變化,通過本端TCP接收窗口大小控制來對對對端的發送窗口流量限制。

應用程序在需要(如內存不足)時,通過API通知TCP協議棧縮小TCP的接收窗口。然后TCP協議棧在下個段發送時包含新的窗口大小通知給對端,對端按通知的窗口來改變發送窗口,以此達到減緩發送速率的目的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM