码仔漫画:如何跟女朋友 “四次挥手”

网络 通信技术
MSL 是 Maximum Segment Lifetime,报文最大生存时间,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。

[[357361]]

本文转载自微信公众号「码个蛋」,作者码仔。转载本文请联系码个蛋公众号。  

MSL 是 Maximum Segment Lifetime,报文最大生存时间,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。因为 TCP 报文基于是 IP 协议的,而 IP 头中有一个 TTL 字段,是 IP 数据报可以经过的最大路由数,每经过一个处理他的路由器此值就减 1,当此值为 0 则数据报将被丢弃,同时发送 ICMP 报文通知源主机。

MSL 与 TTL 的区别:MSL 的单位是时间,而 TTL 是经过路由跳数。所以 MSL 应该要大于等于 TTL 消耗为 0 的时间,以确保报文已被自然消亡。

TIME_WAIT 等待 2 倍的 MSL,比较合理的解释是:网络中可能存在来自发送方的数据包,当这些发送方的数据包被接收方处理后又会向对方发送响应,所以一来一回需要等待 2 倍的时间。

比如如果被动关闭方没有收到断开连接的最后的 ACK 报文,就会触发超时重发 Fin 报文,另一方接收到 FIN 后,会重发 ACK 给被动关闭方, 一来一去正好 2 个 MSL。

2MSL 的时间是从客户端接收到 FIN 后发送 ACK 开始计时的。如果在 TIME-WAIT 时间内,因为客户端的 ACK 没有传输到服务端,客户端又接收到了服务端重发的 FIN 报文,那么 2MSL 时间将重新计时。

在 Linux 系统里 2MSL 默认是 60 秒,那么一个 MSL 也就是 30 秒。Linux 系统停留在 TIME_WAIT 的时间为固定的 60 秒。

其定义在 Linux 内核代码里的名称为 TCP_TIMEWAIT_LEN:

  1. #define TCP_TIMEWAIT_LEN (60*HZ) /* how long to wait to destroy TIME-WAIT   
  2.  state, about 60 seconds  */ 

如果要修改 TIME_WAIT 的时间长度,只能修改 Linux 内核代码里 TCP_TIMEWAIT_LEN 的值,并重新编译 Linux 内核。

需要 TIME-WAIT 状态,主要是两个原因:

  • 防止具有相同「四元组」的「旧」数据包被收到;
  • 保证「被动关闭连接」的一方能被正确的关闭,即保证最后的 ACK 能让被动关闭方接收,从而帮助其正常关闭;

 

责任编辑:武晓燕 来源: 码个蛋
相关推荐

2024-07-11 10:55:27

2020-12-08 06:34:16

TCP握手SYN 报文

2022-07-08 10:04:57

客户端ACKFIN

2019-10-23 07:00:13

TCP三次握手四次挥手

2021-10-14 20:33:16

TCP连接关闭

2020-10-21 08:59:50

删库程序员虚拟机

2015-10-13 09:42:52

TCP网络协议

2019-06-12 11:26:37

TCP三次握手四次挥手

2019-07-16 11:06:09

TCP四次挥手半关闭

2024-01-12 08:23:11

TCPACK服务器

2021-07-03 17:47:25

TCP控制协议

2023-09-02 22:02:58

TCP协议四次挥手

2022-08-05 11:03:59

TCP 四次挥手三次握手

2021-01-29 06:11:08

TCP通信三次握手

2021-05-18 12:27:40

TCP控制协议

2019-02-01 09:38:16

2023-10-24 15:22:09

TCPUDP

2020-01-09 09:31:05

三次握手四次挥手 TCP

2020-02-17 10:10:43

TCP三次握手四次挥手

2017-09-25 21:27:07

TCP协议数据链
点赞
收藏

51CTO技术栈公众号