四次挥手的一般过程如图所示:
在客户端收到FIN结束报文的时候不是立刻进入CLOSED状态,而是进入TIME_WAIT状态,一般等2MLS后进入关闭状态。
原因:
1.可靠地终止 TCP 连接。
2.保证让迟来的 TCP报文段有足够的时间被识别并丢弃。
第一个原因很好理解。假设图FIN+ACK报文段丢失,那么服务器将重发结束报文段。因此客户端需要停留在某个状态以处理重复收到的结束报文段(即向服务器发送确认报文段)。否则,客户端将以复位报文段来回应服务器,服务器则认为这是一个错误,因为它期望的是一个像 FIN报文段那样的确认报文段。
在 Linux系统上,一个TCP端口不能被同时打开多次(两次及以上)。当一个TCP连接处于TIME WAIT 状态时,我们将无法立即使用该连接占用着的端口来建立一个新连接。反过来思考,如果不存在 TIME WAIT 状态,则应用程序能够立即建立一个和刚关闭的连接相似的连接(这里说的相似,是指它们具有相同的正地址和端口号)。这个新的、和原来相似的连接被称为原来的连接的化身(incarnation)。新的化身可能接收到属于原来的连接的、携带应用程序数据的TCP报文段(迟到的报文段),这显然是不应该发生的。这就是TIMEWAIT 状态存在的第二个原因。
另外,因为TCP报文段的最大生存时间是MSL,所以坚持2MSL时间的TIMEWAIT状态能够确保网络上两个传输方向上尚未被接收到的、迟到的TCP报文段都已经消失(被中转路由器丢弃)。因此,一个连接的新的化身可以在2MSL时间之后安全地建立,而绝对不会接收到属于原来连接的应用程序数据,这就是TIMEWAIT状态要持续2MSL时间的原因。