TIME-WAIT状态

关于time-wait状态

  1. 只有发起主动关闭的一方进入此状态。例外情况是双方同时关闭,这时都进入此状态
  2. 在此状态中停留的时间是2MSL,MSL定义为30秒到2分钟,linux定义的是30秒,所以停留1分钟
  3. 如果此状态下有数据达到,就重置该定时器。

time-wait状态下按理对方关闭了连接,不会有数据到来的。

下面是time-wait存在的必要性:

  1. 对于主动关闭方,最后要发送一个ACK给对方确认关闭。而这个ACK包有可能丢失,所以设置一个等待时间,如果对方重传FIN包的话还可以在发送ACK包确认;
  2. 由于网络延迟的存在,可能有的数据包在其重传数据包后才到达。这时如果连接关闭,并且刚好双方又建立了一个相同地址的连接,那么这个数据包就有可能被当成这次连接的数据包了。有了time-wait后,旧有的连接在此种数据包在网络消失前任然存在,所以不会发生前面描述的干扰新的连接的情况。

time-wait意外(没到时间被强制结束)

RFC793中当连接处于TIME-WAIT状态时,如果接受到RST消息,TCP应立即关闭连接。

RFC1337中描述了这个问题,Linux的解决方法是如果设置了启用rfc1337,就忽略该RST,

否则就关闭连接

if (th->rst) {
   /* This is TIME_WAIT assassination, in two flavors.
    * Oh well... nobody has a sufficient solution to this
    * protocol bug yet.
    */
   if (sysctl_tcp_rfc1337 == 0) {
kill:
    inet_twsk_deschedule(tw, &tcp_death_row);
    inet_twsk_put(tw);
    return TCP_TW_SUCCESS;
   }
 }

 

另外一个发生的场景是人为制造的,对于SO_LINGER套接字选项,如果设置开启linger,并且设置

linger时间为0,就会发生RST给TIME-WAIT状态。所以在使用该选项时千万不能如此设置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值