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