zoukankan      html  css  js  c++  java
  • TCP协议(二)——TIME_WAIT状态

      当TCP主动关闭套接字时,采用四步握手机制来彻底关闭连接。如图:

         

      

    1. 客户端主动关闭连接,发送FIN段到服务端。TCP状态由ESTABLISHED(连接状态)转为FIN_WAIT1(表示,发送的FIN需要确认)。
    2. 服务端接受FIN后,服务端的TCP状态由ESTABLISHED转为CLOSE_WAIT,并且回送ACK。
    3. 客户端接受确认ACK后,TCP状态由FIN_WAIT1转化为FIN_WAIT2(表示已经确认FIN,等待来自服务端的FIN请求)。
    4. 服务端发送FIN,TCP状态CLOSE_WAIT转为LAST_ACK(表示服务器在等待客户端的ACK)
    5. 结束到FIN后,客户端发送ACK并且将状态转会为TIME_WAIT
    6. 服务器接受ACK,TCP状态转为CLOSED(关闭)。过一段时间,客户端有TIME_WAIT转为CLOSED

      发送主动关闭的一方在最终转换消息时经历了一个TIME_WAIT状态,并且保持这个状态一段时间。TIME_WAIT状态存在打作用是什么?

    1. 确认对等端收到了最后的ACK。最后的ACK可能意外丢失,导致对等端认为FIN丢失,进而重传FIN。因此,这个状态可以对重传作出回应。
    2. 服务器发起主动关闭但不进入TIME_WAIT状态,而这时客户端崩溃重启,重启后立即发起重新连接。重连时使用上次端口号进行连接,两端通信时,所使用的序列号恰好与上次相同,这样当上次连接残留在路由器中的数据到达服务器(延时数据段),进行数据整合时出现混乱。 当存在TIME_WAIT状态时,服务器会拒绝客户端的连接请求,这样确保不会使用处于TIME_WAIT状态的TCP连接端口号来与客户端连接。
    3. 客户端发起主动关闭,而不处于TIME_WAIT状态。在这种情况下可能发起连接时重用以前的端口号,这样产生相同的问题。
    4. TIME_WAIT状态存在,意味着两端的连接依然存在,意味着在TIME_WAIT状态时依然保留四元组(源IP,源端口,目的IP,目的端口),两端不得使用这些端口建立连接。    

      TIME_WAIT状态主要用于:重传机制,避免相同序列号导致与上次延迟数据发生混,。

  • 相关阅读:
    杂记:高僧的炒股境界
    在Windows 7中使用tsmmc远程桌面
    VS2010初体验
    code4fun: one service,one config
    WCF进阶:将编码后的字节流压缩传输
    有高手想换工作的么?
    code4fun:host wcf service just in time
    evey的几张鼠绘
    说说WCF Rest
    外包一类似联众room的项目
  • 原文地址:https://www.cnblogs.com/yuhanghzsd/p/6358674.html
Copyright © 2011-2022 走看看