[轉]網絡基本功11-TCP窗口調整與流控

[轉]網絡基本功11-TCP窗口調整與流控

本文由Zhang_Jiawen發表於Dell Technology"網絡基本功"

如有侵犯版權,還請這位頭像萌萌的大姐姐前輩聯繫我商討刪帖,道歉,賠償,下跪等事宜.

前文已經介紹過了TCP滑動窗口大小的重要性。在客戶端與服務器的連接中,客戶端告知服務器它一次希望從服務器接收多少字節數據,這是客戶端的接收窗口,即服務器的發送窗口。類似地,服務器告知客戶端一次希望從客戶端接收多少字節數據,也就是服務器的接收窗口和客戶端的發送窗口。

要理解爲什麼窗口大小會產生波動,首先需要理解它的含義。最簡單的方式是它代表了設備對於特定連接的接收緩存大小。即,窗口大小代表一個設備一次能夠從對端處理多少數據,之後再傳遞給應用層處理。

當服務器從客戶端接收數據,它就將數據放在緩存中,服務器必須對數據做以下兩步操作:

  • **確認:**服務器必須將確認信息發回客戶端以表明數據接收。
  • **傳輸:**服務器必須處理數據,將它傳遞給目標應用程序處理。

區分開這兩件事情是非常重要的。關鍵在於基本的滑動窗口機制中,數據於接收時確認,但並不一定立即從緩存中傳輸出去。也就意味着當接收數據速度快於接收TCP處理速度時,緩存有可能被填滿。當這一情況發生時,接收設備需要調整窗口大小已防止緩存過載。

由於窗口大小能夠以這種方式管理連接兩端設備數據流的速率,TCP就是以這種方式實現流控這一傳輸層非常典型的任務。流控對於TCP來說是很重要的,因爲它是設備間互通狀態的方式。通過增加或縮小窗口大小,服務器和客戶端能夠確保對端發送數據的速度等同於處理速度。

減小窗口大小以降低發送速率

首先看一下客戶端到服務器的數據傳輸,如下圖所示。

客戶端傳輸140字節數據至服務器。之後,客戶端的可用窗口還剩下220字節:發送窗口的360字節減去發送的140字節。

一段時間過後,服務器接收到140字節並將它們放在緩存中。現在,理想的情況下,140字節進入緩存,確認之後立刻從緩存移出。也就是說,緩存有足夠的大小來容納客戶端發送的所有數據。緩存的空閒空間維持在360字節,因此告知客戶端窗口大小保持不變。

只要服務器處理速度和數據進入速度相同,窗口大小就會保持在360字節。客戶端在接收到140字節的確認信息以及窗口大小保持不變的信息之後,將360字節窗口向右移動140字節。由於現在未確認字節數爲0,因此客戶端又可以發送360字節數據。對應於之前可用窗口的220字節,加上剛剛確認的140字節數據。

然而,現實中服務器可能需要處理數十,數百乃至數千個TCP連接。TCP可能無法立刻處理數據,或應用應用程序本身無法接收140字節數據。任何一種情況下,服務器TCP都無法立刻將140字節從緩存中移出。這時,除了發回確認信息給客戶端以外,服務器會想要告知客戶端更改窗口大小,以表示緩存已經被部分寫入了。

假設我們接收到140字節,但只能發送40字節給應用程序,緩存中剩下100字節。當發送140字節的確認信息,服務器將發送窗口縮小100字節,至260字節。當客戶端從服務器接收到這一片段,它將會看到140字節的確認信息並將窗口向右滑動140字節。在滑動過程中,將大小縮減至260字節。可以認爲將窗口左端滑動140字節,但右端僅滑動40字節。新的稍小一些的窗口保證服務器從客戶端接收最多260字節數據,以適應接收緩存中的剩餘空間,如下圖的1-3步所示。

縮減發送窗口以停止發送新數據

如果服務器無法接收任何新數據會怎麼樣呢?假設客戶端下一次傳輸180字節,但是服務器太忙碌而無法對其進行處理。這種情況下,服務器將這180字節緩存下來,並且在確認信息中,將窗口大小從260字節縮減爲80字節。當客戶端接收到180字節的確認信息,它也會看到窗口縮減了180字節,它會滑動與縮減同樣的大小,告知服務器:我確認接收180字節數據,但不允許你再發送新的數據。也可以看作窗口左端滑動180字節,但右端維持不動。只要右端不移動,客戶端就無法發送更多數據。這一過程顯示在上圖的4-6中。

關閉發送窗口

窗口調整可以通過雙方設備來完成。如果服務器從客戶端接收的數據持續快於推送給應用的速率,則服務器將會繼續減小接收窗口。假設發送窗口減小至80字節,客戶端發送第三個請求,長度爲80字節,但服務器仍處於繁忙狀態。之後服務器將窗口減小爲0,也稱爲關閉窗口。這一信息告知客戶端服務器已經過載,它需要徹底停止發送數據,如上圖最後一步所示。之後,當服務器負載減輕時,可以再次增加這一連接的窗口,允許更多數據傳輸。

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