首页/网络/抓包与流量分析速查/半开连接的检测手段对比
TCP 流分析82 条

半开连接的检测手段对比

内核 Keep-Alive、应用层心跳、使用前探测三种方式各有代价:抓包可见心跳流量形态,设计时应让检测间隔小于中间设备老化时间。

半开检测是什么

半开连接指一方已经消失、另一方仍认为连接可用。检测手段分三类:内核 Keep-Alive 探活、应用层心跳,以及只在真正发送时才发现的惰性探测,三者代价各不相同。内核探活由系统参数统一控制,周期调整粒度较粗;应用心跳完全自定义,代价是占用协议设计;惰性探测没有额外流量,代价是首次请求必然失败一次。设计上的硬约束是探测间隔必须小于路径上设备(NAT、防火墙、负载均衡)的会话老化时间,否则连接会在安静期被静默清理。

基本信息

三类方式内核 Keep-Alive、应用心跳、惰性探测
内核参数tcp_keepalive_time、tcp_keepalive_intvl、tcp_keepalive_probes
关键约束探测间隔小于链路最短的会话老化时间
恢复动作断线重连需要带退避与随机抖动
观察方式抓包统计探活报文的周期与大小

典型使用场景

  • 长连接维护:确认空闲连接能否在设备老化时间内被探活保住
  • 方案选型:按业务能否改动协议,选择应用心跳还是内核探活
  • 故障复盘:确认连接显示正常却发不出数据,是否设备已清理会话
  • 移动网络优化:运营商网关老化时间短,心跳是常见保活手段
  • 重连风暴防范:验证重连退避是否真正生效

查看与核对

查看与核对
sysctl net.ipv4.tcp_keepalive_time net.ipv4.tcp_keepalive_intvl
ss -o state established '( dport = :443 )'    # 查看连接上的定时器
tcp.len == 0 && tcp.flags.ack == 1            # 筛出无载荷的探活报文
# 统计相邻探活报文的时间差,与设备老化时间对比

三类方式对比

方式间隔可控性流量特征代价
内核 Keep-Alive由系统参数统一控制周期性无载荷小包调整粒度粗,影响全机连接
应用心跳应用自定义出现在业务协议之内占用协议设计并增加流量
惰性探测仅在发送时触发首包失败后重试首次请求必然失败一次
检测到半开之后的恢复动作同样重要:重连要带指数退避与随机抖动,否则依赖恢复的瞬间所有客户端同时重连,会造成二次冲击。
探活报文很小,容易在主列表里被忽略;核对周期时先用过滤条件单独筛出来统计时间间隔,避免凭印象判断。

易错点

  • 心跳间隔大于路径设备老化时间是常见设计缺陷,取值应当按链路上最短的老化时间来定,而不是按应用侧的偏好
  • 抓包中探活报文太小容易被忽略,不专门过滤就得出没有心跳的结论,会造成完全相反的判断
  • 只依赖内核 Keep-Alive 时默认周期往往在小时级,远大于多数设备的老化时间,需要显式调整才能生效
  • 重连不加退避会在依赖恢复时形成重连风暴,把刚刚恢复的服务再次压垮

数据来源与参考

  • RFC 1122(Keep-Alive)
  • RFC 5382(NAT 行为)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