重复 ACK 说明了什么
接收方发现数据有空洞(收到乱序或缺失的段)时,会用相同的 ACK 号反复催促发送方。发送方收到 3 个连续重复 ACK 就立刻重传被怀疑丢失的段,不必等到重传超时,这就是快速重传。因此重复 ACK 是判断「丢包发生在哪一段、是谁先发现的」的经典依据:重复 ACK 里的 ACK 号就是接收方期望的下一个字节,缺口就在它之前。
基本信息
| 适用平台 | Wireshark / tshark 分析 pcap |
|---|---|
| 关键过滤器 | tcp.analysis.duplicate_ack、tcp.analysis.duplicate_ack_num >= 3 |
| 阈值依据 | RFC 5681:3 个重复 ACK 触发快速重传与快速恢复 |
| 判读要素 | ACK 号、重复次数、是否随后出现重传帧 |
| 配套指标 | tcp.analysis.fast_retransmission、tcp.analysis.retransmission |
典型使用场景
- 判断丢包方向:接收方发 dup ACK,说明到达接收侧的数据有缺口
- 区分超时重传与快速重传:前者前无 dup ACK,后者前有 3 个以上
- 评估链路乱序程度:乱序会制造 dup ACK 但通常能自愈
- 与 Wireshark 专家信息对照:快速定位重传集中发生在哪条流
- 复盘应用层卡顿:确认是丢包补偿还是接收端处理慢
定位与分析
定位与分析
# 所有重复 ACK
tcp.analysis.duplicate_ack
# 达到快速重传阈值的那部分
tcp.analysis.duplicate_ack_num >= 3
# 指定方向的重复 ACK
ip.src == 10.0.0.20 && tcp.analysis.duplicate_ack
# 只看不带数据的纯 ACK
tcp.analysis.duplicate_ack && tcp.len == 0
# 配套观察重传类型
tcp.analysis.fast_retransmission || tcp.analysis.retransmission视角与判读
| 视角 | 现象 | 结论 |
|---|---|---|
| 接收方 | 相同 ACK 号反复出现 | 数据有空洞,正在催促重发 |
| 发送方 | 收到 3 个重复 ACK 后重传 | 快速重传,说明不是超时导致 |
| 重复 ACK 数 < 3 | 零星出现 | 可能是轻微乱序,未达重传阈值 |
| 随后出现 RTO 重传 | 前面无 dup ACK | 属于超时重传,链路问题更严重 |
| 重复 ACK 后自愈 | 缺口被后续报文补齐 | 属乱序而非真丢包 |
重复 ACK 也可能由链路乱序触发(后发的包先到):与真实丢包的区别在于乱序最终会自愈,且通常不伴随重传超时。