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 能让被动敞开方接管,从而帮忙其失常敞开;