3、重传特征分析:快速重传与超时重传、重复ACK识别、重传模式判断
重传是TCP保证可靠性的最后一道防线。但重传本身也分好几种,每种背后反映的问题都不一样。我见过不少运维同事,一看到抓包里有重传就慌了,其实没必要——你得先分清楚是哪种重传,才能对症下药。
这一节,我们就来拆解重传的几种特征。说白了,就是教你怎么从抓包文件里一眼看出:这是快速重传?还是超时重传?重复ACK长什么样?以及当前属于哪种重传模式。
3.1 快速重传 vs 超时重传:本质区别
先讲最核心的概念。TCP重传分两大类:快速重传(Fast Retransmit)和超时重传(Timeout Retransmit)。它们触发的条件完全不同。
| 特征 | 快速重传 | 超时重传 |
|---|---|---|
| 触发条件 | 收到3个或以上重复ACK | 重传计时器(RTO)到期 |
| 恢复速度 | 快(毫秒级) | 慢(至少RTO时长,通常几百毫秒到几秒) |
| 对网络的影响 | 触发拥塞避免,但相对温和 | 拥塞窗口直接降为1,剧烈 |
| 常见原因 | 丢包、乱序、网络轻微抖动 | 严重拥塞、链路中断、对端无响应 |
| 抓包特征 | 连续多个相同ACK号,然后出现重传 | 长时间无响应,然后重传,RTO指数退避 |
核心判断原则:快速重传说明网络还能“对话”,只是丢了包;超时重传说明网络可能已经“断联”了。严重程度完全不是一个级别。
我在项目里遇到过一种情况:某业务频繁出现超时重传,但链路监控显示带宽利用率只有30%。后来发现是中间防火墙的会话超时时间设得太短,导致长连接被静默切断。嗯,这种问题光看带宽是看不出来的。
3.2 重复ACK的识别与解读
重复ACK是快速重传的前兆信号。你想想看,接收端收到乱序包时,不会立刻确认新数据,而是重复发送上一个已确认的序号。这就是重复ACK。
在Wireshark里识别重复ACK很简单:
- 过滤表达式:
tcp.analysis.duplicate_ack - 特征:同一TCP流的多个ACK包,确认号(Acknowledgment Number)完全相同
- 正常情况:连续收到1-2个重复ACK可能是乱序,3个及以上基本可以判定丢包
我的经验:别看到重复ACK就喊丢包。如果重复ACK只有1-2个,而且后续很快收到了正确的ACK,那大概率是乱序。我曾经在一个跨国链路上看到大量重复ACK,结果发现是两条路径延迟差异太大导致的——根本不是丢包。
重复ACK的个数很关键。我习惯这样判断:
- 1-2个重复ACK:大概率是乱序,观察后续即可
- 3个重复ACK:触发快速重传,确认丢包
- 大量连续重复ACK(10个以上):可能对端已经无法处理数据,或者链路存在严重问题
3.3 重传模式判断:三种典型场景
实际抓包中,重传不会孤立出现。它们会形成特定的模式。我总结了三种最常见的重传模式,你可以对照判断。
模式一:快速重传模式
特征:连续重复ACK → 快速重传 → 恢复。整个过程通常在几十毫秒内完成。
典型场景:网络轻微丢包,但延迟正常。比如无线网络偶尔的干扰。
模式二:超时重传模式
特征:长时间无响应 → RTO到期 → 重传 → 继续无响应 → RTO翻倍 → 再次重传。RTO会指数退避(1s、2s、4s、8s...)。
典型场景:链路中断、对端宕机、防火墙拦截。
模式三:混合模式
特征:先出现快速重传,但未能恢复,最终演变为超时重传。或者超时重传后,又出现快速重传。
典型场景:网络严重拥塞,丢包率持续升高。
避坑指南:我曾经遇到一个案例,抓包显示大量快速重传,但业务方坚持说网络没问题。后来发现是发送端的发送缓冲区太小,导致数据包在本地就被丢弃了——根本不是网络丢包。所以,重传不一定等于网络丢包,也可能是端侧问题。
3.4 知识体系:重传特征分析全景图
下面这张图把重传特征分析的核心逻辑串起来了。你可以把它当作排查时的路线图。
3.5 实战:从抓包中快速定位重传模式
光讲理论不够,我们来点实际的。假设你拿到一个pcap文件,怎么快速判断重传模式?
- 第一步:过滤重传包
tcp.analysis.retransmission || tcp.analysis.fast_retransmit - 第二步:看时间间隔
- 如果重传包之间的间隔很短(几毫秒到几十毫秒),且前面有重复ACK → 快速重传
- 如果重传包之间的间隔很长(几百毫秒到几秒),且呈指数增长 → 超时重传
- 第三步:看重复ACK数量
tcp.analysis.duplicate_ack统计每个重复ACK出现的次数。3个以上且紧跟着重传,就是快速重传。
- 第四步:综合判断模式
- 只有快速重传 → 模式一
- 只有超时重传 → 模式二
- 两者都有 → 模式三
我的习惯:我一般会先用Wireshark的“Expert Info”功能扫一遍。它会自动标记重传类型。但别完全依赖它——有时候Expert Info会把乱序误判为重传。我建议还是手动确认一下重复ACK的上下文。
3.6 避坑总结
最后,把我这些年踩过的坑总结一下:
- 别把乱序当丢包:重复ACK少于3个,大概率是乱序。先看时间戳,如果乱序包很快到达,就不是丢包。
- 超时重传不一定是网络问题:也可能是对端应用层卡死、连接泄漏、或者中间设备重置了连接。
- 快速重传也可能很严重:如果快速重传持续出现,说明丢包率在上升,最终会演变成超时重传。
- RTO退避是正常行为:看到RTO从1秒涨到2秒、4秒,别慌。这是TCP的自我保护机制。真正要警惕的是RTO一直不变——那说明对端可能已经死了。