Linux默认TCP Keepalive参数不适用于长连接,需调优内核参数并应用层启用SO_KEEPALIVE:tcp_keepalive_time设为300~600秒、intvl设为30~60秒、probes设为3~5次,再通过setsockopt显式开启。

Linux系统默认的TCP Keepalive参数对长连接并不友好,空闲两小时才开始探测,等真正发现断连往往已过去两个多小时。要解决空闲时无声断开的问题,必须主动调优内核参数,并配合应用层正确启用。
关键参数含义与推荐值
Keepalive生效依赖三个内核参数,它们共同决定探测时机和判定逻辑:
- tcp_keepalive_time:连接空闲多久后发起首次探测。默认7200秒(2小时),建议设为300~600秒(5~10分钟)
- tcp_keepalive_intvl:两次探测之间的间隔。默认75秒,建议设为30~60秒
- tcp_keepalive_probes:连续无响应后认定失效的探测次数。默认9次,建议设为3~5次
用Sysctl临时修改参数
执行以下命令可立即生效(重启后失效):
sudo sysctl -w net.ipv4.tcp_keepalive_time=300<br>sudo sysctl -w net.ipv4.tcp_keepalive_intvl=30<br>sudo sysctl -w net.ipv4.tcp_keepalive_probes=5
验证是否生效:
sysctl net.ipv4.tcp_keepalive_time net.ipv4.tcp_keepalive_intvl net.ipv4.tcp_keepalive_probes
永久保存配置
编辑/etc/sysctl.conf,追加以下三行:
net.ipv4.tcp_keepalive_time = 300<br>net.ipv4.tcp_keepalive_intvl = 30<br>net.ipv4.tcp_keepalive_probes = 5
然后运行sudo sysctl -p加载新配置。该设置将在每次系统启动时自动应用。
应用层仍需显式启用SO_KEEPALIVE
内核参数只是“允许探测”,但每个socket默认不开启Keepalive。服务端或客户端代码中必须调用setsockopt:
- C语言示例:
int opt = 1; setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &opt, sizeof(opt)); - 若需覆盖全局参数,还可额外设置
TCP_KEEPIDLE、TCP_KEEPINTVL、TCP_KEEPCNT(优先级高于sysctl) - 注意:仅设置sysctl而不调用
SO_KEEPALIVE,该socket仍不会发送探测包


















