4. 丢包现象描述:什么情况下出现丢包?抓包分析归纳总结

丢包这回事,说起来简单,就是数据发出去对方没收到。但在我实际排查中,RGMII 接口的丢包往往藏得很深,不是网线松了、配置错了那么简单。它常常是“时好时坏”的——白天好好的,晚上就掉线;测速一会 900M,一会掉到 200M。你说是链路问题吧,Ping 大包偶尔又全通。真让人头疼。

我个人习惯,碰到这类现象,先把“什么情况下出问题”摸清楚。下面是我自己踩坑后总结的典型丢包场景,和抓包分析归纳出的规律。

4.1 典型丢包症状

我们先列几个我在项目中反复见过的症状,你可以比对一下自己的情况:

  • 偶发 CRC 错误:Wireshark 里时不时冒出一两个 Bad CRC,但重发后又正常。
  • 帧对齐异常:抓包看到帧长度不对,或者 preamble 出现偏差,导致接收端丢弃。
  • 吞吐量剧烈抖动:iperf 测速曲线像心电图,忽高忽低。
  • 特定流量模式丢包:比如只在 100% 带宽持续发包时掉,或者只在突发小包时掉。
  • 物理层 Link 反复 down/up:交换机或 PHY 的 Link 指示灯闪烁,但持续几十秒又恢复正常。

这些症状背后,十有八九都跟 RGMII 的时钟相位对不齐有关。为什么?RGMII 信号是 DDR 采样,时钟边沿要求很苛刻,延时一偏,采样就错。

4.2 触发丢包的关键条件

不是所有板子都丢包。我遇到过三台设备放在同一个环境里,只有一台有丢包现象。这说明触发条件往往很具体。我整理了一个表格,把我在几个项目中踩过的坑列出来:

条件/场景 表现特征 与我项目的关联
温度变化超过 15°C 丢包率从 0.01% 飙到 3% 某次在户外机柜中,夏天中午高温导致丢包
PHY 与 MAC 来自不同厂家 低概率 CRC 错误 Marvell + Realtek 组合经常遇到
PCB 走线长度偏差 > 50mil 只在吉比特模式丢包,百兆正常 Layout 时少了等长约束
电源纹波偏大 (>50mV) 丢包伴随眼图闭合 曾因 LDO 选型不当引起
多端口同时满负载 某个端口 50% 丢包,其他正常 交换机背板带宽不足?其实是时钟偏移

一句话总结:延时校准偏差导致的丢包,往往在温度、速率、负载等边界条件下被放大。正常条件下测不出问题,不代表它不存在。

4.3 抓包分析方法与工具

接下来我们说说怎么抓。我一般用以下几个工具配合:

  • Wireshark/TShark:抓以太网帧,重点看 CRC 错误、帧长异常、重传次数。
  • iperf3:连续打流,同时抓包,对比丢包率。
  • 逻辑分析仪:直接抓 RGMII 信号,看 TXC、TXD 的边沿对齐情况。这个最直接,但需要硬件触发。
  • 芯片内部寄存器:比如读取 MAC 的 CRC error counter、frame check sequence 错误计数。

抓包时我的步骤:

  1. 先挂载 iperf3 持续发包 60 秒,同时用 Wireshark 在接收端抓包。
  2. 保存抓包文件,用统计工具分析丢包分布。
  3. 如果丢包集中在某个时间窗口,再缩小范围抓。
  4. 用逻辑分析仪同时抓 TX/RX 的 RGMII 信号,看时钟相位偏差。
  5. 对比不同温度、电压下的偏差值。

小技巧:我曾经在项目里用 Wireshark 的 "Expert Info" 查看 Bad CRC 与 Good CRC 的比值。如果错误帧的数量随着温度和电压呈线性变化,基本上可以锁定是延时偏差导致的。

4.4 抓包结果归纳

整理了几次典型抓包记录,我把它们归纳成了三种丢包模式:

模式 特征 根因推测
零星 CRC 错误 丢包率 < 0.1%,每几秒出现一个坏帧 时钟抖动或微小相位漂移
突发连续丢包 连续 10~50 帧丢失,然后恢复正常 时钟边沿进入采样窗口的死区
吞吐量阶梯下降 从 900M 降到 200M,持续几分钟后恢复 链路层反复重协商或自动减速

为什么会这样?我拿逻辑分析仪对着信号看过——RGMII 的 TXC 和 TXD 之间如果延时偏差超过 ±0.5ns,接收端采样就会错位。这个错位不是一直固定的,它随着温度、电压和老化而缓慢漂移。当漂移到采样窗口边缘之外,丢包就爆发了。

注意:抓包时一定要同时记录环境温度、板级电压、PHY 工作模式。我遇到过因为抓包时机不对,误判为软件 bug 的情况——其实只是因为在室温下测,没触发到边界条件。

RGMII 延时校准偏差导致的丢包分析流程 丢包现象出现 第一步:Wireshark 抓包 + iperf 打流 是否有 CRC 错误或帧对齐异常? 第二步:逻辑分析仪测 RGMII 时钟相位偏移 第三步:调整延时校准寄存器/PCB 长度 重新验证通过 常见错误 温度漂移 PHY 不匹配 走线不等长 关键指标 采样窗口 > 1.5ns 偏差 < 0.5ns

你看这个流程图,从丢包现象出发,经过抓包识别 CRC 错误,再深入用逻辑分析仪测时钟相位,最后通过调整延时校准来解决。每一步都环环相扣。我在某次车联网项目里,就是跟着这个流程,最后发现是 PCB 上 TXC 走线长了 120mil,导致时钟相位偏移了 0.7ns,怎么调 PHY 寄存器都没用,最终改版才解决。