以太网 MAC 详解:帧格式、位序、FCS 与收发流程

以太网 MAC 详解:帧格式、位序、FCS 与收发流程

本文从工程实现角度梳理 IEEE 802.3 以太网中的 MAC:先说明 MAC 与 PHY 的分层关系,再介绍帧格式、帧长边界、地址位序、Length/Type、Pad、FCS,以及发送和接收流程。最后区分 MAC frame、Ethernet packet 与线上实际占用,便于进行吞吐率和小包 PPS 估算。

本文以现代交换网络中常见的点到点全双工链路为主线。半双工、碰撞、载波扩展等内容仅在影响帧格式或术语边界时说明;不同速率 PHY 的具体编码和电气参数应继续查阅对应的 IEEE 802.3 条款。

MAC 与 PHY 的分层关系

IEEE 802.3 体系中,MAC 位于数据链路层。MAC 向上为 LLC 或其他 MAC client 提供服务,向下通常通过 Reconciliation 子层和速率相关的介质无关接口与 PHY 交互。

图 1:IEEE 802.3 与 OSI 参考模型的对应关系,摘自 IEEE Std 802.3-2022 Figure 1-1。

从上到下,可以将数据路径概括为:

text 复制代码
MAC client → MAC Control(可选)→ MAC → Reconciliation → xMII → PHY → MDI → 传输介质

图中的 xMII 是介质无关接口的统称。在典型速率下,100 Mb/s 使用 MII,1 Gb/s 使用 GMII,10 Gb/s 使用 XGMII。它们描述 MAC/Reconciliation 与 PHY 之间的逻辑接口;在具体芯片方案中,接口可能表现为外部并行总线、片内逻辑连接或高速 SerDes,并不一定对应一组独立引脚。

PHY 负责把面向 MAC 的数字数据转换为适合具体介质传输的编码信号,并完成反向接收与恢复。PCS、PMA 和 PMD 是 PHY 中常见的功能子层:

  • PCS(Physical Coding Sublayer):负责编码、解码及相关同步功能。
  • PMA(Physical Medium Attachment):负责串并转换、时钟恢复等与物理连接相关的功能。
  • PMD(Physical Medium Dependent):负责与具体电气或光学介质相关的收发功能。

PHY 是物理层功能实体,不一定对应一颗独立芯片。其具体子层组成和实现边界取决于速率、介质类型与所采用的 IEEE 802.3 条款。

MAC 的职责

MAC(Media Access Control),即介质访问控制,属于 OSI 数据链路层。它主要负责以太网帧的封装与解析、源/目的地址处理、Length/Type 字段解释、帧长与填充处理、FCS 生成与校验,以及相应的介质访问控制。

Ethernet packet 格式

图 2:Ethernet packet 的主要字段,摘自 IEEE Std 802.3-2022 Figure 3-1。

字段 长度 作用
Preamble 7 B 让接收侧同步;常见字节表示为连续的 0x55
SFD 1 B 帧开始定界;常见字节表示为 0xD5
Destination Address 6 B 目的单播、组播或广播地址
Source Address 6 B 源单播地址
Length/Type 2 B 表示数据长度或 EtherType
MAC Client Data + Pad 可变 上层数据以及为满足最小帧长而添加的填充
FCS 4 B CRC-32 检错
Extension 可变 仅与 1 Gb/s 半双工载波扩展有关

按常见的字节表示,Preamble 为连续的 0x55,SFD 为 0xD5;由于普通八位组按 LSB first 发送,线上按时间观察到的比特顺序分别表现为重复的 10101010 和结尾为 10101011 的定界模式。普通主机抓包通常看不到 Preamble、SFD 和 IPG,因为它们在帧交给驱动之前已经由硬件处理。

帧长边界

帧类型 MAC Client Data 最大值 额外字段 MAC frame 最大值
Basic frame 1500 B 1518 B
Q-tagged frame 1500 B 4 B QTag Prefix 1522 B
Envelope frame 1500 B Envelope Prefix + Suffix,合计不超过 482 B 2000 B

