TCP:过多的TIME_WAIT

过多的TIME_WAIT

线上问题

线上机器出现了几万个TIME_WAIT,怎么办?

紧急处理方式

tcp_tw_reuse

启用

默认情况下tcp_tw_reuse是关闭状态,使用sysctl -w net.ipv4.tcp_tw_reuse=1命令启用。

bash 复制代码
[baichao@localhost ~]$ cat /proc/sys/net/ipv4/tcp_tw_reuse
0
[baichao@localhost ~]$ sudo sysctl -w net.ipv4.tcp_tw_reuse=1
[sudo] password for baichao:
net.ipv4.tcp_tw_reuse = 1
[baichao@localhost ~]$ cat /proc/sys/net/ipv4/tcp_tw_reuse
1

tcp_tw_reuse 允许重用处于 TIME_WAIT 状态的连接,而不必等待其 TIME_WAIT 持续时间(通常是 2 MSL)结束。

主要特点:

  • 功能:当启用该选项时,Linux 内核允许新的 TCP 连接重用那些处于 TIME_WAIT 状态的连接(即相同的四元组:源 IP、源端口、目标 IP 和目标端口)。 这种重用仅适用于客户端发起的连接,例如,短时间内同一个客户端需要和同一服务器建立多个连接。
  • 实现:通过允许重用 TIME_WAIT 中的端口,减少 TIME_WAIT 状态下的资源占用(特别是端口号的消耗)。
  • 风险:因为 TIME_WAIT 状态的存在是为了确保旧数据包不会影响新连接,如果网络中的旧报文仍然存在,可能会导致新连接接收到这些旧报文,进而产生数据混乱。
  • 适用场景:在客户端场景下,频繁发起与同一服务器的连接时可以开启该选项,如高频的短连接请求应用。这在客户端或网关类设备中较为常用。

源码

c 复制代码
{
		/*
		 * 这段代码是 Linux 内核中用来注册一个 sysctl 配置项的代码片段。
		 * 它的作用是通过 /proc/sys/net/ipv4/tcp_tw_reuse 这个路径,允许用户读取和修改 tcp_tw_reuse 配置参数。
		 * tcp_tw_reuse 允许重用处于 TIME_WAIT 状态的连接,而不必等待其 TIME_WAIT 持续时间(通常是 2 MSL)结束。
		 */
		.procname	= "tcp_tw_reuse",
		/*
		 * 这是指向实际存储 tcp_tw_reuse 值的内存地址的指针。&init_net.ipv4.sysctl_tcp_tw_reuse 指向的是全局变量 sysctl_tcp_tw_reuse,它保存了当前的 tcp_tw_reuse 配置值。
         * init_net 是 Linux 内核网络命名空间的结构体,ipv4 是其中的 IPv4 相关设置,而 sysctl_tcp_tw_reuse 是 tcp_tw_reuse 的具体存储变量。
		 */
		.data		= &init_net.ipv4.sysctl_tcp_tw_reuse,
		/*
		 * 这定义了 tcp_tw_reuse 变量的大小。在这里,tcp_tw_reuse 是一个整型变量,因此 maxlen 被设置为 sizeof(int),即 4 字节。
         * 这确保读写操作时,处理的是整数值,防止用户写入错误长度的数据。
		 */
		.maxlen		= sizeof(int),
		/*
		 * 这是该 sysctl 文件的权限设置。0644 代表该文件的读写权限:
         * 文件拥有者可以读和写(rw-)。
         * 文件所属组和其他用户只能读取(r--)。
         * 这意味着,普通用户可以读取这个配置项的值,但只有 root 用户可以修改它。
		 */
		.mode		= 0644,
		/*
		 * proc_dointvec_minmax 是一个处理函数,它定义了如何读取和写入这个 sysctl 变量。
         * proc_dointvec_minmax 具体负责对该变量进行范围检查(即它不能超过指定的最小值或最大值),并确保数据的合法性。
		 */
		.proc_handler	= proc_dointvec_minmax,
		/*
		 * extra1 定义了 tcp_tw_reuse 的最小值。SYSCTL_ZERO 是一个指向全局常量 0 的指针,意味着 tcp_tw_reuse 的最小值为 0。
         * tcp_tw_reuse 是一个布尔值或整型配置,0 通常表示关闭。
		 */
		.extra1		= SYSCTL_ZERO,
		/*
		 * extra2 定义了 tcp_tw_reuse 的最大值。这里设置为 &two,表示最大值为 2。
         * 根据这段代码的逻辑,tcp_tw_reuse 的取值范围是 0 到 2,而不是传统的 0 或 1。这个设置可能是为了未来扩展或特定版本的功能增加。
		 */
		.extra2		= &two,
	}
相关推荐
treesforest4 分钟前
游戏账号安全风险分层方案:IP信号分层与人机复核实践
tcp/ip·安全·游戏·1024程序员节
流浪0012 小时前
计算机网络篇8:传输层——序列化与反序列化,TCP 面向字节流的报文边界由应用层自己切
网络协议·tcp/ip·计算机网络·1024程序员节·序列化反序列化·面向字节流·面向数据包
lazy H5 小时前
【计算机网络】第 5 篇:TCP 和 UDP 有什么区别?从 Java 后端场景理解两种传输协议
经验分享·后端·网络协议·tcp/ip·计算机网络·1024程序员节
星恒随风6 小时前
Linux网络编程基础(二):彻底理解局域网通信、MAC与IP地址、数据封装、端口号、网络字节序及Socket接口
linux·网络·笔记·学习·tcp/ip·1024程序员节
Sirens.8 小时前
网络通信基础:IP、端口、协议分层与数据封装
java·网络·网络协议·tcp/ip·java-ee·1024程序员节
码完就睡8 小时前
Linux——IP协议与路由选择
linux·网络·tcp/ip·1024程序员节
qq_429432309 小时前
叫班系统对接 IP-PBX/SIP 与排班系统:接口方式与部署选型要点
网络·网络协议·tcp/ip·信息与通信·ip·1024程序员节·voip通信协议
智慧光迅AINOPOL17 小时前
园区全光网IP+POL架构怎么设计:组网拓扑与带宽演进
网络协议·tcp/ip·架构
TechWayfarer19 小时前
PHP漏洞被利用,怎么揪出攻击IP?
开发语言·python·tcp/ip·网络安全·php
ITxiaobing20231 天前
IP 定位服务怎么选:没有“公认第一”,只有场景匹配
服务器·网络协议·tcp/ip