一垃沦、快速重傳機(jī)制
上一篇講到了TCP 的超時(shí)重傳懂牧,但是超時(shí)重傳往往會帶來許多微妙的問題锋边,比如說:
- 當(dāng)一個(gè)報(bào)文段丟失時(shí)皱坛,會等待一定的超時(shí)周期然后才重傳分組,增加了端到端的時(shí)延豆巨。
- 當(dāng)一個(gè)報(bào)文段丟失時(shí)剩辟,在其等待超時(shí)的過程中,可能會出現(xiàn)這種情況:其后的報(bào)文段已經(jīng)被接收端接收但卻遲遲得不到確認(rèn)往扔,發(fā)送端會認(rèn)為也丟失了贩猎,從而引起不必要的重傳,既浪費(fèi)資源也浪費(fèi)時(shí)間瓤球。
幸運(yùn)的是融欧,由于TCP采用的是累計(jì)確認(rèn)機(jī)制,即當(dāng)接收端收到比期望序號大的報(bào)文段時(shí)卦羡,便會重復(fù)發(fā)送最近一次確認(rèn)的報(bào)文段的確認(rèn)信號噪馏,我們稱之為冗余ACK(duplicate ACK)麦到。
如圖所示,報(bào)文段1成功接收并被確認(rèn)ACK 2欠肾,接收端的期待序號為2瓶颠,當(dāng)報(bào)文段2丟失,報(bào)文段3失序到來刺桃,與接收端的期望不匹配粹淋,接收端重復(fù)發(fā)送冗余ACK 2。
這樣瑟慈,如果在超時(shí)重傳定時(shí)器溢出之前桃移,接收到連續(xù)的三個(gè)重復(fù)冗余ACK(其實(shí)是收到4個(gè)同樣的ACK,第一個(gè)是正常的葛碧,后三個(gè)才是冗余的)借杰,發(fā)送端便知曉哪個(gè)報(bào)文段在傳輸過程中丟失了,于是重發(fā)該報(bào)文段进泼,不需要等待超時(shí)重傳定時(shí)器溢出蔗衡,大大提高了效率。這便是快速重傳機(jī)制乳绕。
二绞惦、為什么是3次冗余ACK
首先要明白一點(diǎn),即使發(fā)送端是按序發(fā)送洋措,由于TCP包是封裝在IP包內(nèi)济蝉,IP包在傳輸時(shí)亂序,意味著TCP包到達(dá)接收端也是亂序的菠发,亂序的話也會造成接收端發(fā)送冗余ACK堆生。那發(fā)送冗余ACK是由于亂序造成的還是包丟失造成的,這里便需要好好權(quán)衡一番雷酪,因?yàn)榘?次冗余ACK作為判定丟失的準(zhǔn)則其本身就是估計(jì)值。
假定通信雙方如下:
A為發(fā)送端涝婉,B為接收端
A的待發(fā)報(bào)文段序號為 N-1,N,N+1,N+2
假設(shè)報(bào)文段N-1成功到達(dá)
`
從以上羅列的情況可以看出哥力,
在沒丟失的情況下,有40%的可能出現(xiàn)3次冗余ACK
在亂序的情況下必定是2次冗余ACK
在丟失的情況下墩弯,必定出現(xiàn)3次冗余ACK
基于這樣的概率吩跋,選定3次冗余ACK作為閾值也算是合理的。在實(shí)際抓包中渔工,大多數(shù)的快速重傳都會在大于3次冗余ACK后發(fā)生锌钮。
三、快速重傳應(yīng)用實(shí)例
快速重傳機(jī)制比較好理解引矩,這里貼上筆者做的兩幅圖供大家學(xué)習(xí)參考梁丘,若有建議可以提出侵浸。第一幅圖是在某報(bào)文段的超時(shí)重傳定時(shí)器溢出前重傳丟失報(bào)文段,第二幅圖是對應(yīng)的接收端緩存隊(duì)列的窗口移動示意氛谜。