2、AVB核心协议:gPTP时间同步、SRP流预留、FQTSS转发增强

好,咱们直接进入正题。AVB这套协议栈,说白了就是给以太网装上「实时性」的翅膀。很多刚接触的朋友问我:AVB到底牛在哪?我的回答很简单——它让普通以太网学会了「守时」和「排队」。

我个人习惯把AVB核心协议拆成三块来看:gPTP负责对表,SRP负责占座,FQTSS负责插队。这三兄弟配合好了,音视频数据才能在车载网络里跑得又稳又准。下面我一个一个讲。

2.1 gPTP(IEEE 802.1AS)——时间同步原理

时间同步是AVB的基石。你想想看,如果各个节点的时钟都不准,那流预留和排队调度全是白搭。gPTP干的事,就是让网络里所有节点都对齐到一个主时钟上。

2.1.1 主从架构怎么选?

gPTP用的是主从同步方式。网络里会选出一个「 grandmaster 」,也就是最高级的主时钟。其他节点都是「 slave 」,跟着主时钟走。

选主的过程叫BMCA(最佳主时钟算法)。嗯,这里要注意:BMCA不是随便选的,它看的是时钟的优先级、精度等级、时钟类这些参数。我在项目中遇到过,有些工程师把GPS模块的PPS信号直接喂给gPTP,结果BMCA死活不认——因为优先级没配对。

核心要点: gPTP的同步精度目标是±1μs以内。实际项目中,百兆以太网通常能做到±500ns,千兆能到±200ns。

2.1.2 同步报文怎么跑?

gPTP主要靠两种报文来同步:Sync报文Follow_Up报文。流程是这样的:

  1. 主时钟发Sync报文,里面带个大概的发送时间t1
  2. 从时钟收到Sync,记下接收时间t2
  3. 主时钟紧接着发Follow_Up,把精确的t1告诉从时钟
  4. 从时钟再发Delay_Req给主时钟,记下发送时间t3
  5. 主时钟回Delay_Resp,告诉从时钟精确的接收时间t4

有了t1、t2、t3、t4这四个时间戳,从时钟就能算出链路延迟和时钟偏差,然后调整自己的本地时钟。说白了就是:你慢了我调快,你快了我调慢

我的经验: 调试gPTP时,最常踩的坑是PTP时钟域没配对。我曾经花了一整天,才发现主从设备的domainNumber设成了不同值。记住:domainNumber必须一致!

2.1.3 硬件时间戳为什么重要?

这里我要强调一点:gPTP必须用硬件时间戳。为什么?因为软件打时间戳的抖动太大,动不动就几十微秒,根本满足不了AVB的要求。

我建议你在选型时,确认一下MAC或PHY是否支持IEEE 1588v2硬件时间戳。像TI的DP83640、NXP的i.MX系列都内置了硬件时间戳单元。没有硬件支持,gPTP就是空中楼阁。

2.2 SRP(IEEE 802.1Qat)——流预留协议

SRP干的事,说白了就是「占座」。你想在网络上传输音视频流,得先跟沿途的交换机打个招呼:我要用多少带宽,延迟要求多少,你帮我预留一下。

2.2.1 注册与撤销流程

SRP用两个核心消息:Talker AdvertiseListener Ready。流程是这样的:

  1. 发送端(Talker)发Advertise,告诉网络:我要发流了,带宽是X,VLAN ID是Y
  2. 接收端(Listener)收到后,如果同意,就回Ready消息
  3. 沿途的交换机看到Ready,就知道要预留资源了
  4. 如果某个交换机资源不够,它会发Failed消息,整个预留就失败

你想想看,这就像你坐飞机选座——你选好了,系统锁定座位,别人就不能占了。SRP也是这个道理。

避坑指南: 我曾经遇到过一个案例,SRP预留总是失败。查了半天,发现是交换机的MSRP(Multiple Stream Reservation Protocol)表项满了。默认配置下,很多交换机的MSRP表项只有几十个,流一多就炸。记得根据实际需求调整表项深度。

