TCP 流分析82 条

TCP 半开连接判读

一方认为连接存在、另一方已丢失状态:抓包表现为发出数据长时间无 ACK(被对端 RST 或静默丢弃),长连接环境常见于 NAT 超时或进程重启。

半开连接是什么

一端认为连接仍然存在,另一端早已丢失连接状态,这种状态不同步的连接就叫半开连接。抓包上的表现是:一侧持续发送数据或重传却收不到任何确认,或者发送数据后突然收到 RST。长连接业务里,中间设备的会话老化、服务进程重启、地址漂移都会制造半开连接。

基本信息

本质两端连接状态不同步
抓包表现单向持续发送与重传无响应,或数据后突现 RST
常见成因NAT 或防火墙会话老化、服务重启、主机漂移
探测手段TCP Keep-Alive 或应用层心跳
内核参数net.ipv4.tcp_keepalive_time / intvl / probes(Linux)

典型使用场景

  • 长连接业务偶发请求失败,怀疑连接已被对端丢弃
  • 跨 NAT 场景排查空闲一段时间后首个请求超时
  • 核对应用心跳间隔与中间设备老化时间的关系
  • 服务发布重启后确认旧连接是否被正确清理
  • 判断失败是连接问题还是业务逻辑问题

排查步骤

排查步骤
1) 发送侧抓包看重传与超时,确认是否完全无响应
2) 接收侧抓包确认是否有该五元组的流量到达
3) 对照 NAT 或防火墙的会话老化时间与业务空闲时长
4) 应用心跳或 Keep-Alive 间隔应明显小于老化时间
5) 确认后重建连接,再复查中间设备配置

现象与处理

现象成因方向处理动作
单向重传无响应对端已丢失状态核对中间设备老化时间
发送数据后收到 RST对端不存在该连接确认服务是否重启过
空闲一段时间后失败会话被中间设备回收心跳间隔小于老化时间
重连后立即恢复连接被重建检查应用是否具备重连机制
半开连接上的重传会持续相当长时间,抓包窗口太短容易误判为「一直正常」。
排查顺序建议先恢复业务(让连接重建),再回头核对老化参数与心跳设置。

易错点

  • 只在服务端抓包:半开连接的一端往往看不到流量,必须同时取客户端侧证据
  • 把重传等待期当成网络丢包:对端不存在连接时不会有任何响应,与丢包表现相似但成因不同
  • 心跳间隔与老化时间不做比较就下结论:两者的大小关系才是判断依据

数据来源与参考

  • RFC 1122(Keep-Alive)
  • RFC 9293(连接状态)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