You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下如何让内核自动终止指定时长的空闲TCP连接?

让Linux内核自动终止空闲TCP连接(替代timerfd方案)

完全可以通过调整Linux内核的TCP参数或者针对单个套接字配置keepalive选项,让系统自动终止15秒无活动的TCP连接,无需自己实现timerfd逻辑。以下是两种可行方案:

一、全局系统参数配置(适合单程序机器)

Linux内核通过TCP keepalive机制管理空闲连接,你可以调整三个核心参数来控制超时逻辑:

  • net.ipv4.tcp_keepalive_time:最后一次数据交互后,开始发送keepalive探测包的等待时长(秒)
  • net.ipv4.tcp_keepalive_intvl:两次keepalive探测包的间隔时长(秒)
  • net.ipv4.tcp_keepalive_probes:连续发送多少个探测包无响应后,判定连接失效并终止

配置15秒空闲超时的计算逻辑

要实现总空闲15秒后终止连接,可以设置:

  • tcp_keepalive_time=12(12秒无数据后开始发探测)
  • tcp_keepalive_intvl=1(每隔1秒发一次探测)
  • tcp_keepalive_probes=3(连续3次无响应就断开)
    总空闲时长 = 12 + 1*3 = 15秒

临时生效命令(重启后失效)

sysctl -w net.ipv4.tcp_keepalive_time=12
sysctl -w net.ipv4.tcp_keepalive_intvl=1
sysctl -w net.ipv4.tcp_keepalive_probes=3

永久生效配置(写入sysctl.conf)

编辑/etc/sysctl.conf或/etc/sysctl.d/99-tcp-keepalive.conf,添加以下内容:

net.ipv4.tcp_keepalive_time=12
net.ipv4.tcp_keepalive_intvl=1
net.ipv4.tcp_keepalive_probes=3

然后执行sysctl -p让配置生效。

二、针对单个套接字配置(更灵活,不影响全局)

如果你想只让当前服务器的连接生效,而非修改全局参数,可以在accept()获取新套接字后,通过setsockopt()开启并配置keepalive选项:

#include <sys/socket.h>
#include <netinet/tcp.h>

// 假设new_fd是accept返回的客户端套接字
int enable = 1;
// 开启SO_KEEPALIVE选项
setsockopt(new_fd, SOL_SOCKET, SO_KEEPALIVE, &enable, sizeof(enable));

// 设置空闲12秒后开始探测
int idle_time = 12;
setsockopt(new_fd, IPPROTO_TCP, TCP_KEEPIDLE, &idle_time, sizeof(idle_time));

// 设置探测包间隔1秒
int intvl = 1;
setsockopt(new_fd, IPPROTO_TCP, TCP_KEEPINTVL, &intvl, sizeof(intvl));

// 设置连续3次探测无响应则断开
int probes = 3;
setsockopt(new_fd, IPPROTO_TCP, TCP_KEEPCNT, &probes, sizeof(probes));

注意事项

  • TCP keepalive依赖两端系统的支持,如果客户端系统禁用了keepalive,可能无法及时检测到空闲连接,但你的场景下服务器主动断开即可释放资源
  • 上述配置的超时是无数据交互的空闲时长,如果连接有心跳包或其他数据传输,超时会重新计算

内容的提问来源于stack exchange,提问作者Troy Hamilton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 06:34:52