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 交叉线接错了 |
1.2 以太网帧结构——你得记牢这 7 个字段
标准 IEEE 802.3 以太网帧长这样(我画了个图,帮你省掉翻书的时间):
嗯,这里要注意几个细节。前导码(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
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、内存数据被篡改 |
1.5 本章小结(其实就两点)
- 第一:MAC 层是帧处理和 CRC 校验的主战场。你看到的 CRC 错误计数器,本质就是 FCS 校验失败的累加值。
- 第二:帧结构一定要倒背如流。尤其是 FCS 占最后4字节,CRC 计算范围不包含前导码和 FCS 本身——这个边界弄错,你的抓包分析工具会给你一堆假阳性结果。
好了,这一章就这些。记住:CRC 错误的根源往往不在 MAC 层本身,而是它在上的物理层或者对端设备。我们后面会配合具体的计数器值和案例分析,一步步把问题定位出来。