2. 车载网络基础

AVB 音频桥接,说白了就是一套让音视频数据在标准以太网上「准时到达」的协议组合。很多刚接触 AVB 的朋友容易把四个协议混为一谈,觉得它们是一锅粥。其实不是,它们分工非常明确。

我个人习惯把这四个协议比作一个物流系统:gPTP 是时钟,SRP 是调度员,FQTSS 是传送带,AVTP 是包裹。下面我们一个一个拆开看。

2.1 gPTP(IEEE 802.1AS)—— 全网的统一心跳

gPTP 的全称是 generalized Precision Time Protocol,通用精确时间协议。它解决的是 AVB 网络里最根本的问题:所有设备的时间必须一致。

你想想看,如果扬声器 A 和扬声器 B 的时钟差了几微秒,声音就会出现相位偏移,人耳虽然不一定能听出具体差多少,但声场定位会变得模糊。我在项目中遇到过最夸张的一次,两台设备差了 200 微秒,结果立体声听起来像在房间里转圈。

核心指标:gPTP 要求端到端时钟同步精度在 ±1 µs 以内。对于 48 kHz 采样率的音频,这相当于半个采样周期的误差。

gPTP 和传统 NTP 最大的区别在于:它不依赖软件时间戳,而是靠硬件时间戳在 MAC 层打标记。这样能避免协议栈和操作系统带来的抖动。

具体工作流程分三步:

  1. 主时钟选举:网络里所有设备通过 BMCA(最佳主时钟算法)选出一个 Grandmaster(GM)。GM 通常是交换机或者专用的时钟源。
  2. 链路延迟测量:每台设备与邻居设备交换 Pdelay_Req / Pdelay_Resp 报文,算出链路延迟。
  3. 时钟同步:GM 周期性发送 Sync 报文,下游设备根据链路延迟修正本地时钟。
避坑指南:我曾经在一条链路上串联了 7 台交换机,结果同步精度直接掉到 3 µs 以上。后来发现是其中一台交换机不支持 gPTP 硬件时间戳。记住:链路上的每一跳都必须支持 802.1AS,否则精度会断崖式下降。

2.2 SRP(IEEE 802.1Qat)—— 带宽的预约系统

SRP 是 Stream Reservation Protocol,流预留协议。它的作用很简单:在数据发送之前,先告诉网络「我要占多少带宽」。

为什么需要这个?因为 AVB 网络里可能有几十路音频流同时跑。如果不做预留,突发流量一来,交换机缓冲区一满,丢包就来了。音频丢包不像文件传输可以重传,丢一个包就是一声爆音。

SRP 的工作机制是 Talker(发送端)和 Listener(接收端)之间的协商:

  • Talker 发广告:Talker 广播一个 Talker Advertise 报文,里面包含流 ID、VLAN ID、最大帧大小、帧间隔。
  • 交换机做准入控制:每个交换机检查自己的带宽池,如果够用就转发广告,不够用就回复 Talker Failed。
  • Listener 注册:Listener 收到广告后,回复 Listener Ready,交换机把预留信息写入自己的转发表。
参数 含义 典型值(48kHz 音频)
Stream ID 全局唯一的流标识 MAC + 16位序号
MaxFrameSize 单帧最大字节数 144 字节(含头部)
MaxIntervalFrames 每个 Class 测量间隔内的帧数 1 帧 / 125 µs
VLAN ID 所属的 AVB VLAN 2(默认)
注意:SRP 预留的是带宽,不是时隙。它保证交换机不会因为拥塞而丢弃 AVB 流,但不保证延迟。延迟控制是 FQTSS 的事。

2.3 FQTSS(IEEE 802.1Qav)—— 流量整形与优先级

FQTSS 是 Forwarding and Queuing Enhancements for Time-Sensitive Streams,时间敏感流的转发与队列增强。名字很长,但做的事情很纯粹:给 AVB 流开绿灯。

