首页/网络/网络排障速查/长连接保活与中间设备超时匹配

长连接保活与中间设备超时匹配

长连接被静默回收是『闲置后第一个请求失败』的经典根因:应用心跳间隔必须小于 NAT/LB 的空闲超时,必要时同时调小内核 keepalive。

网络排障速查网络更新于 2026-10-13

长连接为什么被静默回收

长连接「闲置一段时间后第一个请求失败、之后又恢复正常」是典型的会话被中间设备回收:NAT 网关、防火墙、负载均衡都维护会话表,空闲超过阈值就删除表项,两端应用却不知道,直到下次发包才发现对端已无状态。解法是让保活流量比中间设备的空闲超时更频繁,把这个阈值摸清楚是关键。应用层心跳最可靠,因为内核 keepalive 只对 TCP 层可见,且默认间隔长达两小时。

基本信息

内核默认net.ipv4.tcp_keepalive_time 为 7200 秒,远大于常见的 300 至 900 秒会话超时
应用侧心跳间隔取中间设备超时的一半以内,例:超时 350 秒则心跳 120 秒
内核参数tcp_keepalive_time、tcp_keepalive_intvl、tcp_keepalive_probes
观测命令ss -tino 看 keepalive 定时器与重传计数

典型使用场景

  • 消息推送长连接夜间掉线:核对心跳与 NAT 空闲超时的关系
  • 数据库连接池出现陈旧连接:池内存活检测要覆盖中间设备超时
  • 云负载均衡后长连接被断开:调整 LB 空闲超时或应用心跳
  • 移动网络下连接频繁失效:运营商侧会话回收时间更短
  • 调整内核保活参数:让内核探测与应用心跳互相配合

现状核对与设置

现状核对与设置
ss -tino state established '( dport = :443 )' | head   # 看 keepalive 定时器
sysctl net.ipv4.tcp_keepalive_time net.ipv4.tcp_keepalive_intvl net.ipv4.tcp_keepalive_probes
# 建议:应用层心跳小于中间设备空闲超时的一半
# 例:NAT 超时 350 秒 → 心跳 120 秒
sysctl -w net.ipv4.tcp_keepalive_time=120        # 临时验证,重启失效
# 永久生效写入 /etc/sysctl.d/ 下的配置文件后再 sysctl --system

现象与归因

现象可能原因验证方式
闲置后首个请求超时NAT 或防火墙回收会话两侧抓包看首个包是否有 RST
连接被对端复位LB 空闲超时主动断开查 LB 会话日志与超时配置
心跳无响应但连接仍显示 ESTAB中间设备单向丢包两端对照抓包比对心跳
夜间固定时段掉线策略设备定时清理会话核对策略设备的空闲老化时间
单向心跳不够:部分设备只统计双向流量或只放行已建会话的回包,建议由一端发起且能收到响应,才算真正刷新了中间设备的状态。

易错点

  • 依赖系统默认 keepalive 保护长连接:两小时的默认间隔下,中间设备早就把会话删了
  • 心跳间隔大于中间设备超时,等于没做保活,故障照旧按周复现
  • 只改内核参数不改中间设备:网关侧老化时间才是真正的决定因素
  • 心跳占用过多带宽:高频小包在移动网络上会显著增加耗电与流量,需权衡间隔

数据来源与参考

  • RFC 1122 §4.2.3.6:TCP Keep-Alive
  • Linux 内核文档:tcp_keepalive_*

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