TIME-WAIT状态
2013-10-09 20:45
351 查看
关于time-wait状态
只有发起主动关闭的一方进入此状态。例外情况是双方同时关闭,这时都进入此状态
在此状态中停留的时间是2MSL,MSL定义为30秒到2分钟,linux定义的是30秒,所以停留1分钟
如果此状态下有数据达到,就重置该定时器。
time-wait状态下按理对方关闭了连接,不会有数据到来的。
下面是time-wait存在的必要性:
对于主动关闭方,最后要发送一个ACK给对方确认关闭。而这个ACK包有可能丢失,所以设置一个等待时间,如果对方重传FIN包的话还可以在发送ACK包确认;
由于网络延迟的存在,可能有的数据包在其重传数据包后才到达。这时如果连接关闭,并且刚好双方又建立了一个相同地址的连接,那么这个数据包就有可能被当成这次连接的数据包了。有了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状态。所以在使用该选项时千万不能如此设置。
只有发起主动关闭的一方进入此状态。例外情况是双方同时关闭,这时都进入此状态
在此状态中停留的时间是2MSL,MSL定义为30秒到2分钟,linux定义的是30秒,所以停留1分钟
如果此状态下有数据达到,就重置该定时器。
time-wait状态下按理对方关闭了连接,不会有数据到来的。
下面是time-wait存在的必要性:
对于主动关闭方,最后要发送一个ACK给对方确认关闭。而这个ACK包有可能丢失,所以设置一个等待时间,如果对方重传FIN包的话还可以在发送ACK包确认;
由于网络延迟的存在,可能有的数据包在其重传数据包后才到达。这时如果连接关闭,并且刚好双方又建立了一个相同地址的连接,那么这个数据包就有可能被当成这次连接的数据包了。有了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状态。所以在使用该选项时千万不能如此设置。
相关文章推荐
- rails学习笔记: rake db 相关命令
- ADB server didn't ACK * failed to start daemon * 解决方案
- Grails教程之--我的理解
- (贪心5.1.1)POJ 1230 Pass-Muraille
- 使用easy_install时报错如下: error: Setup script exited with error: command ‘gcc’ failed with exit status 1
- 1.6 基础知识——GP2.5 培训(Training)
- HDU 4484 Hailstone HOTPO (简单模拟题)
- Hyperic Agent 安装配置报 - No token file found, waiting for Agent to initialize
- 红孩儿工具箱-Honghaier Game Tool
- /var/spool/postfix/maildrop目录特别大
- 如何在Web应用程序中使用TWAIN驱动程序的自定义功能?
- rails中validates及各种方法
- rails acts_as_nested_set
- hdu 3537 Daizhenyang's Coin (翻硬币游戏)
- rails 为表添加1列
- 1.6 基础知识——GP2.5 培训(Training)
- 1.6 基础知识——GP2.5 培训(Training)
- 【Rails学习笔记】用户微博【下】
- (贪心5.1.1)POJ 1230 Pass-Muraille
- Grails教程之--我的理解