TSN 专题 · 第二批 · 第 2 篇:上一篇留了个坑——Qbv 的保护带按"最大帧"留,带宽白流。Qbu 就是来填这个坑的。
Qbv 篇结尾说过:门不能当即时关,因为帧一旦开始发送就停不下来,只能等它发完——所以每个条目都得额留一段保护带给当前帧收尾。千兆车载链路上一个 1500 字节的帧要占约 12 µs,一个 250 µs 的周期里四个条目都留,最多 48 µs 就白白流走了,接近两成带宽。
这篇讲 802.1Qbu 帧抢占:让帧可以被掐断,把保护带从"一整个大帧"缩到"一个碎片"。
一、两个标准,一套机制
帧抢占这件事由两个标准合起来定义,分工明确:
| 标准 | 管什么 |
|---|---|
| 802.1Qbu | 桥这一侧:每条队列/优先级标记为 express(快)还是 preemptable(可抢),默认全部 express |
| 802.3br | MAC 这一侧(Interspersing Express Traffic):MAC Merge 子层怎么把帧掐断、续传、重组 |
MAC 侧的结构一句话:一个端口挂两套 MAC。
- eMAC(Express MAC):快车道。跑 express 队列的帧,永远不被打断
- pMAC(Preemptable MAC):慢车道。跑 preemptable 队列的帧,随时可能被掐
- MAC Merge 子层:两套 MAC 复用一个 PHY,它负责在两者之间"插队"
两种插队方式:掐断——pMAC 的帧正在发,eMAC 有帧要发,当场在碎片边界切断;拦截——pMAC 还没开始发,eMAC 直接按住不让它启动。后者连碎片都不产生,express 的延迟最干净。
二、抢断的规矩:不是想掐就掐
抢占有几条硬规矩,全是为了让接收端能还原:
- 已发至少 60 字节、剩余至少 64 字节才允许掐。剩余不足 64 字节的尾巴不值得抢(也保证了每一片都不是 runt);总共不到 124 字节左右的短帧根本抢不动——小帧密集的场景,Qbu 帮不上忙
- 只能掐在碎片边界:当前碎片发完(带一个 4 字节的 mCRC 碎片校验),eMAC 帧才上线
- 续传有身份:pMAC 恢复发送时带 SMD-C 续传标记,且每续一片 FRAG_COUNT 加一——接收端靠它发现"中间丢了一片",绝不把错位的碎片拼成一帧
- 只有最后一片带整帧 FCS:中间碎片只保自己那片,最后一片才携带原始帧的完整校验
线上的样子大概是这样:
原 pMAC 帧(1522B):
[SMD-S 起片 64B][ 剩余 ~1400B ]
↑ eMAC 就绪,在碎片边界掐断
实际线上:
[SMD-S 起片+mCRC][ express 帧 ][SMD-C 续片+mCRC][SMD-C 续片+mCRC] … [尾片+FCS]
(SMD 是 Start mPacket Delimiter,占前导最后一个字节的位置,标记这片是起片、续片还是 express 帧——PHY 完全感知不到抢占的发生,这就是为什么 802.3br 起名"交织快车道流量"。)
三、算账:保护带从 12 µs 到 0.6 µs
保护带的本质是"不可打断的发送时间"。抢占把这个量从最大帧换成一个碎片:
| 链路 | 不抢占(1518B 帧) | 抢占后(64B 碎片 + 同步误差) | 缩水比 |
|---|---|---|---|
| 100 Mb/s | ~120 µs | ~6 µs 量级 | 约 1/20 |
| 1000 Mb/s | 12.1 µs | 约 0.6 µs | 约 1/20 |
| 10 Gb/s | 1.2 µs | ~0.1 µs 量级 | 约 1/10 |
回到 Qbv 篇那个 250 µs 的周期:四个条目、每个保护带从 12 µs 换成 0.6 µs,每周期省出约 46 µs,接近 19% 的带宽还给了数据流量。
代价也不是没有:
- 每片约 8 字节开销(SMD + mCRC + 续传),1522 字节的帧最多被切成 24 片——片越多,额外字节越多
- 速率越高,保护带里"同步误差"项的占比越大(百兆时碎片项占九成以上,百 G 时反而一半以上是同步项)——高速链路上,省大帧的钱被同步精度吃回去一半,别指望线性受益
四、逐跳进行,不是端到端
一个容易误解的点:抢占是链路级机制,不是端到端。每台交换机把收到的碎片完整重组成整帧、正常查表转发,再到自己的出口决定要不要重新碎片化。
好处很直接:
- 中间可以混着不支持 Qbu 的老设备——那段链路上没有抢占收益,但协议照常工作
- 每跳的收益独立计算,端到端延迟是"每跳分别算出来再累加"
五、开启之前:协商与验证
抢占不能单方面打开——你发碎片过去,对端要是普通 MAC,直接把 mCRC 当成帧内容,一场灾难。所以 802.3br 规定了验证流程:
- 通过 LLDP(Additional Ethernet Capabilities TLV)告知对端"我支持抢占"
- 双端进入验证阶段,互发验证帧(SMD-V)和响应帧(SMD-R)
- 验证通过,抢占才真正在发送方向使能;验证不过就退回普通模式,链路照常跑
工程上的含义:配了 Qbu 却不生效,先看两端是否都支持、LLDP 邻居能力有没有认出来、验证是否通过——芯片不互认是头号原因。
六、工程配置与几个坑
- 谁 express 谁 preemptable:典型车载配置是把最高一两个优先级(安全控制、gPTP 事件报文)设 express,其余全部 preemptable。默认全 express——不配就等于没开
- 和 Qbv 的 GCL 一起改:开了抢占,保护带要按 64B 碎片重算,周期里能多排不少真流量;只开 Qbu 不改 GCL,收益拿不到
- pMAC 流的延迟会变差:抢占是把延迟从低优先级流转移给高优先级流,总量没消失。尽力而为流量被反复掐、反复排队,它的最坏延迟反而上升——做容量规划时按"最坏被掐次数"算,别按平均值
- 接收侧重组缓冲要留够:express 帧里还能再插 express(嵌套抢占),pMAC 侧要有缓冲存住多个"被掐了一半"的帧
- 小帧密集流别放 pMAC:短于约 124 字节抢不动,还白付每片的 SMD/mCRC 开销,放 express 更干脆
七、结语
到这篇,Qbv + Qbu 的组合拳打完了:门控定节奏,抢占清障碍。Qbv 让每条流知道几点几分上场,Qbu 让"收尾"从一整个大帧缩到一个碎片——保护带省下的近两成带宽,就是 TSN 从"能用"到"好用"的那一步。
下一篇补上七子类里唯一从 AVB 继承的老将——802.1Qav 信用整形器:Qbv 用时间驱动,它用信用驱动。讲讲"带宽预留"这个词的来历。
你们项目里 Qbu 开了吗?保护带重算后周期里多排了多少流量?评论区报个数。
TSN 专题 · 第二批(门控与抢占)
(一)Qbv 时间门 ·(二)本篇:帧抢占
第一批(gPTP 基本原理):(一)全景 · (二)BMCA · (三)对时数学 · (四)correctionField