TIME_WAIT状态
-
TIME_WAIT 状态,又称为 2MSL 等待状态。只有主动关闭一方才能进入 TIME_WAIT 状态。
- MSL(Maximum Segment Lifetime)表示报文段最大生存时间
- 当 TCP 协议进入 TIME_WAIT 状态时,必须要在这个状态停留 2 倍 MSL 的时间。
- tcp连接在TIME_WAIT状态必须存在2MSL才能进入CLOSE状态。
- 详情请看
-
用到2MSL原因
-
TCP在四次挥手中,可能出现最后一个ACK丢失,即客户端发送的ACK在网络中丢失了,服务就永远都收不到最后的ACK,服务器也就无法关闭这个tcp连接
- 2MSL计时器可以让客户端在丢失最后一个ACK确认时,等待服务器的下一个FIN到来,如果在TIME_WAIT状态中有一个新的FIN到来,那么客户端就发送一个新的ACK确认,并重新启动2MSL计时器。因为服务端收到客户端发送的ACK确认报文然后才进入close状态,如果一直没收到客户端发送的ACK确认报文,服务器则等待2MSL超时进入close状态(通常是可能会发送RST来关闭这条连接)。
-
保证了在2MSL时间内只创建一个连接
- 假设客户端和服务端已经建立了一条连接1,如果没有TIME_WAIT状态,客户端和服务端马上又建立了连接2,这可能会造成连接2可能会接收到连接1的tcp数据报,从而产生一些错误
-
FIN_WAIT_2状态
- 通常主动一方发起FIN报文,只要对端发送ACK确认后主动方就会处于FIN_WAIT2状态,然后等待对端发送FIN报文,如果一直没有发送FIN报文(就会一直处于CLOSE_WAIT状态,还有数据要发送,等等再关闭),那么主动一方就可能永远处于FIN_WAIT2状态,为了解决主动一方永远处于FIN_WAIT2状态,操作系统设置了一个定时器,如果这个连接空闲时间超时了,那么该连接将进入CLOSED状态。
- 详情请看