資料連結層

流量控制(flow control)

想像你一邊倒水進別人的杯子,他一邊喝。如果你倒得比他吞得快,杯子就會溢出來、水就浪費了。流量控制就是那個讓喝水的人能說「慢一點」或「停」的約定,好讓倒水的人永遠不會灌過頭。在網路裡,它是讓快速發送方不至於壓垮慢速接收方的機制——把發送速率配合接收方真正能吸收的量。

接收方有一塊有限的緩衝區,也就是存放「已到達但尚未處理」資料的暫存區。如果訊框湧入的速度比接收方清空緩衝區的速度快,緩衝區就會塞滿,新到的資料便被丟棄。流量控制透過給接收方一個節流發送方的辦法來防止這件事。最簡單的形式是停止等待:送一個訊框,等接收方說「可以了」再送下一個。較有效率的形式則用一個視窗:接收方公告它目前還有多少緩衝空間,發送方在必須停下來等待繼續的許可之前,最多只能有那麼多位元組或訊框尚未被確認。

重要的是別把流量控制和壅塞控制搞混,雖然它們看起來很像。流量控制保護的是「接收方」的緩衝區——重點在於兩個端點不要互相超速。壅塞控制保護的是中間的「網路」——那些共享連結與路由器佇列——不被大家同時擠爆。一個發送方可能被這兩者其中之一要求慢下來,理由卻完全不同;舉例來說,TCP 同時跑這兩套,並服從其中較嚴格的那一個。

一台 1 Gbps 的伺服器向一個只能處理 1 Mbps 的小型感測器串流。沒有流量控制時,感測器的緩衝區在幾毫秒內就溢位,幾乎所有東西都被丟掉。有了流量控制,感測器公告一個很小的視窗,伺服器便放慢去配合——不溢位、不浪費。

由接收方定步調,發送方遵從,以免灌爆接收方的緩衝區。

流量控制保護接收方不被快速發送方壓垮;壅塞控制保護網路不被所有人同時擠爆。它們是不同的問題,只是恰好都用了類似的視窗機制。

又稱
流速控制