第一:问题分析 TIME_WAIT状态做用!html
四次握手含义是:个人理解 服务器
TIME_WAIT:目的是让对端关闭以后,我在关闭,假如我先退出,对端在执close时候网络
没法收到发送的确认ack,这样抛出异常。就像connect同样,对端不存在 确定出错socket
TIME_WAIT状态原理tcp
----------------------------spa
通讯双方创建TCP链接后,主动关闭链接的一方就会进入TIME_WAIT状态。设计
客户端主动关闭链接时,会发送最后一个ack后,而后会进入TIME_WAIT状态,再停留2个MSL时间(后有MSL的解释),进入CLOSED状态。code
下图是以客户端主动关闭链接为例,说明这一过程的。orm
TIME_WAIT状态存在的理由server
----------------------------
TCP/IP协议就是这样设计的,是不可避免的。主要有两个缘由:
1)可靠地实现TCP全双工链接的终止
TCP协议在关闭链接的四次握手过程当中,最终的ACK是由主动关闭链接的一端(后面统称A端)发出的,若是这个ACK丢失,对方(后面统称B端)将重发出最终的FIN,所以A端必须维护状态信息(TIME_WAIT)容许它重发最终的ACK。若是A端不维持TIME_WAIT状态,而是处于CLOSED 状态,那么A端将响应RST分节,B端收到后将此分节解释成一个错误
于是,要实现TCP全双工链接的正常终止,必须处理终止过程当中四个分节任何一个分节的丢失状况,主动关闭链接的A端必须维持TIME_WAIT状态 。
2)容许老的重复分节在网络中消逝
TCP分节可能因为路由器异常而“迷途”,在迷途期间,TCP发送端可能因确认超时而重发这个分节,迷途的分节在路由器修复后也会被送到最终目的地,这个迟到的迷途分节到达时可能会引发问题。在关闭“前一个链接”以后,立刻又从新创建起一个相同的IP和端口之间的“新链接”,“前一个链接”的迷途重复分组在“前一个链接”终止后到达,而被“新链接”收到了。为了不这个状况,TCP协议不容许处于TIME_WAIT状态的链接启动一个新的可用链接,由于TIME_WAIT状态持续2MSL,就能够保证当成功创建一个新TCP链接的时候,来自旧链接重复分组已经在网络中消逝。
问题2:
何时结束呢.我在这里再讲到一个新名词:2MSL等待状态,其实TIME_WAIT就是2MSL等待状态,
为何要设置这个状态,缘由是有足够的时间让ACK包到达服务器端,若是服务器端没收到ACK包,
超时了,而后从新发一个FIN包,直到服务器收到ACK 包.
第二:代码验证:
参考:
http://coderworm.com/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B/2013/11/13/socket-half-close.html
tcpclient状态: ESTABLISHED -->TIME_WAIT --> [root@localhost socket]# netstat -anp |grep 9998 tcp 0 0 0.0.0.0:9998 0.0.0.0:* LISTEN 7267/./tcpserver tcp 0 0 127.0.0.1:9998 127.0.0.1:40604 ESTABLISHED 7292/./tcpserver tcp 0 0 127.0.0.1:40604 127.0.0.1:9998 ESTABLISHED 7291/./tcpclient [root@localhost socket]# netstat -anp |grep 9998 tcp 0 0 0.0.0.0:9998 0.0.0.0:* LISTEN 7267/./tcpserver tcp 0 0 127.0.0.1:40604 127.0.0.1:9998 TIME_WAIT - [root@localhost socket]# netstat -anp |grep 9998 tcp 0 0 0.0.0.0:9998 0.0.0.0:* LISTEN 7267/./tcpserver
参考:
http://www.360doc.com/content/10/1009/17/2245786_59637481.shtml
http://huoding.com/2014/11/06/383