傳輸層
TCP 流量控制(TCP flow control)
想像你一邊把水倒進朋友的杯子,他一邊喝。如果你倒得比他喝得快,杯子就會溢出來、浪費了水。有禮貌的做法是看著杯子有多滿,把倒水速度放慢來配合。TCP 流量控制正是如此:它阻止快的寄件者送資料的速度超過接收者能收進去的速度,這樣接收者的緩衝區永遠不會溢出,位元組也不會因為沒地方放而被丟掉。
機制就是廣告出去的接收視窗。接收端為「應用程式尚未讀取的進來位元組」保留一個緩衝區。在它回送的每個區段中,它在 TCP 標頭的視窗欄位裡廣告那個緩衝區還剩多少空閒空間。寄件者不准讓在途的未確認資料超過那個廣告的視窗。當接收端的應用程式從緩衝區讀出位元組,空間就空出來,接收端便廣告一個更大的視窗,寄件者就能推送更多。如果緩衝區滿了,接收端廣告一個為零的視窗,寄件者就暫停,週期性地探測,直到視窗重新開啟。
為什麼重要:流量控制把寄件者的速度配到一個特定的瓶頸——接收者消化資料的能力。值得把「它不是什麼」講清楚:流量控制保護的是接收者,而壅塞控制保護的是中間的網路。它們是兩套分開的機制、用分開的訊號(來自接收者的廣告視窗,相對於從丟失或延遲推斷出的壅塞),而 TCP 同時遵守兩者,送出的量不超過兩個限制中較小的那個所允許的。把兩者搞混,是關於 TCP 最常見的概念錯誤之一。
接收端廣告一個 64 KB 的視窗,所以寄件者可讓在途的未確認資料最多達 64 KB。接收端的應用程式停頓了(忙著做別的事),緩衝區滿了,接收端廣告 window=0,寄件者便停止送資料,直到稍後某個區段重新開啟視窗。
接收者廣告的視窗,封住寄件者在途資料的上限。
流量控制(保護接收者)不是壅塞控制(保護網路)。TCP 同時執行兩者,送出的量只到接收視窗與壅塞視窗兩者的最小值為止。
又稱
另見