TSN 专题 · 第三批 · 第 1 篇:上一篇打完 Qbv + Qbu 的组合拳。这篇往回补七子类里唯一从 AVB 直接继承的老将——802.1Qav 信用整形器(CBS)。它比 Qbv 早生好几年,今天不少车载信息娱乐的音频流还跑在它上面。

Qbv 是"到点开门",Qbu 是"允许掐断"——两者都是时间驱动:拿着 gPTP 对齐的表,按时刻调度。Qav 完全是另一个路子:速率驱动。它不看表,只记账——每条队列一个"信用账户",花超了就得等账涨回来。

这篇讲清楚三件事:信用点几条规则怎么跑、Class A/B 两档预留怎么谈、以及它和 Qbv 到底怎么分工。

一、它要解决什么问题

先看没有整形的普通交换机。严格优先级已经保证高优先级帧不被低优先级堵——那还有什么问题?

问题出在高优先级自己身上:

  • 多路音视频流同时突发,能把尽力而为(BE)流量堵住几十毫秒——BE 不是"慢一点",是饿死
  • 高优先级流之间互相干扰:不同入口涌来的 SR 帧在桥内排队,缓冲越堆越高,最后丢包;音频一丢包就卡顿,重传补回来也过了演出时间
  • 帧批量到达把端到端延迟和抖动拉散,接收端缓冲区只能按最坏情况设计,成本飙升

核心矛盾一句话:既要给 SR 类插队的权力,又不能给它无限挥霍的自由。CBS 的答案是把"优先级"和"配额"绑在一起——你优先级高可以插队,但长期占用不许超过预留带宽。

二、机制:一条队列一个信用账户

CBS(Credit-Based Shaper)给每条 SR 队列配一个以 bit 为单位的计数器:

名词含义
credit(信用点)队列账户余额,单位 bit,初值 0
idleSlope充电速率(bit/s),等于该队列的预留带宽
sendSlope放电速率(bit/s)= idleSlope − 端口速率,是负数

门的开合只有一条判据:credit ≥ 0 才准发。哪怕它是最高优先级,账是负的也得憋着。具体规则:

  1. 正在发帧:credit 按 sendSlope 线性下降
  2. 队列非空但发不了(别的类正占着线):credit 按 idleSlope 上涨,允许涨过 0——被堵得越久,攒下的额度越多
  3. 队列空了且 credit > 0:清零,不搞跨突发累计
  4. credit < 0 且队列空:继续按 idleSlope 涨,涨回 0 为止

这套规则妙在它是自洽的。设端口速率 R、预留比例 r = idleSlope/R,发一个 F bit 的帧,credit 掉 F×(1−r);按 idleSlope 充回来要 F×(1−r)/idleSlope 秒。于是稳态下每帧的周期是"发送时间 + 等待时间",吞吐恰好等于:

吞吐 = F / ( F(1−r)/idleSlope + F/R ) = idleSlope

长期占用一分不多地等于预留带宽。举个实数:千兆端口给 Class A 队列预留 20 Mb/s(idleSlope = 20 Mb/s,sendSlope = −980 Mb/s)。一个 1500B(12000 bit)的帧发出去,账户掉 11760 bit,按 20 Mb/s 充回来要 588 µs,加上发送本身的 12 µs——每 600 µs 过一个 1500B 帧,正好 20 Mb/s。

(实现上通常还会加 hiCredit / loCredit 两个上限,由最大帧长和最大干扰量推出来,防止账户无限膨胀。)

三、Class A / Class B:AVB 的两档预留

AVB 把时间敏感流分两档,档位定义在 802.1BA profile 里:

档位端到端延迟预算发送周期最低帧频典型内容
Class A2 ms / 最多 7 跳125 µs8 kHz实时音频
Class B50 ms / 最多 7 跳250 µs4 kHz视频等中速流

两条硬杠:两档预留总量 ≤ 链路带宽的 75%,剩下留给 BE——这是准入红线,超了不是变慢,是流建不起来;控制流量(gPTP、SRP 自己)优先级排第三,压在 A、B 之下、BE 之上。

