首页/网络/抓包与流量分析速查/TCP 重复 ACK 的语义
TCP 流分析82 条

TCP 重复 ACK 的语义

重复 ACK 是接收端在"收到乱序/缺口"时重复发送同一确认号:它既是丢包信号,也可能由乱序引起;解读必须连同后续重传与 SACK 一起看。

重复 ACK 的语义

接收端每收到一个数据段都回确认。当它发现序列号出现缺口时,会把同一个确认号再发一次——这就是重复 ACK,本质是「我这里缺了一段,请补发」。对发送端来说,连续收到 3 个重复 ACK 就触发快速重传,不必等超时。因此重复 ACK 是丢包的早期信号,但也可能只是乱序造成的假信号。

基本信息

触发者接收端(缺口/乱序时补发同一确认号)
触发阈值3 个重复 ACK 触发快速重传(RFC 5681)
相关机制SACK 描述已收到的块,减少无谓重传
抓包表现连续相同的 ack 号,Wireshark 标注 TCP Dup ACK
系统级计数Linux 可用 netstat -s 或 nstat 查看重复 ACK 类计数,字段命名随内核版本略有差异

典型使用场景

  • 判断吞吐下降是丢包还是接收端处理慢
  • 确认快速重传机制是否生效(重复 ACK 后是否很快出现重传)
  • 评估链路质量:重复 ACK 与重传同时激增通常指向链路丢包
  • 区分乱序与丢包,避免给正常调度行为贴上故障标签

观察方式

观察方式
连续相同 ack 号的 ACK 报文                        # 重复 ACK 的特征
tcp.analysis.duplicate_ack && tcp.analysis.fast_retransmission   # 重复 ACK 后紧跟快重传
tcp.options.sack                                  # 看缺口是否被 SACK 补齐
netstat -s | grep -i -E 'dup ack|dupacks'         # 系统级计数(命名随内核版本)

现象与结论

组合现象结论依据
重复 ACK 后有重传真实丢包接收端无法用现有数据补齐缺口
重复 ACK 后靠 SACK 补齐多为乱序数据已到,只是顺序错
重复 ACK 数量不足 3影响有限未达快速重传阈值
重复 ACK 与重传同步激增链路丢包结合链路误码与拥塞指标核查
重复 ACK 的条数不等于丢包数:每收到一个乱序包接收端就会补发一次确认,数量会被明显放大。
重复 ACK 由接收端发出,缺口出现在对端的上行方向,反向推断方向时要结合该侧抓包或会话表。

进阶要点

  • 同一连接的重复 ACK 数量突然增多,往往说明链路质量在短时间内恶化
  • 接收窗口同时变小又出现重复 ACK,说明接收端在丢包与读取慢两个方向上承压
  • 把重复 ACK 与时间轴对齐,能看出问题是持续存在还是偶发
  • 区分「观测到重复 ACK」与「确认发生丢包」,后者必须有重传证据
  • 确认丢包后先查链路误码与中间设备队列,再考虑协议参数
抓包时开启完整长度保存,否则重传段可能被截断,重复 ACK 与重传无法配对分析。

易错点

  • 把重复 ACK 数量当丢包数量统计,严重高估链路问题
  • 只看单侧抓包:丢包发生方向与重复 ACK 出现方向相反,容易把责任判给错误的一端
  • 忽略 SACK:已有 SACK 逐步推进时,多数是乱序,此时调优链路反而偏离问题

数据来源与参考

  • RFC 5681
  • RFC 2018(SACK)
  • RFC 6675(SACK 重传)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