内容以 IEEE 802.3 以太网 MAC 帧 为例:
MAC 帧是什么?
MAC 帧(MAC Frame)是 数据链路层(Layer 2) 的基本传输单元,由 MAC 子层负责收发。
无论是交换机、车载以太网、最后实际发出的都是标准 MAC 帧。
MAC 帧负责:
- 标识源/目的 MAC 地址
- 识别协议类型(IP、ARP、TSN、AVB 等)
- 提供最基本的差错校验(FCS)
- 进行负载封装
MAC 帧格式(802.3 Ethernet II)
+------------+----------------+----------------+------------+-----------+
| 前导码 | SFD 起始帧定界符 | MAC 目的地址 | MAC 源地址 | EtherType |
| 7 字节 | 1 字节 | 6 字节 | 6 字节 | 2 字节 |
+------------+----------------+----------------+------------+-----------+
| Payload 数据(46 ~ 1500 字节) |
+---------------------------------------------------------------------------+
| FCS 校验(4 字节) |
+---------------------------------------------------------------------------+
下面逐字段解释。
1)Preamble 前导码(7 字节)
10101010 10101010 ... (重复 7 次)
作用:
- 时钟同步(MAC 收发器之间的时钟恢复)
- 让接收端知道帧即将开始
2)SFD --- Start Frame Delimiter(1 字节)
10101011
这是标志"真正的 MAC 帧从下一字节开始"。
MAC 不会把 Preamble 和 SFD 上交给上层,但会在物理层自动加上。
3)Destination MAC Address(6 字节)
可以是:
- 单播 MAC(如:00:1A:2B:3C:4D:5E)
- 组播(01-00-5E-xx-xx-xx)
- 广播(FF:FF:FF:FF:FF:FF)
硬件先根据目的 MAC 决定该帧的流向。
4)Source MAC Address(6 字节)
发送方的 MAC 地址,由 MAC 控制器自动填充。
5)EtherType / Length(2 字节)
802.3 Ethernet II(常用)
表示协议类型,例如:
| EtherType | 协议 |
|---|---|
| 0x0800 | IPv4 |
| 0x86DD | IPv6 |
| 0x0806 | ARP |
| 0x8100 | VLAN Tag(表示下一个字段是 VLAN) |
| 0x88F7 | TSN / AVB(一些场景) |
(可选)802.1Q VLAN Tag(4 字节)
有 VLAN 的帧结构会变成:
Dest MAC | Src MAC | 0x8100 | Tag | EtherType | Payload | FCS
VLAN Tag 内容:
- PCP(优先级,TSN 用到)
- DEI
- VLAN ID(12 bit)
S32G/S32Z 的 TSN 交换机、ENETC 都会处理 VLAN/PCP。
6)Payload 数据区(46~1500 字节)
最小长度必须是 46 字节 ,若不足,MAC 会自动填充(Padding)。
常见封装的协议:
- IPv4/IPv6
- TCP/UDP
- TSN/AVB 负载
- SOME/IP
- PTP(1588)
- ARP
最大 MTU = 1500 Bytes(不含头部和 FCS)。
如果启用了 Jumbo Frame,例如 9000 bytes,需要双方 MAC 都支持。
7)FCS --- Frame Check Sequence(4 字节)
CRC-32 校验,用于保证数据完整性。
MAC 硬件自动计算并在接收时验证。
RTD 的驱动不需要软件处理 CRC,否则会导致帧错误。
🔄 MAC 帧的最小 / 最大长度
最小帧长 = 64 字节
包含:
- Dest(6) + Src(6) + EtherType(2) + Payload(46) + FCS(4)
如果 Payload < 46,MAC 自动补齐 Padding。
最大帧长 = 1518 字节(无 VLAN)
6 + 6 + 2 + 1500 + 4 = 1518
最大帧长(带 VLAN) = 1522 字节
📡 MAC 在发送帧时的具体过程(硬件视角)
以 S32G/S32Z ENET/ENETC 为例:
- CPU 或 DMA 将帧填入 TX Buffer
- 填写 Buffer Descriptor(BD 或 QBMan FD)
- 提交到 MAC / ENETC 发送队列
- MAC 自动添加:
- Preamble
- SFD
- CRC(FCS)
- 将完整帧发送到 PHY
- PHY 发送到链路(MII/RGMII/SGMII)
注意:驱动提交的帧不包含 Preamble/SFD/FCS。
📘 举个完整的 MAC 帧例子(十六进制)
FF FF FF FF FF FF ← Destination MAC (广播)
00 1A 2B 3C 4D 5E ← Source MAC
08 00 ← EtherType (IPv4)
45 00 00 54 ... ← Payload 数据 (IP+UDP+Data)
DE AD BE EF ← FCS (CRC32)