TCP 流分析82 条

TCP FIN 重传判读

FIN 也是序号语义的一部分,未确认会重传:抓包中同一 FIN 再次出现说明对端未确认,常见于对端进程卡死或链路丢包。

FIN 重传是什么

FIN 标志同样占用一个序号,属于需要被对端确认的报文段;一旦对端不回应,本端就会按重传超时(RTO)反复重发。抓包判据是:同一方向上出现两个及以上携带 FIN 标志、且序号相同的报文段。常见成因有三种:对端进程已崩溃或被强制结束,不再回应任何报文;路径丢包,确认报文没能回来;NAT 或防火墙提前清掉了会话表项,导致 FIN 被丢弃。它不影响已传输数据的完整性,但会显著拖长连接释放时间并让端口状态长时间无法回收。

基本信息

协议依据RFC 9293(TCP 连接释放)
判据同一方向、相同序号的 FIN 报文重复出现
过滤条件tcp.flags.fin == 1 && tcp.analysis.retransmission
重传间隔通常呈 RTO 退避,逐次翻倍
影响面关闭变慢、端口与文件描述符回收滞后

典型使用场景

  • 排查连接释放慢:业务观察到连接数迟迟不下降时,先看 FIN 是否在重传
  • 推断对端异常:对端进程崩溃或被强杀之后不会确认 FIN,属半开连接的典型形态
  • 与 TIME_WAIT 区分:TIME_WAIT 是本端主动关闭后的正常状态,FIN 重传则说明对端没回应对
  • 验证中间设备:NAT 或防火墙提前清理会话时,会出现单向 FIN 无人应答
  • 质量统计:把 FIN 重传纳入连接释放阶段的健康指标

过滤与观察

过滤与观察
tcp.flags.fin == 1 && tcp.analysis.retransmission   # 关闭阶段重传
tcp.stream == N && tcp.flags.fin == 1                # 指定流的所有 FIN
tcp.analysis.retransmission && tcp.len == 0          # 只看重传且无数据的分段
# 核对重传间隔是否按超时退避逐次翻倍

成因对照

成因抓包表现进一步验证
对端进程消失单向 FIN 反复重发,全程无对端报文核对对端进程与系统日志
路径丢包FIN 重传同时伴有数据重传与重复确认看同流其他方向是否也在丢
NAT 会话提前老化FIN 发出后无响应,随后新建连接正常对比设备会话老化时间
重传间隔接近 RTO 且逐次翻倍,是超时重传的特征;如果同样的 FIN 帧以极短间隔出现两次,先确认抓包点位是否单一,多抓包点镜像同一会话会产生重复帧。

易错点

  • 把 FIN 重传当成数据丢包处理会找错方向:关闭阶段没有应用数据在传,问题出在释放策略或对端进程状态上
  • 对端进程被强杀或机器断电时不会回 FIN,本端只能重传耗尽超时,特征是单向 FIN 反复重发且全程没有对端报文
  • 短连接密集场景下大量 FIN 重传会累积占用端口与文件描述符,现象与 TIME_WAIT 堆积相似,需要按方向与标志位区分
  • 多抓包点镜像同一会话会看到重复帧,容易被误判成链路重传,分析前先确认抓包点位是否唯一

数据来源与参考

  • RFC 9293(FIN 重传)
  • Wireshark User's Guide
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