【zz】关于TIME_WAIT

来源:互联网 发布:mac 解压zip文件命令 编辑:程序博客网 时间:2024/05/17 07:06
客户端与服务器端建立的TCP/IP连接数据传送完毕后,关闭SOCKET之后,服务器端连接的端口
状态为TIME_WAIT。
 
       是不是所有执行主动关闭的socket都会进入TIME_WAIT状态呢?
       有没有什么情况使主动关闭的socket直接进入CLOSED状态呢?
 
        主动关闭的一方在发送最后一个 ack 后,就会进入 TIME_WAIT 状态 停留2MSL(max segment lifetime)时间
这个是TCP/IP必不可少的,也就是“解决”不了的。

       也就是TCP/IP设计者本来是这么设计的
       主要有两个原因
1。防止上一次连接中的包,迷路后重新出现(重新发送的包),影响新连接
  (经过2MSL,上一次连接中所有的重复包都会消失)
2。可靠的关闭TCP连接
  主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发
  fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以
  主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。

        TIME_WAIT 并不会占用很大资源的,除非受到攻击。

        还有,如果一方 send 或 recv 超时,就会直接进入 CLOSED 状态 。
       MSL(最大分段生存期)指明TCP报文在Internet上最长生存时间,每个具体的TCP实现
都必须选择一个确定的MSL值。RFC 1122建议是2分钟,但BSD传统实现采用了30秒。

       TIME_WAIT 状态最大保持时间是2 * MSL,也就是1-4分钟。
为什么需要 TIME_WAIT 状态?

假设最终的ACK丢失,server将重发FIN,client必须维护TCP状态信息以便可以重发
最终的ACK,否则会发送RST,结果server认为发生错误。TCP实现必须可靠地终止连
接的两个方向(全双工关闭),client必须进入 TIME_WAIT 状态,因为client可能面
临重发最终ACK的情形。

{
scz 2001-08-31 13:28

先调用close()的一方会进入TIME_WAIT状态
}

此外,考虑一种情况,TCP实现可能面临先后两个同样的相关五元组。如果前一个连
接处在 TIME_WAIT 状态,而允许另一个拥有相同相关五元组的连接出现,可能处理
TCP报文时,两个连接互相干扰。使用 SO_REUSEADDR 选项就需要考虑这种情况。

为什么 TIME_WAIT 状态需要保持 2MSL 这么长的时间?

如果 TIME_WAIT 状态保持时间不足够长(比如小于2MSL),第一个连接就正常终止了。
第二个拥有相同相关五元组的连接出现,而第一个连接的重复报文到达,干扰了第二
个连接。TCP实现必须防止某个连接的重复报文在连接终止后出现,所以让TIME_WAIT
状态保持时间足够长(2MSL),连接相应方向上的TCP报文要么完全响应完毕,要么被
丢弃。建立第二个连接的时候,不会混淆。
 
原创粉丝点击