莊周夢蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

          TCP的TIME_WAIT狀態

          Posted on 2008-06-23 01:25 dennis 閱讀(17841) 評論(3)  編輯  收藏 所屬分類: 計算機科學與基礎
              主動關閉的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狀態。

          評論

          # re: TCP的TIME_WAIT狀態  回復  更多評論   

          2009-03-09 17:07 by Joshua Zhu
          莊老大,我也寫了一篇關于TIME_WAIT和CLOSE_WAIT的,還有我的山寨版TCP狀態轉換圖:
          http://blog.zhuzhaoyuan.com/2009/03/a-word-on-time_wait-and-close_wait/
          哈哈哈。

          # re: TCP的TIME_WAIT狀態  回復  更多評論   

          2009-03-10 10:04 by dennis
          @Joshua Zhu
          老豬,做個友情鏈接 :D

          # re: TCP的TIME_WAIT狀態  回復  更多評論   

          2009-03-10 18:35 by Joshua Zhu
          莊老大,加了 :)
          主站蜘蛛池模板: 八宿县| 洛南县| 新宾| 吉安县| 富裕县| 香港 | 东莞市| 剑河县| 隆回县| 西安市| 宁波市| 安顺市| 石嘴山市| 松溪县| 五河县| 民县| 北碚区| 湘潭县| 天峨县| 咸宁市| 神农架林区| 澳门| 梧州市| 昌宁县| 台北市| 府谷县| 邻水| 封开县| 金华市| 化隆| 昭平县| 鄂尔多斯市| 娱乐| 青岛市| 恭城| 泗水县| 昭觉县| 行唐县| 七台河市| 红原县| 班戈县|