乐趣区

关于网络传输协议:漫画|TCP的四次挥手

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:

define TCP_TIMEWAIT_LEN (60HZ) / how long to wait to destroy TIME-WAIT  

 state, about 60 seconds  */

如果要批改 TIME_WAIT 的工夫长度,只能批改 Linux 内核代码里 TCP_TIMEWAIT_LEN 的值,并从新编译 Linux 内核。

须要 TIME-WAIT 状态,次要是两个起因:

避免具备雷同「四元组」的「旧」数据包被收到;

保障「被动敞开连贯」的一方能被正确的敞开,即保障最初的 ACK 能让被动敞开方接管,从而帮忙其失常敞开;

退出移动版