该状态主要是两个作用:
第一:确保主动发起关闭一方响应最后的一个ACK能够正常送达
第二:网络上仍然有可能有残余的数据包(wandering
duplicates,或老的重复数据包),我们也必须能够正常处理。
见图解。
分析过程要分析 是应用程序调用close 发起关闭还是tcp协议栈。
第一种情况好理解。保留连接状态2MSL(大约1-4分钟)长时间,确保4次握手最后一次ok。
第二种情况 分析
如果 TIME_WAIT 状态保持时间不足够长(比如小于2MSL),第一个连接就正常终止了。
第二个拥有相同相关五元组的连接出现,而第一
个连接的重复报文到达,干扰了第二
个连接。TCP实现必须防止某个连接的重复报文在连接终止后出现,所以让TIME_WAIT
状态保
持时间足够长(2MSL),连接相应方向上的TCP报文要么完全响应完毕,要么被
丢弃。建立第二个连接的时候,不会混淆。
编程中会经常使用SO_REUSEADDR,来表示可重用处于TIME_WAIT状态的相同五元组的连接。
现在有一个新的连接被建立起来,使用的IP地址与端口与先前的完全相同,后建立的连接又称作是原先连接的一个化身。还假定原先的连接中有数据报残存于网络
之中,这样新的连接收到的数据报中有可能是先前连接的数据报。为了防止这一点,TCP不允许从处于TIME_WAIT状态的socket建立一个连接。处
于TIME_WAIT状态的socket在等待两倍的MSL时间以后(之所以是两倍的MSL,是由于MSL是一个数据报在网络中单向发出到认定丢失的时
间,一个数据报有可能在发送图中或是其响应过程中成为残余数据报,确认一个数据报及其响应的丢弃的需要两倍的MSL),将会转变为CLOSED状态。这就
意味着,一个成功建立的连接,必然使得先前网络中残余的数据报都丢失了。在主动连接一次就要小心使用了,可能会造成混乱。所以要更具具体情况来确定是否使用。
由于TIME_WAIT状态所带来的相关问题,我们可以通过设置
SO_LINGER标志来避免socket进入TIME_WAIT状态,这可以通过发送RST而取代正常的TCP四次握手的终止方式。但这并不是一个很好
的主意,TIME_WAIT对于我们来说往往是有利的。
阅读(2345) | 评论(0) | 转发(1) |