眾所周知,TCP有快速重傳這一機制,這一機制是相對于超時重傳而言的,說他快速是因為他不需要等待一個相對可能變化起伏大的超時而言,那么為什么快速重傳的觸發機制是三個冗余的ACK呢?這代表了什么樣的含義?
要理解這其中的含義,首先先明確一個問題:什么時候TCP會發送冗余的ACK?
答案很簡單:只有當TCP的接收方收到了序號大于它本身期待序號的分組時,才會發送冗余的ACK,
舉個簡單的栗子,假如分組A、B和C被先后發送到接收方,分組A順利達到接收方,接收方發送了確認ACK,假定是ACK_A,并順利地被發送方收到,而分組B很不幸,在中途丟了,沒有到達接收方,分組C同A一樣順利到達了接收方,于是接收方看到了C分組的編號,發現缺少了B(因為A-B-C是按順序的一組編號)的編號的分組,于是它只能再次發送ACK_A給發送方,以此提示發送方:自己此時并沒有收到B分組,這是從發送方的角度看問題,同是也是“上帝視角”看問題,(所謂上帝視角,是因為我們已經知道了分組B是在中途丟失了)
于是繼續這種情況,我們把視角切換到發送方,發送方這時候收到了第一個冗余的ACK_A,它覺得此時有兩種可能性:第一種可能性是B分組丟失了(也即我們的上帝視角);然后還有第二種可能性,這種可能性就是,C分組可能先于B分組到達,這種情況聽起來不大可能(因為按理來說B先發送,應當是B先到達),然而在分組傳輸程序中,其它層可能會改變分組的順序,也即可能出現B和C的順序被交換的可能性,于是第二種可能性也是成立的,
所以基于前面的論述,既然C分組可能先到達,那么傳回來的冗余ACK就不一定是說明B丟失了,而是可能說明B的位置被切換了,于是TCP的設計者就設計了一個三次機制,也就是說當B被換到C分組后面的時候,第一個冗余ACK到達,先等一等看看B會不會剛好在C的后面,于是第一次的冗余沒有引發立刻重傳,然而B也有可能又被D分組(假設C后面有分組D和分組E)交換次序,因而再等一個D分組到達的冗余分組,再等一個E分組到達的冗余分組,當三個B后面的分組都到達了,這時候發送方收到了三個冗余的ACK之后,它終于認定不是因為被交換了次序,而是因為確實是丟了(第一種情況),于是它執行重傳,
那么只剩下了最后一個問題,TCP的設計者為什么認定出現了三個冗余ACK,就一定不可能是發生三位的交換呢?(也即為什么這時候不可能是次序交換引起的呢?)我想,這大概是從眾多試驗中得出的結論吧,畢竟TCP已經有幾十年的發展史了,可能在漫長的發展中,這個“三”就被得到了呢?(最后部分僅代表個人猜想,如有不同,可討論)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/305413.html
標籤:其他
上一篇:計網第三章資料鏈路層_詳細易懂
下一篇:打開我的收藏夾 --TCP篇