需要特别注意:QTag Prefix 和 Envelope Prefix/Suffix 位于 MAC Client Data 之外,因此不能把 1504 B 或 1982 B 标成"MAC Client Data 最大值"。Envelope frame 也不等同于工程中常见的 9 KB 左右 Jumbo frame;IEEE 802.3 的 Envelope frame 最大 MAC frame 为 2000 B。

三种帧使用共同的基本格式。MAC frame 的最小长度为 64 B 。对普通未打标签的基本帧,Data + Pad 至少为 46 B

text 复制代码
6 B(DA) + 6 B(SA) + 2 B(Length/Type) + 46 B(Data/Pad) + 4 B(FCS) = 64 B

一个最小帧在链路上的常用占用口径为(按平均 96 bit-times 的 IPG 计算):

text 复制代码
8 B(Preamble + SFD) + 64 B(MAC frame) + 12 B(IPG 等效时间)
= 84 B = 672 bit-times

因此,在不计 PHY 编码开销的情况下,最小帧连续发送时:

  • 1 Gb/s 下,单包约占用 672 ns,理论上限约为 1.488 Mpps
  • 10 Gb/s 下,单包约占用 67.2 ns,理论上限约为 14.88 Mpps

进行吞吐率或小包 PPS 估算时,不能只使用 64 B 作为分母,还需要考虑 Preamble、SFD 和 IPG。这里得到的是 MAC 侧常用估算值,不包含 64B/66B、8b/10b、FEC、多 lane 对齐标记等 PHY 编码开销。

地址字段与位序

每个 MAC 地址为 48 bit。第一个被发送的地址位同时具有特殊含义:

图 3:MAC 地址中的 I/G 位与 U/L 位,摘自 IEEE Std 802.3-2022 Figure 3-3。

  • I/G 位:0 表示 individual(单播),1 表示 group(组播)。源地址中的该位保留并置 0。
  • U/L 位:0 表示 globally/universally administered,1 表示 locally administered。
  • DA 全 1,即 FF:FF:FF:FF:FF:FF,表示广播地址。

除 FCS 外,每个八位组按 最低有效位先发送。不过,人们看到的 MAC 地址仍按通常的十六进制字节顺序书写,不应因为线路位序而手动反转每个地址字节。

Length/Type 的判定

Length/Type 字段为 2 B,按高字节在前解释:

  • <= 1500:作为 Length,表示随后 MAC Client Data 的字节数。
  • >= 15360x0600):作为 Type,表示 EtherType。
  • 1501~1535:保留区间,不应作为正常 Length 或 EtherType 使用。

Pad 位于客户端数据之后、FCS 之前。当该字段按 Type 解释时,MAC client 必须能够正确处理 MAC 为满足最小帧长而添加的 Pad,不能把 FCS 之前的全部字节都无条件视为上层有效载荷。

FCS 覆盖范围

FCS 是 4 B CRC-32,保护以下字段:

text 复制代码
DA + SA + Length/Type + MAC Client Data + Pad

Preamble、SFD、FCS 自身、Extension 和 IPG 不在 FCS 覆盖范围内。CRC 生成多项式为:

text 复制代码
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

实现 CRC 时最容易出错的通常不是多项式本身,而是输入位序、初值与取反规则、移位方向,以及最终 32 bit 的发送顺序。验证硬件或软件实现时,应使用已知帧同时比对最终 FCS 字节,而不能只比较内部寄存器值。

常见软件实现采用 CRC-32/ISO-HDLC 的等价参数:正常表示多项式为 0x04C11DB7,反射实现常使用 0xEDB88320,初值与最终异或值均为 0xFFFFFFFF,输入/输出反射。字符串 123456789 的标准校验值为 0xCBF43926。这些参数用于帮助核对算法,真正验证以太网实现时仍应比较完整测试帧的最终 FCS 字节顺序。

无效 MAC frame

至少满足下列任一条件时,帧应被视为无效:

  • Length 解释与实际长度不一致;若字段为合法 Type 值,则不按此项判错。
  • 帧长不是整数个八位组。
  • 根据接收内容计算得到的 CRC 与 FCS 不一致。

无效帧不交给 LLC 或 MAC Control,可以直接丢弃并计入相应的管理统计。

