速讀原著-TCP/IP(快速重傳與快速恢復演算法)
- 2020 年 3 月 12 日
- 筆記
第21章 TCP的超時與重傳
21.7 快速重傳與快速恢復演算法
擁塞避免演算法的修改建議 1 9 9 0年提出 [Jacobson 1990b]。在我們的例子(見 2 1 . 5節)中已經可以看到這些實施中的修改。 在介紹修改之前,我們認識到在收到一個失序的報文段時, T C P立即需要產生一個 A C K(一個重複的A C K)。這個重複的A C K不應該被遲延。該重複的 A C K的目的在於讓對方知道收到一個失序的報文段,並告訴對方自己希望收到的序號。
由於我們不知道一個重複的 A C K是由一個丟失的報文段引起的,還是由於僅僅出現了幾個報文段的重新排序,因此我們等待少量重複的 A C K到來。假如這只是一些報文段的重新排序,則在重新排序的報文段被處理併產生一個新的 A C K之前,只可能產生1 ~ 2個重複的A C K。
如果一連串收到 3個或3個以上的重複A C K,就非常可能是一個報文段丟失了(我們在 2 1 . 5節中見到過這種現象)。於是我們就重傳丟失的數據報文段,而無需等待超時定時器溢出。這就是快速重傳演算法。接下來執行的不是慢啟動演算法而是擁塞避免演算法。這就是快速恢復演算法。
在圖2 1 - 7中可以看到在收到3個重複的A C K之後沒有執行慢啟動。相反,發送方進行重傳,接著在收到重傳的A C K以前,發送了3個新的數據的報文段(報文段 67, 69和7 1)。在這種情況下沒有執行慢啟動的原因是由於收到重複的 A C K不僅僅告訴我們一個分組丟失了。由於接收方只有在收到另一個報文段時才會產生重複的 A C K,而該報文段已經離開了網路並進入了接收方的快取。也就是說,在收發兩端之間仍然有流動的數據,而我們不想執行慢啟動來突然減少數據流。
這個演算法通常按如下過程進行實現:
- 當收到第3個重複的A C K時,將s s t h re s h設置為當前擁塞窗口 c w n d的一半。重傳丟失的報文段。設置c w n d為s s t h re s h加上3倍的報文段大小。
- 每次收到另一個重複的 A C K時,c w n d增加1個報文段大小並發送 1個分組(如果新的c w n d允許發送)。
- 當下一個確認新數據的A C K到達時,設置c w n d為s s t h re s h(在第1步中設置的值)。這個A C K應該是在進行重傳後的一個往返時間內對步驟 1中重傳的確認。另外,這個 A C K也應該是對丟失的分組和收到的第 1個重複的A C K之間的所有中間報文段的確認。這一步採用的是擁塞避免,因為當分組丟失時我們將當前的速率減半。
在下一節中我們將看到變數 c w n d和s s t h re s h的計算過程。快速重傳演算法最早出現在 4.3BSD Ta h o e版本中,但它隨後錯誤地使用了慢啟動。快速恢復演算法出現在4.3BSD Reno版本中。
