4、丢包率分析:丢包如何导致卡顿、使用 Wireshark 抓包分析丢包、丢包容忍度阈值

说到推流卡顿,很多人第一反应是带宽不够。其实我这些年排查下来,丢包才是真正的隐形杀手。带宽低顶多是画面模糊,丢包一上来,画面直接卡成幻灯片,甚至黑屏。今天我们就来把丢包这件事彻底讲透。

4.1 丢包是如何导致卡顿的?

先看一个最简单的场景。你正在推流,每帧视频数据被切成一个个 RTP 包发出去。假设一帧有 10 个包,第 5 个包丢了。

接收端拿到第 1-4 个包,等第 5 个包。等了一会儿没等到,继续收第 6-10 个包。但解码器需要完整的一帧才能解码。缺了第 5 个包,这一帧就解不出来。

结果是什么?要么这一帧直接丢弃,画面出现跳帧;要么解码器等待重传,造成延迟累积。 你想想看,如果丢包率是 5%,每 20 个包就丢 1 个,那画面基本就是一步一卡。

核心结论:丢包导致卡顿的根因在于 数据不完整 → 解码失败 → 帧等待/丢帧 → 播放节奏被打乱。这不是带宽问题,是数据完整性问题。

我在项目中遇到过一种情况:客户反馈推流卡顿,但带宽测出来有 50Mbps,完全够用。后来抓包一看,丢包率高达 8%。运营商线路质量差,带宽再大也没用。

4.2 使用 Wireshark 抓包分析丢包

Wireshark 是我排查丢包问题的首选工具。说白了,它就是网络世界的显微镜。下面我带你走一遍完整的抓包分析流程。

4.2.1 抓包前的准备

  1. 确定抓包点:最好在推流端和接收端同时抓包。如果条件有限,至少在被怀疑有问题的节点上抓。
  2. 设置过滤条件:只抓推流相关的流量,避免数据太多看花眼。
  3. 保存抓包文件:抓个 30 秒到 1 分钟就够了,文件太大反而不好分析。

我个人习惯用这个过滤表达式:

udp.port == 1935 || udp.port == 8080 || rtp

这样只保留 RTMP 或 RTP 相关的 UDP 包,干净利落。

4.2.2 如何从抓包中识别丢包

抓完包之后,怎么判断有没有丢包?我教你三个最实用的方法。

方法一:看 RTP 序列号

每个 RTP 包都有一个序列号(Sequence Number),从 0 开始递增。如果序列号出现跳变,比如从 100 直接跳到 103,中间缺了 101 和 102,那就是丢包了。

在 Wireshark 里,你可以把 RTP 序列号列出来:

  1. 选中一个 RTP 包,右键 → Follow → UDP Stream
  2. 在弹出窗口里,找到 Sequence Number 列
  3. 观察是否有跳变

方法二:用 Wireshark 的 RTP 分析工具

Wireshark 自带 RTP 分析功能,非常方便:

Statistics → RTP → Show All Streams

选中你的推流流,点击 Analyze。Wireshark 会直接告诉你:

  • 总包数
  • 丢包数
  • 丢包率
  • 抖动(Jitter)

小技巧:如果丢包率超过 1%,Wireshark 会用红色标记。一眼就能看出问题。

方法三:看 RTCP 的丢包反馈

RTCP 包里有接收端报告的丢包统计。找到 RTCP Sender Report (SR) 或 Receiver Report (RR),里面有个 Fraction Lost 字段,直接就是丢包率。

4.2.3 实战案例:一次典型的丢包分析

我记得有一次帮客户排查卡顿,抓包后看到这样的数据:

时间戳 RTP 序列号 包大小 (Bytes) Delta (ms)
0.000 1000 1350 0
0.010 1001 1350 10
0.020 1002 1350 10
0.035 1004 1350 15
0.045 1005 1350 10

