閱讀883 返回首頁    go 阿裏雲 go 技術社區[雲棲]


TCP的TIME_WAIT狀態

  主動關閉的Socket端會進入TIME_WAIT狀態,並且持續2MSL時間長度,MSL就是maximum segment lifetime(最大分節生命期),這是一個IP數據包能在互聯網上生存的最長時間,超過這個時間將在網絡中消失。MSL在RFC 1122上建議是2分鍾,而源自berkeley的TCP實現傳統上使用30秒,因而,TIME_WAIT狀態一般維持在1-4分鍾。
    TIME_WAIT狀態存在的理由:
1)可靠地實現TCP全雙工連接的終止
    在進行關閉連接四路握手協議時,最後的ACK是由主動關閉端發出的,如果這個最終的ACK丟失,服務器將重發最終的FIN,因此客戶端必須維護狀態信息允許它重發最終的ACK。如果不維持這個狀態信息,那麼客戶端將響應RST分節,服務器將此分節解釋成一個錯誤(在java中會拋出connection reset的SocketException)。因而,要實現TCP全雙工連接的正常終止,必須處理終止序列四個分節中任何一個分節的丟失情況,主動關閉的客戶端必須維持狀態信息進入TIME_WAIT狀態。

2)允許老的重複分節在網絡中消逝 
    TCP分節可能由於路由器異常而“迷途”,在迷途期間,TCP發送端可能因確認超時而重發這個分節,迷途的分節在路由器修複後也會被送到最終目的地,這個原來的迷途分節就稱為lost duplicate。在關閉一個TCP連接後,馬上又重新建立起一個相同的IP地址和端口之間的TCP連接,後一個連接被稱為前一個連接的化身(incarnation),那麼有可能出現這種情況,前一個連接的迷途重複分組在前一個連接終止後出現,從而被誤解成從屬於新的化身。為了避免這個情況,TCP不允許處於TIME_WAIT狀態的連接啟動一個新的化身,因為TIME_WAIT狀態持續2MSL,就可以保證當成功建立一個TCP連接的時候,來自連接先前化身的重複分組已經在網絡中消逝。

新的SCTP協議通過在消息頭部添加驗證標誌避免了TIME_WAIT狀態。

文章轉自莊周夢蝶  ,原文發布時間2008-06-23

最後更新:2017-05-17 18:31:28

  上一篇:go  Ruby寫Servlet的小例子
  下一篇:go  java語言的演化——讀JavaOne ppt筆記