当前位置: 技术问答>linux和unix
关于TIME_WAIT状态的疑问
来源: 互联网 发布时间:2017-03-27
本文导语: UNP上说TIME_WAIT的作用之一,是为了防止旧链接的重复分组出现在新的相同链接中,想了很长时间也想不明白,疑问如下: 为什么TIME_WAIT的时间要是2MSL,既然一个包的最大生存时间为MSL,那么TIME_WAIT持续MSL时间后,所...
UNP上说TIME_WAIT的作用之一,是为了防止旧链接的重复分组出现在新的相同链接中,想了很长时间也想不明白,疑问如下:
为什么TIME_WAIT的时间要是2MSL,既然一个包的最大生存时间为MSL,那么TIME_WAIT持续MSL时间后,所有重复数据包应该就已经消失了啊?
如果说这是为了防止最后一个ACK成为重复数据包,那么下面的情况怎么处理:
假设主动关闭端为A,被动关闭端为B,A在收到B的FIN包,发送ACK之后状态就成了TIME_WAIT,如果这个ACK
丢失了,B端继续发FIN。如果A发送的ACK一直丢失,那么,在1MSL到2MSL之间的时间段内,如图*所在的时间点上,A发送的ACK就有可能成为重复数据包,这样再过不
到1MSL的时间,A状态变为CLOSED,接着AB之间马上建立相同的链接,之前的ACK还是有可能会出现啊,因为时间不到MSL,如图:
|------|------|
0 1 * 2
不知道我描述清楚了没有,望高手解答。
为什么TIME_WAIT的时间要是2MSL,既然一个包的最大生存时间为MSL,那么TIME_WAIT持续MSL时间后,所有重复数据包应该就已经消失了啊?
如果说这是为了防止最后一个ACK成为重复数据包,那么下面的情况怎么处理:
假设主动关闭端为A,被动关闭端为B,A在收到B的FIN包,发送ACK之后状态就成了TIME_WAIT,如果这个ACK
丢失了,B端继续发FIN。如果A发送的ACK一直丢失,那么,在1MSL到2MSL之间的时间段内,如图*所在的时间点上,A发送的ACK就有可能成为重复数据包,这样再过不
到1MSL的时间,A状态变为CLOSED,接着AB之间马上建立相同的链接,之前的ACK还是有可能会出现啊,因为时间不到MSL,如图:
|------|------|
0 1 * 2
不知道我描述清楚了没有,望高手解答。
|
你的理解基本正确但是有一点需要澄清
在A处于time wait状态的时候,如果收到另外一个FIN (B的重传),需要reset 2MSL的timer
所以在你举的例子里面,当B resend FIN的时候,为了避免你所列举的问题,就需要重新开始等待
这也是为什么我们需要等2MSL而不是1MSL,就是为了等待可能的1MSL A的ACK timeout后给B resend FIN的机会
在A处于time wait状态的时候,如果收到另外一个FIN (B的重传),需要reset 2MSL的timer
所以在你举的例子里面,当B resend FIN的时候,为了避免你所列举的问题,就需要重新开始等待
这也是为什么我们需要等2MSL而不是1MSL,就是为了等待可能的1MSL A的ACK timeout后给B resend FIN的机会
|
这个是RFC的规定,参见 http://tools.ietf.org/html/rfc793#page-52
TIME-WAIT STATE
The only thing that can arrive in this state is a
retransmission of the remote FIN. Acknowledge it, and restart
the 2 MSL timeout.
收到重复报文,如果最近收到的seq no没有变化,可以发ack也可以不发,这个是实现相关的部分, 发ack的目的在于产生dup ack,促使receiver更快retransmit