半开连接是什么
一端认为连接仍然存在,另一端早已丢失连接状态,这种状态不同步的连接就叫半开连接。抓包上的表现是:一侧持续发送数据或重传却收不到任何确认,或者发送数据后突然收到 RST。长连接业务里,中间设备的会话老化、服务进程重启、地址漂移都会制造半开连接。
基本信息
| 本质 | 两端连接状态不同步 |
|---|---|
| 抓包表现 | 单向持续发送与重传无响应,或数据后突现 RST |
| 常见成因 | NAT 或防火墙会话老化、服务重启、主机漂移 |
| 探测手段 | TCP Keep-Alive 或应用层心跳 |
| 内核参数 | net.ipv4.tcp_keepalive_time / intvl / probes(Linux) |
典型使用场景
- 长连接业务偶发请求失败,怀疑连接已被对端丢弃
- 跨 NAT 场景排查空闲一段时间后首个请求超时
- 核对应用心跳间隔与中间设备老化时间的关系
- 服务发布重启后确认旧连接是否被正确清理
- 判断失败是连接问题还是业务逻辑问题
排查步骤
排查步骤
1) 发送侧抓包看重传与超时,确认是否完全无响应
2) 接收侧抓包确认是否有该五元组的流量到达
3) 对照 NAT 或防火墙的会话老化时间与业务空闲时长
4) 应用心跳或 Keep-Alive 间隔应明显小于老化时间
5) 确认后重建连接,再复查中间设备配置现象与处理
| 现象 | 成因方向 | 处理动作 |
|---|---|---|
| 单向重传无响应 | 对端已丢失状态 | 核对中间设备老化时间 |
| 发送数据后收到 RST | 对端不存在该连接 | 确认服务是否重启过 |
| 空闲一段时间后失败 | 会话被中间设备回收 | 心跳间隔小于老化时间 |
| 重连后立即恢复 | 连接被重建 | 检查应用是否具备重连机制 |
半开连接上的重传会持续相当长时间,抓包窗口太短容易误判为「一直正常」。
排查顺序建议先恢复业务(让连接重建),再回头核对老化参数与心跳设置。