引言
TCP提供可靠的運輸層。它使用的方法之一就是確認從另一端收到的數據。但數據和確認都有可能會丟失。TCP通過在發送時設置一個定時器來解決這種問題。如果當定時器溢出時還沒有收到確認,它就重傳該數據。對任何實現而言,關鍵之處就在於超時和重傳的策略,即怎樣決定超時間隔和如何確定重傳的頻率。
超時與重傳的簡單例子
首先觀察TCP所使用的重傳機制,我們將建立一個連接,發送一些分組來證明一切正常,然后拔掉電纜,發送更多的數據,再觀察TCP的行為。
下圖表示的是tcpdump的輸出結果(已經去掉了bsdi設置的服務類型信息)。
第1、2和3行表示正常的TCP連接建立的過程,第4行是“hello, world”(1 2個字符加上回車和換行)的傳輸過程,第5行是其確認。接着我們從svr4拔掉了以太網電纜,第6行表示"and hi"將被發送。第7 ~ 18行是這個報文段的12次重傳過程,而第1 9行則是發送方的TCP最終放棄並發送一個復位信號的過程。
現在檢查連續重傳之間不同的時間差,它們取整后分別為 1、3、6、12、24、48和多個6 4秒。在本章的后面,我們將看到當第一次發送后所設置的超時時間實際上為 1.5秒,此后該時間在每次重傳時增加1倍並直至64秒。這個倍乘關系被稱為"指數退避 (exponential backoff)"
首次分組傳輸(第6行,24 . 4 80秒)與復位信號傳輸(第19行,566.488秒)之間的時間差約為9分鍾,該時間在目前的TCP實現中是不可變的。