壅塞與流量控制

快速重傳(fast retransmit)

假設你正透過電話把一封信一頁一頁地唸給朋友聽,每頁都有編號,他每聽完一頁就要說「收到第 5 頁」。如果有一頁在郵寄途中遺失,發現它的慢方法是等碼錶倒數完。快方法是:每當較後面的一頁亂序先到,你朋友就一直說「還在等第 5 頁」——而在第三次這樣的抱怨之後,你不等時鐘,立刻就重送第 5 頁。快速重傳(fast retransmit)正是 TCP 的這個捷徑。

機制是這樣的。TCP 接收端永遠確認它已連續收到的最高位元組——所以如果第 5 個區段遺失,但第 6、7、8 個到了,接收端就會對它們每一個都重複確認「我還缺第 5 個」。傳送端看到這些重複確認(dup ACK)。一兩個也許只是亂序,但對同一點收到三個重複 ACK(一個三重 dup ACK,意思是傳送端把同一個 ACK 編號看到了四次)就是一個強烈訊號:某個特定區段被丟了,而後面的卻通過了。於是傳送端立刻重送那一個遺失的區段,而不等重送逾時到期。

為何重要:重送逾時刻意設得保守——常常是相當大的一秒鐘比例甚至更長——以免重送只是慢了的封包。若每次遺失都要等那麼久,TCP 會顯得遲鈍。快速重傳讓傳送端改用大約一個往返時間就能從一次孤立遺失中恢復,這對互動式與大量傳輸都是巨大的加速。它和快速恢復(fast recovery)攜手運作,後者決定在快速重傳之後該如何處理壅塞視窗。

傳送端送出區段 5、6、7、8、9。第 5 個遺失。接收端收到 6、7、8、9,並回傳四個都說「在等第 5 個」的 ACK。第一個是原始的;第二、第三、第四個是重複的。在第三個重複時,傳送端立刻重送區段 5——也許比它的重送計時器觸發還早了 300 毫秒。

三個重複 ACK 觸發立即重送,用一個 RTT 就恢復,而不必苦等逾時。

三個重複 ACK 是一種啟發式,並非遺失的證明——一個封包也可能只是被網路嚴重亂序了。三這個門檻是刻意的權衡:低到足以快速反應,又高到讓輕微的亂序不致觸發不必要的重送。選擇性確認(SACK)藉由明確指名哪些區段已到達,讓這件事精確許多。

又称
fast retransmission快速重傳三重重複 ACK 重傳