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 才准发。哪怕它是最高优先级,账是负的也得憋着。具体规则:
- 正在发帧:credit 按 sendSlope 线性下降
- 队列非空但发不了(别的类正占着线):credit 按 idleSlope 上涨,允许涨过 0——被堵得越久,攒下的额度越多
- 队列空了且 credit > 0:清零,不搞跨突发累计
- 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 A | 2 ms / 最多 7 跳 | 125 µs | 8 kHz | 实时音频 |
| Class B | 50 ms / 最多 7 跳 | 250 µs | 4 kHz | 视频等中速流 |
两条硬杠:两档预留总量 ≤ 链路带宽的 75%,剩下留给 BE——这是准入红线,超了不是变慢,是流建不起来;控制流量(gPTP、SRP 自己)优先级排第三,压在 A、B 之下、BE 之上。
整形粒度也有讲究:talker 侧按每流每类整形,桥侧按每类每端口——桥只保证这个端口上这一类的总量不超,不细分到具体哪条流。想细分,那是下一篇 Qci 的事。
四、SRP:预留是谈出来的
CBS 的 idleSlope 不是手工填的,是 SRP(802.1Qat 流保留协议)沿路谈出来的:
- talker 广播 TalkerAdvertise,带 TSpec:帧间隔 Interval、每间隔最大帧数 MaxFramesPerInterval、最大帧长 MaxFrameSize
- 每台桥做准入判断:本端口该类带宽够不够——够,往下传;不够, advertise fail
- listener 注册,反向确认;talker 收到确认才开始发
- 一条流的预留带宽 = 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 帧抢占