2. 车载网络基础
AVB 音频桥接,说白了就是一套让音视频数据在标准以太网上「准时到达」的协议组合。很多刚接触 AVB 的朋友容易把四个协议混为一谈,觉得它们是一锅粥。其实不是,它们分工非常明确。
我个人习惯把这四个协议比作一个物流系统:gPTP 是时钟,SRP 是调度员,FQTSS 是传送带,AVTP 是包裹。下面我们一个一个拆开看。
2.1 gPTP(IEEE 802.1AS)—— 全网的统一心跳
gPTP 的全称是 generalized Precision Time Protocol,通用精确时间协议。它解决的是 AVB 网络里最根本的问题:所有设备的时间必须一致。
你想想看,如果扬声器 A 和扬声器 B 的时钟差了几微秒,声音就会出现相位偏移,人耳虽然不一定能听出具体差多少,但声场定位会变得模糊。我在项目中遇到过最夸张的一次,两台设备差了 200 微秒,结果立体声听起来像在房间里转圈。
gPTP 和传统 NTP 最大的区别在于:它不依赖软件时间戳,而是靠硬件时间戳在 MAC 层打标记。这样能避免协议栈和操作系统带来的抖动。
具体工作流程分三步:
- 主时钟选举:网络里所有设备通过 BMCA(最佳主时钟算法)选出一个 Grandmaster(GM)。GM 通常是交换机或者专用的时钟源。
- 链路延迟测量:每台设备与邻居设备交换 Pdelay_Req / Pdelay_Resp 报文,算出链路延迟。
- 时钟同步:GM 周期性发送 Sync 报文,下游设备根据链路延迟修正本地时钟。
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(默认) |
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 预留的带宽。
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 协议栈中的位置和协作关系:
从图中可以看出,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 的时间戳就是废纸。