TCP/IP中MSL 及 TIME_WAIT

MSL

是Maximum Segment Lifetime的英文缩写
可翻译为最长报文段寿命, 它是任何报文在网络上存在的最长时间, 超过这个时间段的报文将被丢弃, 我们知道IP头部有个TTL字段, TTL TIME TO LIVE 可以译为生存时间, 但不是一个存在的具体时间, 而是一个IP数据报可以经过的最大路由数, 没经过一个路由它的值就减1, 当此值为0则数据报被丢弃, ICMP报文通知源主机,

TCP 四次挥手

Screen Shot 2019-10-13 at 12.17.36 AM.png

TIME_WAIT

从TIME_WAIT状态到CLOSED状态有一个超时设置,这个超时设置是2MSL
(RFC793定义MSL为2分钟),那么为什么在TIME_WAIT后必须等待2MSL时间呢?主要原因有两点:

1. 保证对端已经关闭了连接

为了保证客户端发送的最后一个ACK报文段能够到达服务器端
比如: 服务端FIN的ACK没有收到, 会重传FIN,这个时候客户端在TIME_WAIT状态

对端处于LAST_ACK状态,本端发送的syn报文被直接RST掉了

2. 避免误收延迟到达的报文

我们都知道,假如A发送的第一个请求连接报文段丢失而未收到确认,A就会重传一次连接请求,后来B收到了确认,建立了连接。数据传输完毕后,就释放了连接。A共发送了两个连接请求报文段,其中第一个丢失,第二个到达了B。假如现在A发送的第一个连接请求报文段没有丢失,而是在某些网络节点长时间都留了,以至于延误到连接释放后的某个时间才到达B,这本来是已失效的报文段,但B并不知道,就会又建立一次连接。而等待的这2MSL就是为了解决这个问题的,A在发送完最后一个确认报后,在经过时间2MSL,
就可以使本链接持续时间内所产生的所有报文段都从网络中消失,
这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段

我们回到MSL,在2MSL时间内,该地址上的连接(客户端地址,端口和服务器的端口地址)不能被使用,比如我们在建立一个连接后关闭连接然后迅速重启连接,那么就会出现端口不可用的情况。

参考文献

https://blog.51cto.com/10706198/1775555

你可能感兴趣的:(TCP/IP中MSL 及 TIME_WAIT)