标准以太网交换机用的是 FIFO 队列,谁先到谁先走。但 AVB 流需要的是「准时走」,而不是「尽快走」。FQTSS 引入了两个关键机制:

  • 优先级队列:AVB 流被映射到两个 Class(Class A 和 Class B),Class A 优先级最高,Class B 次之,普通数据流最低。
  • 基于信用的整形器(CBS):每个 Class 有一个信用值,信用足够时才能发送。信用值随时间线性增加,发送时线性减少。这样能平滑突发流量,保证最大延迟可控。

我记得第一次调试 CBS 参数时,把 Class A 的 idleSlope 设得太小,结果音频流经常被饿死,声音断断续续。后来查了标准才知道,idleSlope 必须等于该 Class 预留的带宽。

延迟保证:Class A 的最大端到端延迟为 2 ms(7 跳以内),Class B 为 50 ms。这是 AVB 最核心的承诺。

2.4 AVTP(IEEE 1722)—— 音频数据的封装格式

AVTP 是 Audio Video Transport Protocol,音视频传输协议。它定义了音频样本怎么打包成以太网帧。

前面三个协议解决了「什么时候发」和「能不能发」的问题,AVTP 解决的是「发什么」的问题。它把 PCM 音频数据、时间戳、流信息封装成一个标准格式,接收端拿到后可以直接还原。

AVTP 帧的结构如下:

+----------------+----------------+----------------+----------------+
|  Ethernet Header (14 bytes)     |  VLAN Tag (4 bytes)  |  EtherType (2 bytes) |
+----------------+----------------+----------------+----------------+
|  AVTP Header (12 bytes)         |  AVTP Payload (可变)  |  FCS (4 bytes)       |
+----------------+----------------+----------------+----------------+

AVTP Header 里最重要的字段是 Timestamp,它记录了音频样本的采集时刻。接收端根据这个时间戳和 gPTP 同步的时钟,决定什么时候播放。这样即使网络有抖动,播放端也能通过缓冲区平滑掉。

我见过不少工程师在 AVTP 的 payload 里塞了非标准的元数据,结果接收端解析失败。记住:AVTP 的 payload 格式必须严格遵循 IEEE 1722 的 AVTPDU 定义,不要自己发明格式。

2.5 协议栈协同关系图

下面这张图展示了四个协议在 AVB 协议栈中的位置和协作关系:

AVB 核心协议栈协同关系 应用层(AES67 / Dante / AVB 音频流) AVTP(IEEE 1722)— 数据封装 传输控制层 SRP(IEEE 802.1Qat)— 带宽预留 FQTSS(IEEE 802.1Qav)— 队列整形与优先级 gPTP(IEEE 802.1AS)— 时钟同步 + 物理层 ! gPTP 为所有上层协议提供统一时间基准

从图中可以看出,gPTP 在最底层,为所有协议提供时间基准。FQTSS 和 SRP 在中间层,一个管队列,一个管带宽。AVTP 在最上层,负责把音频数据打包成标准格式。四者缺一不可。

2.6 协议栈部署要点

最后,我总结几个实际部署中容易踩的坑:

  • gPTP 域 ID:所有设备必须在同一个 gPTP 域(domain number)内,默认是 0。我曾经见过两台设备域 ID 不一致,同步死活不成功。
  • SRP 超时:Listener 注册后,如果 3 秒内没有收到 Talker 的数据流,SRP 会自动撤销预留。调试时要注意抓包确认。
  • FQTSS 的 CBS 参数:Class A 的 sendSlope 和 idleSlope 必须根据链路速率和预留带宽计算,不能随便填。公式在 802.1Qav 的 8.6.8 节有详细说明。
  • AVTP 时间戳:时间戳的单位是纳秒,基于 gPTP 的 Grandmaster 时钟。如果 gPTP 不同步,AVTP 的时间戳就是废纸。
我的习惯:每次部署 AVB 网络,我都会先用 Wireshark 抓 gPTP 的 Sync 报文,确认所有设备的时钟偏差在 ±500 ns 以内。这一步过了,后面的 SRP 和 AVTP 基本不会出大问题。