4、数据链路层(MAC):MAC层功能、MAC地址与帧结构、VLAN标签与优先级

各位同学,咱们今天聊聊数据链路层的核心——MAC层。说实话,很多刚入行的工程师觉得MAC层就是个“搬砖”的,把上层数据打包发出去就完事了。但我在实际项目中踩过不少坑,才明白这层的水有多深。你想想看,整个车载网络的可靠性,很大程度上就取决于MAC层处理得是否到位。

4.1 MAC层的核心功能

MAC层,全称是介质访问控制层。它干的事,说白了就是两件:怎么把数据放到线上去,以及怎么从线上把数据拿下来。但这里面门道不少。

我个人习惯把MAC层的功能拆成三块来看:

  • 帧的封装与解封装:给上层下来的IP包加上头部和尾部,变成能在物理介质上传输的帧。反过来,收到帧之后把头部尾部剥掉,把净荷交给上层。
  • 介质访问控制:决定什么时候可以发数据。在车载以太网里,我们用的是全双工模式,不存在冲突问题,所以这块相对简单。但如果你做的是传统半双工以太网,那CSMA/CD(载波监听多点接入/碰撞检测)就是必修课了。
  • 错误检测:通过帧尾的FCS(帧校验序列)字段,检查数据在传输过程中有没有被破坏。嗯,这里要注意,MAC层只负责检测,不负责纠错。发现错了,直接丢帧。

重要提醒:在车载网络中,MAC层还承担着时间同步的辅助功能。比如在做音视频桥接(AVB)时,MAC层需要精确记录帧的收发时间戳。这个细节很多教材不会讲,但实际调测时特别关键。

4.2 MAC地址:设备的“身份证”

MAC地址,就是每个以太网设备的硬件地址。它长48位,通常写成6组十六进制数,比如 00:1E:67:0A:BB:CC

我记得有一次,客户反馈说某款ECU(电子控制单元)在车上通信不稳定。排查了半天,发现是MAC地址烧录时出了错——有两个ECU的MAC地址居然一模一样。你想想看,这在二层网络里简直就是灾难,交换机都不知道该把数据转发给谁。

关于MAC地址,有几个关键点你得记住:

类型 说明 示例
单播地址 唯一标识一个设备,第1字节最低位为0 00:1E:67:0A:BB:CC
多播地址 发给一组设备,第1字节最低位为1 01:00:5E:xx:xx:xx
广播地址 发给所有设备,全48位为1 FF:FF:FF:FF:FF:FF

实战技巧:在车载网络中,我建议你尽量使用单播通信。广播帧虽然方便,但会消耗所有节点的处理资源。我曾经在一个项目里发现,某个ECU每秒发送上百个广播帧,导致其他ECU的CPU占用率飙升。后来改成单播,问题立刻解决了。

4.3 以太网帧结构:数据在线上长什么样

咱们来看看标准的以太网帧结构。我习惯用IEEE 802.3的格式,这也是车载以太网最常用的。

+--------+--------+--------+--------+--------+--------+--------+
| 前导码 | 定界符 | 目的MAC| 源MAC  | 长度/  | 数据   | FCS    |
| (7B)   | (1B)   | (6B)   | (6B)   | 类型   | (46-   | (4B)   |
|        |        |        |        | (2B)   | 1500B) |        |
+--------+--------+--------+--------+--------+--------+--------+

每个字段的作用我简单说一下:

  • 前导码(Preamble):7个字节的10101010...,用来让接收端同步时钟。实际抓包时你看不到这个字段,因为物理层已经把它处理掉了。
  • 帧起始定界符(SFD):1个字节的10101011,告诉接收端“注意,真正的帧要开始了”。
  • 目的MAC和源MAC:各6个字节,不用多说。
  • 长度/类型字段:如果值小于等于1500,表示数据字段的长度;如果大于等于1536,表示上层协议类型(比如0x0800代表IPv4)。
  • 数据字段:最少46字节,最多1500字节。如果上层数据不够46字节,需要填充(Padding)。
  • FCS:4字节的CRC校验,覆盖从目的MAC到数据字段的末尾。

避坑指南:我曾经在调试一个ADAS(高级驾驶辅助系统)的摄像头数据流时,发现视频流偶尔会卡顿。抓包一看,有些帧的数据长度超过了1500字节。原来上层应用没做分片,直接把大包扔给了MAC层。记住,MAC层不会帮你分片,超长的帧会被直接丢弃。

4.4 VLAN标签与优先级:给数据“贴标签”

在车载网络里,我们经常需要把不同的数据流隔离开。比如,制动控制信号和娱乐系统的音视频流,肯定不能混在一起。这时候,VLAN(虚拟局域网)就派上用场了。

VLAN标签是插在以太网帧里的一个额外字段,位置在源MAC地址之后、长度/类型字段之前。它的结构是这样的:

+--------+--------+--------+--------+
| TPID   | TCI    |        |        |
| (2B)   | (2B)   |        |        |
+--------+--------+--------+--------+

TCI内部结构:
+--------+--------+--------+--------+
| PCP(3b)| DEI(1b)| VID(12b)         |
+--------+--------+--------+--------+

我来解释一下这几个字段:

  • TPID(标签协议标识符):固定为0x8100,表示这是一个带VLAN标签的帧。
  • PCP(优先级代码点):3个比特,表示帧的优先级,从0(最低)到7(最高)。在车载网络中,我们通常用这个字段来做QoS(服务质量)控制。
  • DEI(丢弃合格指示):1个比特,表示在网络拥塞时是否可以被优先丢弃。
  • VID(VLAN标识符):12个比特,取值范围1到4094。0和4095是保留值。

核心要点:在车载以太网中,VLAN标签不仅仅是用来隔离网络的。更重要的是,PCP字段是实现实时通信的关键。比如,我们通常把安全相关的控制信号映射到PCP 7,把音视频流映射到PCP 5,把普通诊断数据映射到PCP 1。这样,交换机就能根据优先级来调度转发,保证关键数据不丢包、不延迟。

我建议你在设计车载网络时,一定要提前规划好VLAN和优先级的映射关系。我曾经见过一个项目,所有数据都放在同一个VLAN里,优先级也全设成0。结果呢?OTA升级的时候,大量数据包把网络带宽占满了,导致ECU之间的心跳包超时,触发了安全机制,整车直接进入了跛行模式。嗯,这个教训够深刻吧?

4.5 小结

好了,这一章的内容就这些。MAC层虽然看起来简单,但它是整个车载以太网通信的基石。从MAC地址的唯一性,到帧结构的每个字节,再到VLAN标签的优先级控制,每一个细节都直接影响着网络的可靠性。

下一章,咱们会聊聊更高层的协议,比如IPv4/IPv6在车载网络中的特殊用法。到时候你会发现,很多问题其实都能追溯到MAC层的设计上。所以,把今天的内容消化好,后面会轻松很多。