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死活不认——因为优先级没配对。
2.1.2 同步报文怎么跑?
gPTP主要靠两种报文来同步:Sync报文和Follow_Up报文。流程是这样的:
- 主时钟发Sync报文,里面带个大概的发送时间t1
- 从时钟收到Sync,记下接收时间t2
- 主时钟紧接着发Follow_Up,把精确的t1告诉从时钟
- 从时钟再发Delay_Req给主时钟,记下发送时间t3
- 主时钟回Delay_Resp,告诉从时钟精确的接收时间t4
有了t1、t2、t3、t4这四个时间戳,从时钟就能算出链路延迟和时钟偏差,然后调整自己的本地时钟。说白了就是:你慢了我调快,你快了我调慢。
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 Advertise和Listener Ready。流程是这样的:
- 发送端(Talker)发Advertise,告诉网络:我要发流了,带宽是X,VLAN ID是Y
- 接收端(Listener)收到后,如果同意,就回Ready消息
- 沿途的交换机看到Ready,就知道要预留资源了
- 如果某个交换机资源不够,它会发Failed消息,整个预留就失败
你想想看,这就像你坐飞机选座——你选好了,系统锁定座位,别人就不能占了。SRP也是这个道理。
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),其他数据往后排。
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的带宽,系统就保证你至少能用到这么多,但别想超。
2.3.3 三个协议怎么配合?
最后,我简单说一下这三个协议怎么协同工作:
- gPTP先对表: 所有节点时间同步,这是前提。
- SRP再占座: 发送端发起流预留,沿途交换机确认资源。
- FQTSS最后管排队: 数据流开始传输时,FQTSS按优先级和信用值调度。
你想想看,如果时间没同步,SRP预留的带宽可能被误判;如果SRP没预留,FQTSS调度时就没有资源保障。这三者环环相扣,缺一不可。
好了,AVB核心协议就讲到这里。下一章我们聊聊AVB的调试工具和实战案例,到时候我会分享一些我在实车上踩过的坑,保证让你少走弯路。