看到没有?序列号从 1002 直接跳到 1004,中间缺了 1003。这就是一个丢包。而且 1004 包的到达时间比预期晚了 5ms,说明网络已经出现拥塞。

继续往下看,丢包率统计:

Total packets: 1500
Lost packets: 45
Loss rate: 3.0%
Jitter: 12.3ms

3% 的丢包率,加上 12ms 的抖动,卡顿是必然的。

4.3 丢包容忍度阈值

丢包率多少算正常?多少会卡顿?我直接给你一个经验值表:

丢包率范围 用户体验 建议措施
< 0.1% 几乎无感知 正常,无需处理
0.1% - 0.5% 偶尔轻微卡顿 建议开启 FEC 或 ARQ
0.5% - 2% 明显卡顿,画面跳帧 必须启用抗丢包策略
2% - 5% 严重卡顿,无法观看 降低码率 + 启用重传
> 5% 画面冻结或黑屏 建议切换网络或降分辨率

注意:这个阈值是针对视频推流的。如果是音频,容忍度会高一些,因为音频可以用 PLC(丢包隐藏)技术补偿。但视频不行,丢一个关键帧的包,可能导致后面几百毫秒的画面都受影响。

我曾经遇到一个极端案例:客户在弱网环境下推流,丢包率到了 7%。画面基本是黑的,偶尔闪一下。我建议他开启 FEC(前向纠错),丢包率降到 2%,画面虽然模糊但至少能看了。这就是阈值的作用——知道什么时候该用什么策略。

4.4 丢包与码率的关系

丢包率和码率之间有个微妙的关系。很多人以为丢包了降码率就行,其实不一定。

丢包率高的时候,如果强行降低码率,反而可能让问题更严重。为什么?因为低码率意味着每帧的数据量更小,丢一个包损失的比例更大。

举个例子:

  • 码率 5Mbps,每帧 50 个包,丢 1 个包损失 2%
  • 码率 1Mbps,每帧 10 个包,丢 1 个包损失 10%

所以正确的做法是:先解决丢包问题,再考虑码率调整。丢包率降下来之后,码率调整才有意义。

我的经验法则:

  • 丢包率 < 1%:正常推流,码率可以保持
  • 丢包率 1%-3%:开启 FEC,码率适当降低 10%-20%
  • 丢包率 > 3%:必须启用 ARQ 重传,码率降低 30% 以上

4.5 本章知识体系

下面这张图总结了丢包分析的完整链路:

丢包分析知识体系 丢包分析 丢包原因 网络拥塞 线路质量差 路由器丢包 抓包分析 RTP序列号 Wireshark分析 RTCP反馈 阈值与策略 容忍度阈值 FEC/ARQ 码率调整 丢包分析是推流卡顿排查的第一步 先定位丢包原因,再选择对应的抗丢包策略

嗯,这张图把丢包分析的三个核心维度串起来了。从左到右,从原因到分析再到策略,每一步都不能跳。

4.6 避坑指南

最后分享几个我踩过的坑:

  • 不要只看平均丢包率:有时候平均丢包率只有 0.5%,但突发丢包集中在某几秒,那几秒的卡顿就足以毁掉整个直播体验。要看峰值丢包率。
  • 不要忽略抖动:抖动大的时候,即使不丢包,接收端也可能因为缓冲区溢出而主动丢包。这叫「被动丢包」,比网络丢包更难排查。
  • 不要在推流端和接收端用同一个 Wireshark 过滤条件:推流端抓到的包是完整的,接收端抓到的包可能已经丢了。对比两边的序列号,才能准确判断丢包发生在哪一段。

我曾经有一次排查了三天,发现丢包率忽高忽低。后来才发现是推流端的网卡驱动有问题,导致发包时出现微秒级的延迟,被中间路由器判定为异常流量直接丢弃。换了个网卡驱动就好了。所以,丢包不一定是网络问题,也可能是端侧的问题。