工程设备通常还会分别统计 runt、giant/oversize、alignment error、jabber 等异常。它们与标准中的 invalid MAC frame 条件有关,但具体计数边界还可能受到设备配置、VLAN 支持和 Jumbo frame 上限影响。

MAC 的发送与接收流程

发送方向

发送路径可以概括为:

  1. 接收 MAC client 的发送请求,获得地址、服务数据和相关控制信息。
  2. 形成 MAC frame,必要时补充 Pad,并计算和附加 FCS。
  3. 在 MAC frame 前发送 Preamble 和 SFD。
  4. 按规定的线路顺序将各字段交给下层 PHY。
  5. 帧结束后满足 96 bit-times 的 IPG,再开始发送下一包。
接收方向

接收路径可以概括为:

  1. 从 PHY 获取接收数据有效信号、数据内容及链路状态。
  2. 识别 Preamble 和 SFD,确定帧边界。
  3. 解析地址、Length/Type、Data/Pad 与 FCS 等字段。
  4. 依次执行地址识别、长度与字节对齐检查,以及 FCS 校验。
  5. 对合法且目的地址匹配的帧,通过 MA_DATA.indication 上送;错误帧则计入相应统计或被丢弃。

可选的 MAC Control 位于 MAC client 与 MAC 之间,可承载 PAUSE 等控制操作。PFC(Priority-based Flow Control)由 IEEE 802.1Qbb 定义,其机制与 PAUSE 类似,但可以按优先级分别进行流量控制。

Packet、MAC frame 与线上占用

  • MAC frame:从 Destination Address 开始,到 FCS 结束。
  • Ethernet packet:Preamble + SFD + MAC frame;仅在 1 Gb/s 半双工的特定情况下还可能包含 Extension。
  • Inter-Packet Gap(IPG):两个 packet 之间的空闲时间,不属于 packet,也不属于 MAC frame,但进行链路占用和 PPS 计算时必须考虑。

总结

理解以太网 MAC 时,建议始终区分三个边界:MAC client 交给 MAC 的数据、从 DA 到 FCS 的 MAC frame,以及包含 Preamble/SFD 的 Ethernet packet。计算线上吞吐时还要加入 IPG;实现和排查 FCS 时,则要同时关注覆盖范围、位序和最终发送字节。把这些边界理清后,MAC 与 PHY 之间的数据路径就会清晰很多。

术语与参考资料

  • medium / media:medium 的复数形式为 media;在通信语境中通常译为"介质"。
  • PLS(Physical Layer Signaling):早期以太网架构中的物理层信令功能。
  • MAU(Medium Attachment Unit):介质连接单元,负责 AUI 与传输介质之间的收发和连接。
  • MDI(Medium Dependent Interface):PHY 或 MAU 与传输介质之间的机械、电气或光学接口,例如双绞线或光纤接口。
  • PCS / PMA / PMD:PHY 中常见的功能子层,并不等同于"物理层芯片"。

参考资料:

  1. IEEE Std 802.3-2022:Clause 1(体系结构)、Clause 3(帧格式)、Clause 4(MAC 功能)、Clause 31(MAC Control)。
  2. IEEE 802.3 Ethernet Working Group
  3. IEEE 802.3 Overview(David Law,2010)
  4. IEEE 802.3 Editorial Guidelines:Frames and Packets
  5. IEEE 802.1Qbb:Priority-based Flow Control
相关推荐
曹牧2 小时前
C#:Type
开发语言·c#
小僧景贤2 小时前
嵌入式C语言 第十一篇:成长路线|嵌入式C工程师完整进阶学习路径(从零到工程级落地|含周期+实战项目)
c语言·开发语言·学习
Brilliantwxx2 小时前
【Linux】自动化构建工具 make 与 Makefile
linux·运维·服务器·开发语言·自动化
灵晔君2 小时前
【Linux】进程(四)——进程虚拟地址空间
linux·c语言·开发语言
ao-weilai2 小时前
C++基础:C++11部分内容
开发语言·c++·c++11
萧瑟余晖3 小时前
Java深入解析篇十八之响应式编程
java·开发语言
看浪的路人3 小时前
第5讲:代码审查与 Bug 检测
开发语言·windows·python
netccdn3 小时前
Hough变换检测直线(Matlab)
开发语言·计算机视觉·matlab