壅塞與流量控制

壅塞控制(congestion control)

想像一條高速公路上有數千輛車同時想匯入。如果大家都一直踩油門,車流不會更快——反而會卡成一團,每個人到得更晚。壅塞控制(congestion control)就是一套規則,讓眾多傳送端能明智地共用網際網路這條路:每個傳送端留意前方路況是否快要塞滿,並在塞車形成之前主動放慢。神奇的是,並沒有中央交通警察下令;每個 TCP 傳送端都是自己判斷出來的。

具體而言,壅塞控制管的是傳送端被允許以多快的速度把資料送進整個網路——而不是某個接收端能多快吸收。傳送端保有一個私有變數,稱為壅塞視窗(congestion window,cwnd),用來限制可同時在途中、尚未被確認的位元組數量。它一開始很謹慎,當一切順利時把視窗逐步調大,而一旦看到麻煩的徵兆——對傳統 TCP 而言就是封包遺失——便立刻大幅縮小視窗。透過反覆向上試探再退讓,傳送端便能追蹤網路的可用容量,而完全不需要有人告訴它容量是多少。

把這件事和流量控制(flow control)分清楚非常重要。流量控制保護的是接收端,避免它被淹沒,用的是接收端宣告的接收視窗(receive window)。壅塞控制保護的則是網路——也就是共用的連結與路由器內部的緩衝區——避免被所有人同時灌爆。TCP 同時遵守兩者:它能送出的量大致是壅塞視窗與宣告接收視窗兩者中較小的那個。壅塞控制是網際網路安靜而去中心化的理由,讓它不會因為太受歡迎而被自己壓垮。

你開始一個大檔下載,速度很快爬到 50 Mbps。接著同一條家用線路上的鄰居也開始他自己的下載。一兩秒之內,你的速度穩定在約 25 Mbps,他的也約在 25 Mbps——你們誰都沒有講好;兩端的 TCP 各自獨立偵測到共用連結正在塞滿,於是各自退讓,直到這條連結被大致平均地分享。

沒有任何中央機構分配這個比例;兩個獨立的傳送端各自達到大致公平的分享,這正是壅塞控制在運作。

壅塞控制是自願的,並非由網路強制執行:它能運作,純粹是因為主流的傳送端(TCP、QUIC)選擇遵守。一個拒絕退讓的流可以搶到不公平的份額,這正是激進或不合規流量令人擔憂的原因。

又稱
congestion avoidance and control壅塞控制擁塞控制