重送計時器(retransmission timer)
想像你問朋友一個問題,等著回覆。如果過了一陣子什麼都沒聽到,你會假設訊息弄丟了,於是再問一次——但你不會等到天荒地老,也不會話一說完就馬上再問。你會先等一段合理的時間。重送計時器就是那個「合理的等待」:送出資料後,寄件者啟動一個時鐘,若時鐘走完之前都沒有確認到來,它就判定資料八成遺失了,於是重送。
難的部分是挑逾時長度。太短,寄件者會重送其實只是比較慢的資料,浪費容量;太長,真的丟失之後它會空閒地乾等,傷害吞吐量。TCP 從往返時間(RTT)的量測——確認實際花多久回來——適應性地設定這個逾時。它追蹤一個平滑後的平均 RTT,以及該 RTT 變動多大,並把重送逾時(RTO)設為平均值加上一段給變動量的餘裕。逾時觸發後,TCP 還會把下一次逾時加倍(指數退避),讓陷入麻煩的網路不致被快速重試猛敲。
為什麼重要:計時器是可靠傳輸的安全網——當沒有更快的訊號時,丟失就是靠它偵測。但它刻意是後備,不是第一線:逾時相對慢,所以 TCP 能的時候寧可透過重複確認(快速重傳)更早抓到丟失。一個誠實的提醒:計時器無法分辨資料為何沒到。如果無線連結因為無線電雜訊(而非壅塞)丟了一個封包,計時器照樣觸發、TCP 照樣反應,這也是經典 TCP 在會丟失的無線連結上表現不佳的原因之一。
TCP 量到近期往返約 40 毫秒,於是把逾時設成大約 200 毫秒(平均值加上變動餘裕)。一個區段送出;200 毫秒過去都沒有 ACK;計時器觸發;TCP 重送該區段,並把下一次逾時設成大約 400 毫秒,以防麻煩持續。
逾時依量測到的 RTT 而定;每觸發一次就加倍(退避)。
逾時是偵測丟失的慢路徑。TCP 通常透過三個重複 ACK(快速重傳)更快反應。而觸發的計時器無法分辨壅塞造成的丟失與無線雜訊造成的丟失——這是無線連結上一個已知的弱點。