整形粒度也有讲究:talker 侧按每流每类整形,桥侧按每类每端口——桥只保证这个端口上这一类的总量不超,不细分到具体哪条流。想细分,那是下一篇 Qci 的事。

四、SRP:预留是谈出来的

CBS 的 idleSlope 不是手工填的,是 SRP(802.1Qat 流保留协议)沿路谈出来的:

  1. talker 广播 TalkerAdvertise,带 TSpec:帧间隔 Interval、每间隔最大帧数 MaxFramesPerInterval、最大帧长 MaxFrameSize
  2. 每台桥做准入判断:本端口该类带宽够不够——够,往下传;不够, advertise fail
  3. listener 注册,反向确认;talker 收到确认才开始发
  4. 一条流的预留带宽 = MaxFramesPerInterval × MaxFrameSize / Interval

于是 SRP 算出的预留带宽,直接变成沿途每台桥上 CBS 的 idleSlope——两个标准本来就是一套:一个谈配额,一个按配额放水。这也解释了 Class Measurement Interval 的存在:Class A 125 µs、Class B 250 µs,就是给"观测窗口"定的标尺,在这个窗口里量谁超速。

五、和 Qbv 对比:速率驱动 vs 时间驱动

Qav(CBS)Qbv(TAS)
驱动量信用点(速率)时刻表(时间)
保证强度长期平均速率逐周期时刻
延迟水平平均每跳可达 250 µs 量级固定周期,典型 125 µs 量级
配置方式SRP 自动协商全局时刻表(手排 / 工具 / Qcc 下发)
适合音视频流控制流
出问题时带宽被打穿(靠 Qci 兜底)表没对齐(靠 gPTP 兜底)

一句话选型:要"每周期精确时刻"的控制流上 Qbv,要"长期不超速"的音视频流留 Qav。现实车载骨干网经常两者并存:控制走 Qbv 门控,信息娱乐音频流留在 Qav 队列,共用同一条链路。

六、工程配置与几个坑

  • idleSlope 配错是最常见事故:配大了等于没整形(账户永远花不完),配小了合法突发被憋死——音频帧是周期性的,突发真实存在,别按平均值卡额度
  • "队列空时信用怎么处理"各厂商实现有差异:标准语义是清零/回零,联调时抓队列统计和丢弃计数对一遍,别信手册
  • A 会挤 B:CBS 只各自限速,延迟上 Class A 永远压着 Class B——B 档视频流的缓冲要按"A 持续抢占"设计
  • SRP 域要全链路开:中间一台不认,advertise 到不了 listener,表现是"流起不来"而不是"流慢"
  • 和 Qbv 混用时的摆位:CBS 队列通常占 GCL 里"常开"的门,别给它的门配定时关闭——否则 Qav 的账算得再好,门不开也发不出去
  • 75% 是红线不是建议:排 GCL 或加流时先把账算清,超线就是准入失败

七、结语

Qav 是"带宽预留"这四个字的起源——SRP 谈配额、CBS 按配额放水,一套分布式的 QoS 自洽跑了十几年。但君子协定挡不住故障节点:一条流声明 2 Mb/s 实发 20 Mb/s,谁执法?这正是下一篇的主题。

下一篇讲 802.1Qci 每流过滤与监管(PSFP):入口侧认人、量身材、掐超标——把"预留"从承诺变成强制。

你们车上的音频流还在跑 AVB 吗?idleSlope 按几成配的?评论区报个数。


TSN 专题 · 第三批(带宽:预留与监管)

(一)本篇:信用整形器 ·(二)每流过滤与监管

第一批(gPTP 基本原理):(一)全景 · (二)BMCA · (三)对时数学 · (四)correctionField

第二批(门控与抢占):(一)Qbv 时间门 · (二)Qbu 帧抢占

TSNQav802.1QavCBSAVB信用整形SRP