tcp通信TIME_WAIT状态问题

1 为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

 

tcp通信TIME_WAIT状态问题

MSL是最大报文生存时间,如果报文超过这个时间,就认为这个报文丢掉了

比如客户端A到B进行通讯,对于4次断开(挥手);

如果客户A在最后一次发送ack给B,如果中途丢失,客户B会重新向A发送FIN=1,ACK=1,即4次断开第3步骤,如何判断ack是否丢了呢?就是通过MSL(最大报文生存时间)来决定的;

如果B发送FIN=1,ACK=1,B会等待2MSL时间,因为B向A发送需要1MSL时间,A再向B发送ACK需要1MSL时间;如果B在2MSL时间内还没有收到A返回的ACK,那么B会重传FIN=1,ACK=1的分包给A

这就是MSL的概念,MSL就决定了1个分包单向传输的最长时间,如果超过,就认为丢掉了

在图中客户A TIME_WAIT为什么需要等待2MSL呢?

因为客户A在收到B发送过来的FIN=1,ACK=1分包后,首先会向B发送ACK,这个时间最大需要MSL,但是A需要保证B收到ACK,如果在此期间A向B发送的ACK丢掉了,A在此期间是不知道的,A只有收到第3步骤B向A发送的FIN=1,ACK=1的时候,A才能知道,A自己在第4步发送给B的ACK丢掉了,因此在B等待第4步A发送ACK期间,B经历了2MSL时间,所以A在2MSL时间内都没有收到,B向A发送的第3步的FIN=1,ACK=1的重传分包,A就会认为B收到了第4步,A向B发送的ACK分包了;

所以A才能进入CLOSED的状态

如果B没有收到ACK,那么在2个MSL时间内,A肯定会在2个MSL时间内 收到B向A发送的第3步的

FIN=1,ACK=1的分包的; A收到第3步FIN=1,ACK=1分包,会重新进入TIME_WAIT等待时间2MSL,

继续发送ACK,重试的流程;在A等待2MSL时间B能收到,A向B发送的最后1个ACK分包

2 MSL的大小一般为多少, 可否配置?

cat /proc/sys/net/ipv4/tcp_fin_timeout 

60

这里是2MSL的值,所以MSL值为30

修改

echo 30 >/proc/sys/net/ipv4/tcp_fin_timeout 

端口释放的更快

上一篇:为什么byte取值负128到127.md


下一篇:tcp四次挥手为什么要等待2MSL