MAC 层基础概念与以太网帧结构归纳总结

讲 CRC 错误分析之前,得先把 MAC 层和以太网帧这些东西理清楚。很多新手一上来就盯着计数器数值看,却不知道这些数字对应帧里的哪个位置。我早期也犯过这种糊涂——查了半天 CRC 错误,结果发现是前置码长度配错了。

1.1 MAC 层到底在干嘛?

MAC 层,全称 Media Access Control,说白了就是介质访问控制。它工作在 OSI 模型的第二层,直接跟物理层(PHY)打交道。你想想看,数据从上层(IP、TCP)下来之后,MAC 层负责两件事:发的时候,把数据封装成帧,交给 PHY 变成电信号或光信号;收的时候,从 PHY 拿回比特流,重新组装成帧,校验完整性。

我习惯把 MAC 层看作「快递分拣站」——上层是发货方,PHY 是运输车。MAC 层要贴好标签(MAC 地址)、算好运费(FCS 校验)、检查包裹有没有在路上被挤坏(CRC 错误检测)。

层级核心职责我在项目中踩过的坑
MAC 层成帧、寻址、错误检测(CRC)曾经把 MAC 地址字节序搞反,导致交换机一直丢包
PHY 层信号编码、时钟恢复、线路收发某次千兆网卡 CRC 错误率暴增,结果是 PHY 芯片的 MDI 交叉线接错了
重点记住:CRC 错误发生在 MAC 层的接收路径。它检出数据在传输过程中是否被篡改——不管是线缆噪声、PHY 编码错误,还是内存位翻转,最终都表现为 MAC 层的 FCS 校验失败。

1.2 以太网帧结构——你得记牢这 7 个字段

标准 IEEE 802.3 以太网帧长这样(我画了个图,帮你省掉翻书的时间):

以太网帧结构(IEEE 802.3) 前导码 7字节 SFD 1B 目的MAC 6字节 源MAC 6字节 类型 2字节 数据 + PAD 46~1500字节 FCS 4字节 帧间间隔 IFG = 12字节(96 bit-time) CRC 校验范围: 从目的MAC到数据字段(不包括前导码、SFD、FCS本身) 发送端计算4字节FCS字节追加在尾部,接收端用同样的多项式再算一遍,结果不为0就报CRC错误。

嗯,这里要注意几个细节。前导码(Preamble)和帧起始定界符(SFD)在 PHY 层就被剥掉了,MAC 层拿到的其实是后面那一段。我在做 FPGA 网卡的时候,曾经把前导码也算进帧长度,结果 RX 计数器永远不对——后来才发现是 IP 核配置把前导码过滤给关了。

1.3 FCS 与 CRC——亲兄弟,别搞混

很多人把 FCS 和 CRC 当作同一个东西。严格来说,FCS(Frame Check Sequence)是一个4字节的字段,里面装的就是 CRC 值。CRC(Cyclic Redundancy Check)是一种校验算法。我打个比方:FCS 是信封上的邮票,CRC 是印邮票的那台印刷机。我说的对不对?

以太网采用的 CRC32 多项式是:

0x04C11DB7 (IEEE 802.3 标准)
G(x) = x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11
       + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1
经验之谈:如果你在 MAC 统计计数器里看到 CRC Error 计数在增长,首先检查物理层——是不是线缆接了、信号质量差、或者 PHY 芯片的时钟恢复锁相环失锁了。我曾经在一个产线项目里,100 台设备有 3 台一直报 CRC 错误,换了条网线就好了……嗯,那条网线被叉车压过,内部线对断了一半。

1.4 MAC 统计计数器——查错的第一道门

交换机芯片或网卡内部都有 MAC 统计寄存器。你登陆到设备后,敲个命令就能看到类似这样的输出:

# ethtool -S eth0 | grep -i crc
     rx_crc_errors: 127
     rx_missed_errors: 3
     rx_fcs_errors: 127
     tx_crc_errors: 0

注意看:rx_crc_errors 和 rx_fcs_errors 经常是同一个事件的两个名字。有些厂商把 CRC 错误统计在 FCS 计数里,有些分开写。如果你看到的数值一样,别——它们在底层是同一套逻辑。

计数器名称含义常见原因
rx_crc_errors接收帧 FCS 校验失败的数量线缆噪声、PHY 误码、对端发送 FCS 错误
rx_missed_errors因接收 FIFO 溢出而丢弃的帧CPU 来不及处理,或者 DMA 带宽不足
tx_crc_errors发送帧本地计算 FCS 后,对端反馈 CRC 错误MAC 控制器本身 bug、内存数据被篡改
千万别踩的坑:我曾经调试一个工控主板,rx_crc_errors 一直缓慢增加,换了网线、换了交换机都没用。最后查了芯片手册才发现——那个型号的 PHY 在 1000BASE-T 模式下,默认把链路协商的 Master/Slave 配置错了,导致信号回波抵消没生效。调整寄存器后,错误计数归零。

1.5 本章小结(其实就两点)

  • 第一:MAC 层是帧处理和 CRC 校验的主战场。你看到的 CRC 错误计数器,本质就是 FCS 校验失败的累加值。
  • 第二:帧结构一定要倒背如流。尤其是 FCS 占最后4字节,CRC 计算范围不包含前导码和 FCS 本身——这个边界弄错,你的抓包分析工具会给你一堆假阳性结果。

好了,这一章就这些。记住:CRC 错误的根源往往不在 MAC 层本身,而是它在上的物理层或者对端设备。我们后面会配合具体的计数器值和案例分析,一步步把问题定位出来。