【背景知识】TCP三次握手与四次挥手
http://blog.csdn.net/double_happiness/article/details/70160738
time_wait是什么?
通过上面三次握手和四次挥手的学习,在TCP连接断开的时候,断开的一方将处于time_wait状态。
为什么主动断开连接的一方将处于time_wait状态?
(1)等待被关闭方应答ACK确认
因为TCP协议是可靠的面向连接的协议,因此在任何情况下,都应该保证收发双方的数据能够被正确的发送到对端主机,一般来说主动断开的一方将处于time_wait状态,而被动关闭的一方则将处于close状态,这样就能确保发送的数据正确的到达对端主机。正如上文所讲的TCP断开连接的时候为什么是四次挥手而不是三次或者五次,显然聪明的设计人员经过反复的验证之后肯定是认为四次是最好的。再此我们应该知道在TCP协议中最后一次的ACK是不能保证正常传输的,因此当一方关闭连接时,假设它发送的ACK报文丢失了,那么被动关闭的一方将重新发送它的FIN,主动关闭的一方必须维持一个有效的状态信息(time_wait状态下维持),以便能够在次重发ACK报文。如果主动断开的一方不维持这种状态,而进入close状态,那么主动关闭的一方在处于close状态时,那么主动关闭的socket在处于close状态时,接受到FIN后会响应一个RST。被动关闭的一方接收到RST后会认为出错。如果TCP协议想要完成必要的操作而终止双方的数据流传输,就必须完全正确的传输四次握手的四个节,不能有任何的丢失。
(2)防止网络中残存的数据报丢失
假设关闭方和被关闭方都已经调用了close,同时进入了CLOSE状态,而没有进入time_wait状态。那么当有一个新的连接建立起来时,使用的IP地址与端口与先前的完全相同,后建立的连接是前一个连接的完全复用,这样就有可能收到原来残存在网络中的数据报。为了防止这一点,TCP不允许新连接复用time_wait状态下的socket。处于time_wait状态的socket在等待两倍的MSL时间以后,将会转变为CLOSED状态,这就意味着一个成功建立的连接,必然使得先前网络中残余的数据报都丢失。
为什么time_wait状态在socket下需要等待两倍的MSL?
MSL是一个数据在网络中单向发出到确认丢失的时间,一个数据报可能在发送途中丢失,也可能在其响应过程中成为残余数据报,确认一个数据报,因此确认一个数据报及其响应的丢弃需要两倍的MSL时间。