四次挥手
TCP是全双工,半关闭的。TCP连接的两端都可以主动关闭连接。TCP连接关闭时,需要经过四次挥手(four-way-wavehand)。
假设,主动关闭的一端是A,被动关闭的一端是B,那么四次挥手的过程如下:
A虽然不再向B发送数据了,但是,B仍然可以向A发送数据,A仍然可以接收数据。等到B也发送完数据之后,
为什么主动关闭的一端要等待2MSL之后,才能进入到CLOSED状态
- MSL,是Maximum Segment Lifetime的简写,它表示分段的最大存活时间
- 如果主动关闭的一方的最后一个ACK报文,没能顺利地到达被动关闭的一方。被动关闭的一方,就会认为自己发送的FIN报文丢失了,等待到超时之后,就会重发FIN报文。如果此时主动关闭的一方,将端口释放了,那么操作系统就会返回一个RST报文给对端,导致被动关闭的一方,会报告一个错误。因此,主动关闭的一方,需要等待一段时间,保证当对端没有收到ACK报文,而重发FIN报文时,再次发送ACK报文,使被动关闭的一方能正常关闭。这个等待的时间就是:去向ACK报文的最大存活时间 + 来向FIN报文的最大存活时间,也就是2MSL
- 不同的TCP分段,可能是经过不同的路由到达的接收端。所以,在四挥手完成之后,可能在网络中,还有残留的TCP分段。如果主动关闭的一端不等待,把端口释放掉,并且,又重新建立了一个新的连接,这个新的连接和原来的连接的(源IP,源端口,目的IP,目的端口,协议)完全一样。那么之前残留在网络中的分段,就会干扰新的连接中的分段。所以,主动关闭的一端,需要等待到网络中残留的分段全部死掉,才能释放端口。而2MSL足以保证所有的残留分段死去