2.2.2 流预留的关键参数

SRP预留时,需要指定几个关键参数。我整理了一个表格,方便你对照:

参数 说明 典型值
Stream ID 流的唯一标识,由MAC地址和流句柄组成 00:11:22:33:44:55 + 0x0001
VLAN ID 流所属的VLAN,用于隔离和优先级 2-4094(推荐用100-200)
MaxFrameSize 最大帧长度,包括头部 1518字节(标准)或1522字节(带VLAN)
MaxIntervalFrames 每个时间间隔内最多发送的帧数 1(通常)
DataRate 预留的带宽,单位bps 根据音视频码率计算

嗯,这里要注意:DataRate的计算要留余量。我一般会多算20%,因为以太网帧有前导码、帧间距这些开销。别到时候预留了80Mbps,实际跑起来发现不够用。

2.3 FQTSS(IEEE 802.1Qav)——转发与排队增强

FQTSS是AVB的「交通警察」。它负责管理数据帧的转发和排队,确保时间敏感流(Class A和Class B)能优先通过。

2.3.1 优先级队列怎么分?

FQTSS把流量分成两类:

  • Class A: 最高优先级,延迟要求≤2ms,抖动≤125μs。适合音频流。
  • Class B: 次高优先级,延迟要求≤50ms,抖动≤250μs。适合视频流。
  • Best Effort: 普通数据,没有延迟保证。

交换机内部有8个优先级队列。FQTSS把Class A映射到最高优先级队列(通常是队列7),Class B映射到次高(队列6),其他数据往后排。

关键机制: FQTSS用的是信用值整形(Credit-Based Shaper, CBS)。每个队列都有一个信用值,信用值够了才能发送。Class A和Class B的信用值恢复速度不同,Class A更快,所以能抢到更多发送机会。

2.3.2 信用值整形怎么算?

信用值整形的核心公式其实不复杂:

// 信用值变化规则
// 发送时:信用值以 sendSlope 速率减少
// 空闲时:信用值以 idleSlope 速率增加
// 信用值不能为负,也不能超过上限

// 参数计算示例(Class A,100Mbps链路)
idleSlope = 预留带宽 = 25 Mbps
sendSlope = idleSlope - portTransmitRate = 25 - 100 = -75 Mbps
hiCredit = maxFrameSize * (idleSlope / portTransmitRate) 
         = 1518 * 8 * (25 / 100) = 3036 bytes
loCredit = maxFrameSize * (sendSlope / portTransmitRate) 
         = 1518 * 8 * (-75 / 100) = -9108 bytes

说白了,信用值整形就是用「借」和「还」的方式来控制发送节奏。你预留了25Mbps的带宽,系统就保证你至少能用到这么多,但别想超。

我的调试技巧: 在示波器上抓FQTSS的发送波形时,注意看帧间距。Class A的帧间距应该非常均匀,不会出现背靠背发送的情况。如果看到Class A帧扎堆出现,说明CBS参数没配对,或者队列映射错了。

2.3.3 三个协议怎么配合?

最后,我简单说一下这三个协议怎么协同工作:

  1. gPTP先对表: 所有节点时间同步,这是前提。
  2. SRP再占座: 发送端发起流预留,沿途交换机确认资源。
  3. FQTSS最后管排队: 数据流开始传输时,FQTSS按优先级和信用值调度。

你想想看,如果时间没同步,SRP预留的带宽可能被误判;如果SRP没预留,FQTSS调度时就没有资源保障。这三者环环相扣,缺一不可。

重要提醒: 调试AVB网络时,我建议按这个顺序排查:先确认gPTP同步精度(用ptp4l工具看offset),再检查SRP预留状态(看交换机的MSRP表),最后用Wireshark抓FQTSS的优先级标记。一步错,步步错。

好了,AVB核心协议就讲到这里。下一章我们聊聊AVB的调试工具和实战案例,到时候我会分享一些我在实车上踩过的坑,保证让你少走弯路。