TCP-IP詳解:糊塗窗口綜合症(Silly Window syndrome)

參考教材:TCP/IP詳解,卷1:協議    TCP-IP Guide


主要介紹再接收端和發送端速率不匹配的狀況下,TCP協議棧滑動窗口動態調整機制產生的一種問題 叫糊塗窗口綜合症,有關滑動窗口的知識可以參考文章TCP-IP詳解:滑動窗口(Sliding Window)


原因

這個問題可以歸結爲小包的問題,就是由於發送端和接收端上的處理不一致,導致網絡上產生很多的小包,之前也介紹過避免網絡上產生過多小包的措施,比如Nagle算法。在滑動窗口機制下,如果發送端和接收端速率很不一致,也會產生這種比較犯傻的狀態:發送方發送的數據,只要一個大大的頭部,攜帶數據很少。

對於接收端來講,如果接收很慢,一次接收1個字節或者幾個字節,這個時候接收端 緩衝區很快就會被填滿,然後窗口通告爲0字節,這個時候發送端停止發送,應用程序收上去1個字節後,發出窗口通告爲1字節,發送方收到通告之後,發出1個字節的數據,這樣週而復始,傳輸效率會非常低。

同時如果發送端程序一次發送一個字節,雖然窗口足夠大,但是發送仍是一個字節一個字節的傳輸,效率很低


解決措施

其實我們現在比較少減少這種情況了,因爲TCP協議棧已經做出了一些優化,通過一些之前的數據我們來看下,TCP協議棧做出的有些優化措施

對於接收端的優化

1. 接收端,窗口爲0時,應用程序有收上去數據,但是並不立即會送窗口爲1的通告,而是等待窗口大小滿足一定的條件之後【能夠接收一個最大報文,或者緩衝區的一半】,再來發送窗口通告,這樣就不會產生小報文。

[Note:此處TCP-IP Guide書中有一種說法,如果一個窗口低於一半的Window Size,或者不夠一個MSS,就直接通告窗口爲0,不過此處下面的測試看,並沒有按照這個原則,給出了一個384的窗口,可能會有優化,有待於確認]

如下圖,通告0窗口之後,下一次窗口update就變成2048了, 其實這樣並沒有降低傳輸的效率,只是將不斷的發送小包換成發送大包而已。


2. Delay ACK,這個機制可以參考前面的文章,接收端不立即回,是否有數據回覆進行捎帶ACK,這個也能降低ACK的數量

3. 累計ACK,並不是每一個數據都回復ACK,可以多個數據段一起回覆ACK

對於發送端的優化

解決發送端發送小包的問題,之前我們也有討論過,TCP提供了Nagle算法

1. 對於從應用程序中接收到的第一塊數據【沒有任何等待ACK的包】,立即發送,一個字節的數據也需要發送出去

2. 對於後面的數據,協議棧會進行累計並等待,或者收到一個接收端發出一個ACK,或者累計到一個最大報文段,然後再發送數據

除了Nagle算法發送端還可以通過1個字節的數據來探測Windowsize的變化。

參考文章


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