启用并调优so_keepalive是提升tcp代理链路健壮性的关键手段,需显式开启套接字选项并调整tcp_keepalive_time(建议600)、tcp_keepalive_intvl(建议30)、tcp_keepalive_probes(建议3)三个内核参数。

直接启用并调优 SO_KEEPALIVE 是提升 TCP 代理链路健壮性的关键手段。它能主动发现因 NAT、防火墙或对端异常退出导致的“假连接”,避免连接长时间挂死、资源泄漏或请求静默失败。
确认并启用 SO_KEEPALIVE 套接字选项
代理程序在创建客户端/服务端 socket 后,必须显式开启保活机制:
- 调用
setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &enable, sizeof(enable)),其中enable = 1 - 该操作是基础前提——不启用,后续所有内核参数均无效
- 建议在
accept()新连接后立即设置,确保每个长连接都受保护
调整三个核心内核参数(全局生效)
Linux 内核通过以下三个参数控制 Keepalive 行为,影响所有启用 SO_KEEPALIVE 的连接:
-
tcp_keepalive_time:空闲多少秒后开始发第一个探测包
默认 7200 秒(2 小时),对代理场景过长;建议设为 600(10 分钟)或更低 -
tcp_keepalive_intvl:两次探测之间的间隔
默认 75 秒;建议设为 30(30 秒),加快故障识别速度 -
tcp_keepalive_probes:连续无响应后断连前的最大探测次数
默认 9 次;建议设为 3,避免过度等待(总检测周期 ≈ 600 + 30×3 = 690 秒)
临时生效命令示例:sudo sysctl -w net.ipv4.tcp_keepalive_time=600sudo sysctl -w net.ipv4.tcp_keepalive_intvl=30sudo sysctl -w net.ipv4.tcp_keepalive_probes=3
持久化配置与生产环境注意事项
重启后需参数持续有效,应写入系统配置文件:
- 编辑
/etc/sysctl.conf,追加三行:net.ipv4.tcp_keepalive_time = 600net.ipv4.tcp_keepalive_intvl = 30net.ipv4.tcp_keepalive_probes = 3 - 执行
sudo sysctl -p加载生效 - 注意:
tcp_tw_reuse和tcp_tw_recycle已在较新内核中弃用或存在兼容风险,不推荐用于代理场景
应用层定制(高阶可控性)
若需为不同连接差异化控制(如上游数据库连接更激进、下游客户端连接更保守),可在启用 SO_KEEPALIVE 后,使用 Linux 特有选项单独设置:
-
TCP_KEEPIDLE:等效于tcp_keepalive_time,单位秒 -
TCP_KEEPINTVL:等效于tcp_keepalive_intvl,单位秒 -
TCP_KEEPCNT:等效于tcp_keepalive_probes - 调用方式:
setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPIDLE, &idle, sizeof(idle))等 - 要求内核 ≥ 3.7,且仅作用于当前 socket,不影响全局策略










