TIME_WAIT详解

TIME_WAIT 作用

TIME-WAIT是TCP链接的一种状态 , 四次挥手中TIME_WAIT只在主动关闭的过程中出现,实际上TIME_WAIT是TCP为了解决复杂的网络问题提出的一种解决方案 。

  • 四次挥手中,A 发 FIN, B 响应 ACK,B 再发 FIN,A 响应 ACK 实现连接的关闭。而如果 A 响应的 ACK 包丢失,B 会以为 A 没有收到自己的关闭请求,然后会重试向 A 再发 FIN 包。

    如果没有 TIME_WAIT 状态,A 不再保存这个连接的信息,收到一个不存在的连接的包,A 会响应 RST 包,导致 B 端异常响应。

    此时, TIME_WAIT 是为了保证全双工的 TCP 连接正常终止。

  • 我们还知道,TCP 下的 IP 层协议是无法保证包传输的先后顺序的。如果双方挥手之后,一个网络四元组(src/dst ip/port)被回收,而此时网络中还有一个迟到的数据包没有被 B 接收,A 应用程序又立刻使用了同样的四元组再创建了一个新的连接后,这个迟到的数据包才到达 B,那么这个数据包就会让 B 以为是 A 刚发过来的。

    此时, TIME_WAIT 的存在是为了保证网络中迷失的数据包正常过期。

第一种场景:TIME_WAIT是为了确保被动关闭方收到ACK,连接正常关闭,且不因被动关闭方重传FIN影响下一个连接。

第二种场景:TIME_WAIT保留2个MSL,以确保数据不会丢失。

由于以上的两种场景,TCP引入了TIME_WAIT状态来解决,由此可见TIME_WAIT并不是完全不存在才是合理的或以消除TIME_WAIT为优化的一个目标 。

参考链接

  1. 这些 TIME_WAIT 的性能优化,运维必须要了解的~ - 文章详情 (itpub.net)
  2. net.ipv4.tcp_max_tw_buckets 配置说明 - 简书 (jianshu.com)
  3. 解决TIME_WAIT过多造成的问题 - 芹溪 - 博客园 (cnblogs.com)
  4. (70条消息) TCP的TIME_WAIT作用与优化_anjingla的博客-CSDN博客_time_wait时间优化

优化

以下优化只需在有大量TIME_WAIT时优化,即nginx或web服务器,正常的tcp服务器不需要优化

1
2
3
4
5
/proc/sys/net/ipv4/ip_local_port_range 查看服务器随机端口范围
tcp_max_tw_buckets = 20000 #控制TIME_WAIT总数
tcp_tw_reuse = 1 #表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
tcp_timestamps = 1 #记录数据包的发送时间
net.ipv4.tcp_tw_recycle = 0 #表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。不建议开启

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!