讨论/《计算机网络面试突击》 - TIME-WAIT 为什么是 2MSL/
《计算机网络面试突击》 - TIME-WAIT 为什么是 2MSL
共 5 个回复

注意区分MSL,RTT,TTL:
MSL报文最大生存时间,TTL生存时间(跳数),RTT客户到服务器往返所花时间

  1. MSL是Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。因为tcp报文(segment)是ip数据报(datagram)的数据部分。
  2. 而ip头中有一个TTL域,TTL是time to live的缩写,中文可以译为“生存时间”,这个生存时间是由源主机设置初始值但不是存的具体时间,而是存储了一个ip数据报可以经过的最大路由数,每经过一个处理他的路由器此值就减1,当此值为0则数据报将被丢弃,同时发送ICMP报文通知源主机。RFC 793中规定MSL为2分钟,实际应用中常用的是30秒,1分钟和2分钟等。
    2MSL即两倍的MSL,TCP的TIME_WAIT状态也称为2MSL等待状态,当TCP的一端发起主动关闭,在发出最后一个ACK包后,即第3次握手完成后发送了第四次握手的ACK包后就进入了TIME_WAIT状态,必须在此状态上停留两倍的MSL时间,等待2MSL时间主要目的是怕最后一个ACK包对方没收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。在TIME_WAIT状态时两端的端口不能使用,要等到2MSL时间结束才可继续使用。当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。不过在实际应用中可以通过设置SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口。
    TTL与MSL是有关系的但不是简单的相等的关系,MSL要大于等于TTL。
  3. RTT是客户到服务器往返所花时间(round-trip time,简称RTT),TCP含有动态估算RTT的算法。TCP还持续估算一个给定连接的RTT,这是因为RTT受网络传输拥塞程序的变化而变化。
    表示从发送端发送数据开始,到发送端收到来自接收端的确认(接收端收到数据后便立即发送确认),总共经历的时延。
    一般认为单向时延=传输时延t1+传播时延t2+排队时延t3
    t1是数据从进入节点到传输媒体所需要的时间,通常等于数据块长度/信道带宽
    t2是信号在信道中需要传播一定距离而花费的时间,等于信道长度/传播速率(光纤中电磁波的传播速率约为210^5 km/s,铜缆中2.310^5 km/s)
    t3可笼统归纳为随机噪声,由途径的每一跳设备及收发两端负荷情况及吞吐排队情况决定(包含互联网设备和传输设备时延)
    参考:https://blog.csdn.net/guizaijianchic/article/details/77744004
7

如果服务器在1MSL后仍然没有收到客户端发送的ACK确认报文,那么它会向客户端重传FIN报文,对客户端而言,从客户端发出ACK报文起,重传的FIN报文的最晚到达时间是2MSL.

2

处理延迟的重复报文,这主要是为了避免前后两个使用相同四元组的连接中的前一个连接的报文干扰后一个连接。
2MSL确保了所有重传的FIN都可以消失在网络中。

2

一来是让客户端发送完数据,二来是为了如果没有发送成功数据服务器重传的FIN也能消失在网络中

如果第四次握手客户端发的ACK丢失,1MSL后服务器超时重发FIN包,但又丢失,此时客户端计时器达到2MSL仍未收到FIN包,认为服务器端已经OK了,直接进入CLOSE。但服务器还在等ACK,一直超时重传FIN包:直到有一次FIN包到达客户端,客户端发送RST告知服务器重置这条链接,服务器端才进入CLOSE;或者 服务器一直超时重传FIN包,直到最大重传次数,才关闭链接进入CLOSE状态。