2012-11-07 36 views
1

例如,在TCP Tahoe連接中,如果發生大文件傳輸。突然,接收進程或主機被關閉或暫停,我知道我們將有一個超時,此時窗口大小將被重置,等等。據我瞭解,我們將重新發送未被確認的數據包,然後再試一次,並可能再次?如果接收進程停止或掛起,TCP連接會發生什麼?

我很想知道,在這樣的超時之後,如果在假定接收器不再存在並且數據將停止發送之前有多少次數據將被重新發送,那麼會發生多少次數據。如果進程從暫停狀態恢復,它是否能夠繼續接收數據?

我知道數據在三重複確認或超時後重新發送。但是,如果發生多次重新傳輸失敗,或者接收過程突然停止接收,會發生什麼情況,我找不到太多內容。

回答

6

如果接收進程退出或被終止,那麼將關閉其末端的套接字。當發送方繼續發送數據包時,它們應該會提示RST數據包,這會立即導致錯誤(ECONNRESET)。

如果接收主機乾淨地關閉,它應該終止所有進程,這將導致上述情況發生。

如果接收主機和進程處於活動狀態,但進程暫停(例如Ctl-z),則在TCP級別將檢測不到問題。該窗口最終將填滿,但接收系統將繼續確認零窗口探測器。爲了檢測這種情況,你需要一個應用層保活機制。

如果接收主機崩潰,掉電或其網絡連接失敗,即重傳超時時間變爲相關時。重傳的次數和頻率取決於實現,也可能由系統配置參數控制。我不知道什麼是典型的參數。

如果在超時發生之前接收系統重新啓動,它將重啓到帶有RST數據包的下一次重傳,這將導致ECONNRESET錯誤。

+0

如果接收器失去電源,我認爲send()會立即返回-1,並且還得到一個SIGPIPE?重播會在那之前發生嗎? –

+0

@ BinTAN-Victor如果發生這種情況,send()會立即返回嗎?知道接收機關閉的唯一方法是等待確認超時。這需要一兩分鐘,因爲在放棄之前它會重傳幾次。 – Barmar

+0

謝謝你現在對我有意義。如果接收器關閉,阻塞send()是否會立即返回? –

相關問題