壅塞與流量控制

壅塞視窗(congestion window)

把壅塞視窗想成一個 TCP 傳送端依照它認為路有多忙,而替自己設下的速限。接收端也會設一個限制(接收視窗,避免它被淹沒),但壅塞視窗是傳送端自己對網路能承受多少的猜測。傳送端永遠遵守兩個限制中較小的那個——它只被允許開到「路」與「目的地」兩者都應付得來的速度。

具體而言,壅塞視窗(寫作 cwnd)是傳送端保有的一個數字,用來限制在這條路徑上同時可在途、尚未被確認的位元組(或封包)數量。每個往返,這些封包送出去,它們的確認回來,傳送端便調整 cwnd:在慢啟動時把它放大(加倍)、在壅塞避免時放大(每次加一個封包份),並在收到壅塞信號時縮小(收到三個重複 ACK 時砍半,或在逾時時崩落到一個封包)。因為在途的資料大約就是 cwnd,而那些資料需要一個往返時間才被確認,所以一個流的吞吐量大約等於 cwnd 除以往返時間。視窗越大,流越快——直到連結所能承受的上限。

壅塞視窗是 TCP 壅塞控制裡最重要的單一狀態變數,然而它完全只存在於傳送端,從不被送上線路——這和接收視窗不同,後者由接收端在每個區段裡宣告。你讀過的關於慢啟動、壅塞避免、AIMD 與快速恢復的一切,歸根究柢都是 cwnd 如何隨時間被調高與調低的故事。看著 cwnd 對時間作圖,就是在看 TCP 思考。

在一條往返時間 50 毫秒的路徑上,若 cwnd 為 100 個各 1500 位元組的封包,傳送端就能有約 150,000 位元組在途,其吞吐量大約是 150,000 位元組 / 0.05 秒 = 3,000,000 位元組/秒,約 24 Mbps。把 cwnd 加倍到 200,(若連結允許)吞吐量也大致加倍。這個「cwnd 除以 RTT」的關係,正是高速長距離連結需要大視窗的原因。

吞吐量大約是 cwnd / RTT,所以傳送端是靠調整一個私有數字來控制自己的速度。

別把壅塞視窗(cwnd,傳送端對網路允許量的估計,從不被傳送)和接收視窗(rwnd,接收端在每個區段裡宣告的值)搞混。傳送端真正的傳送上限是 min(cwnd, rwnd)。對於開放網際網路上的長時間大量傳輸,cwnd 幾乎總是那個起作用的限制。

又稱
cwnd壅塞視窗擁塞視窗