壅塞與流量控制

慢啟動(slow start)

走進一間全黑的房間時,你不會狂奔——但你也不會永遠用蝸牛速度爬。你會小心地踏出第一步,若沒被絆倒,就迅速大膽起來,差不多每次把步伐的信心加倍,直到感覺有牆。慢啟動(slow start)就是 TCP 在連線之初做的這件事:它完全不知道這條路徑有多少容量,所以從小開始,然後出乎意料地快速向上爬,去尋找上限。

別被名字騙了,慢啟動並不慢——它是指數成長的。傳送端從一個小小的壅塞視窗開始(今天通常約 10 個封包),而每當一個往返內的一批資料被確認,它就大約把視窗加倍。於是視窗每個 RTT 走 10、20、40、80 個封包,呈幾何級數攀升。這會持續到兩件事之一發生:封包遺失(路徑滿了的徵兆),或視窗達到一個儲存的上限——稱為慢啟動門檻(slow-start threshold,ssthresh)——此時 TCP 切換到較溫和的線性壅塞避免階段。這名字是歷史遺留:相較於舊行為「瞬間轟出一整個視窗份的封包」,連這種指數攀升都算是慢得多、也安全得多的啟動。

慢啟動在每條連線開始時執行,並在一次嚴重停頓之後再次執行——具體來說是在一次重送逾時之後,此時 TCP 把視窗一路重置到一個或幾個封包,重新向上爬。它之所以存在,是因為一頭栽進去用全速衝刺,正是 1980 年代網際網路崩潰的原因;從謙卑的起點快速向上試探,能讓 TCP 在少數幾個往返內就找到一條快路,同時又不在最初的那一陣爆發就壓垮網路。

一個新的下載以 cwnd = 10 個封包開始。第 1 回合:送出 10 個,10 個全被確認,加倍到 20。第 2 回合:送出 20 個,全被確認,加倍到 40。第 3 回合:80。第 4 回合:160。短短四個往返,傳送端就從 10 個增加到 160 個在途封包——一點也不慢,直到遺失或 ssthresh 讓加倍停下來。

慢啟動每個往返把視窗加倍——指數成長,在第一次遺失或抵達 ssthresh 時結束。

這名字會誤導人:慢啟動是指數的,是 TCP 成長最快的階段。慢的是起點(極小的視窗),而非成長速率。像小型網頁這類短傳輸,可能完全在慢啟動之內就結束,從未達到穩態速度——這正是為何主導網頁體驗的是延遲、而非頻寬的原因之一。

又稱
slow-start phase慢啟動慢速啟動