TCP连接的建立三次握手,连接的断开需要四次挥手。
TCP连接在四次挥手的过程中,主动关闭的一端往往会进入一个叫time_wait的状态。
这个状态是被动关闭端发出FIN分节以后,被动端就会进入Last_ack状态,主动关闭端接受到这个FIN分节以后就会发出最后一个ack分节,并进入time_wait状态,一般是持续2MSL时间,MSL时间是说最长分节生命存活期,每个IP数据包在因特网中存活的时间都是有限的,每个数据包都含有一个叫跳限的字段,任何一个TCP实现都需要为MSL设定一个值。
RFC文档中建议为2分钟,不过实现传统上一般认为是30秒,所以一般time_wait状态维持的一个时间就是在1分钟到4分钟之间。
time_wait状态存在的两个理由:
1、保证tcp全双工能够完全终止。
2、允许老的重复分节在互联网中消逝。
但是我们可以通过修改内核的参数去缩短这个时间,加速tcp连接的快速回收复用。
但是这会带来两个问题:
1、如果最后一个ack包丢掉了,可能导致server端并没有接收到最后一个ack,那么过一段时间会进行重传FIN分节,就会导致这个新连接接收到这个分节而终止。
2、可能上一个连接在互联网中仍然存在着一些分节,在这个新连接建立以后,就会突然接收到这些上一个连接的数据。
通过time_wait状态就能够保证上个连接的数据在网络中都已经消逝了。