TCP的快速重傳機制

一、快速重傳機制

上一篇講到了TCP 的超時重傳,但是超時重傳往往會帶來許多微妙的問題,比如說:

  • 當一個報文段丟失時,會等待一定的超時周期然后才重傳分組,增加了端到端的時延。
  • 當一個報文段丟失時,在其等待超時的過程中,可能會出現(xiàn)這種情況:其后的報文段已經(jīng)被接收端接收但卻遲遲得不到確認,發(fā)送端會認為也丟失了,從而引起不必要的重傳,既浪費資源也浪費時間。

幸運的是,由于TCP采用的是累計確認機制,即當接收端收到比期望序號大的報文段時,便會重復發(fā)送最近一次確認的報文段的確認信號,我們稱之為冗余ACK(duplicate ACK)。
如圖所示,報文段1成功接收并被確認ACK 2,接收端的期待序號為2,當報文段2丟失,報文段3失序到來,與接收端的期望不匹配,接收端重復發(fā)送冗余ACK 2。


這樣,如果在超時重傳定時器溢出之前,接收到連續(xù)的三個重復冗余ACK(其實是收到4個同樣的ACK,第一個是正常的,后三個才是冗余的),發(fā)送端便知曉哪個報文段在傳輸過程中丟失了,于是重發(fā)該報文段,不需要等待超時重傳定時器溢出,大大提高了效率。這便是快速重傳機制。


二、為什么是3次冗余ACK

首先要明白一點,即使發(fā)送端是按序發(fā)送,由于TCP包是封裝在IP包內(nèi),IP包在傳輸時亂序,意味著TCP包到達接收端也是亂序的,亂序的話也會造成接收端發(fā)送冗余ACK。那發(fā)送冗余ACK是由于亂序造成的還是包丟失造成的,這里便需要好好權衡一番,因為把3次冗余ACK作為判定丟失的準則其本身就是估計值。
假定通信雙方如下:

A為發(fā)送端,B為接收端
A的待發(fā)報文段序號為 N-1,N,N+1,N+2
假設報文段N-1成功到達

`


從以上羅列的情況可以看出,
在沒丟失的情況下,有40%的可能出現(xiàn)3次冗余ACK
在亂序的情況下必定是2次冗余ACK
在丟失的情況下,必定出現(xiàn)3次冗余ACK

基于這樣的概率,選定3次冗余ACK作為閾值也算是合理的。在實際抓包中,大多數(shù)的快速重傳都會在大于3次冗余ACK后發(fā)生。

三、快速重傳應用實例

快速重傳機制比較好理解,這里貼上筆者做的兩幅圖供大家學習參考,若有建議可以提出。第一幅圖是在某報文段的超時重傳定時器溢出前重傳丟失報文段,第二幅圖是對應的接收端緩存隊列的窗口移動示意。


快速重傳:在某報文段的超時重傳定時器溢出前重傳丟失報文段
接收端緩存隊列的窗口移動示意
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容