2. TSN核心标准:802.1Qbv、802.1Qbu、802.1Qci

好,咱们直接进入正题。TSN 协议栈里,有三个标准我几乎天天打交道。它们分别是时间感知整形器(Qbv)、帧抢占(Qbu)和流过滤与监管(Qci)。

这三个家伙,说白了就是 TSN 的「三驾马车」。一个管时间调度,一个管打断传输,一个管流量准入。我当年刚接触时,也觉得它们各管各的。后来踩了坑才明白,它们必须配合使用。

2.1 802.1Qbv:时间感知整形器

Qbv 的核心思想很简单:把时间切成片。每个时间片里,只允许特定类型的流量通过。

举个例子。你想想看,车载以太网上既有摄像头数据,又有控制指令。摄像头数据量大,但可以容忍一点点延迟。控制指令数据量小,但必须准时到达。如果它们同时抢带宽,控制指令就可能被堵住。

Qbv 怎么解决?它给每个端口配了一个「门控列表」。这个列表告诉交换机:在 T0 到 T1 这段时间,只开控制指令的门。在 T1 到 T2 这段时间,只开摄像头数据的门。其他门全部关闭。

关键参数:

  • 门控列表(Gate Control List, GCL):定义了每个时间窗口的开关状态
  • 基准时间(Base Time):整个调度周期的起始点
  • 周期时间(Cycle Time):GCL 重复执行的周期

我个人习惯把 GCL 想象成一个「交通信号灯」。红灯停,绿灯行。只不过这里的灯有 8 个(对应 8 个优先级队列)。

// 一个简单的 GCL 配置示例
// 假设周期为 1ms,前 200us 给控制指令,后 800us 给摄像头数据
GCL 条目:
  时间 0us:    队列7(控制)开,其他队列关
  时间 200us:  队列5(摄像头)开,其他队列关
  时间 1000us: 回到时间 0us 的状态

我在项目中遇到过一个问题:如果 GCL 的基准时间没有同步,不同交换机的门控就会错位。控制指令在交换机 A 通过了,到了交换机 B 却被关在门外。嗯,这里要注意,Qbv 必须配合 802.1AS(时间同步)一起用。

避坑指南:我曾经因为 GCL 的周期设置得太短,导致交换机频繁切换门控状态,CPU 负载飙升。建议周期不要小于 100us,除非你的硬件足够强悍。

2.2 802.1Qbu:帧抢占

Qbv 虽然好,但它有个问题:时间片是固定的。如果控制指令的时间片到了,但摄像头的数据帧正在传输怎么办?

Qbu 就是来解决这个问题的。它允许一个正在传输的帧被「打断」。打断后,先发高优先级的帧,然后再恢复传输被打断的帧。

说白了,就是「插队」机制。但这里的插队是有规矩的。

工作原理:

  • 发送端把一个大帧切成一个个小片段(Fragment)
  • 每个片段前面加一个「片段头」,标明这是第几个片段
  • 高优先级帧来了,直接插入到两个片段之间
  • 接收端把所有片段重新组装成完整帧

你可能会问:那接收端怎么知道哪些片段属于同一个帧?答案是通过片段头里的序列号。我刚开始做 Qbu 实现时,就栽在这个序列号上。有一次测试发现,接收端总是丢帧。查了半天,原来是发送端的序列号计数器溢出了。

// 帧抢占的片段格式
// 原始帧:| 前导码 | 帧头 | 数据负载 | FCS |
// 被抢占后:| 前导码 | 片段头1 | 数据1 | FCS1 | 
//            | 前导码 | 片段头2 | 数据2 | FCS2 |

Qbu 有个限制:只能抢占非时间敏感的流量。比如摄像头数据可以被抢占,但控制指令不能被抢占。这个逻辑其实很合理——你总不能让控制指令被摄像头数据打断吧?

关键点:

  • Qbu 只工作在链路上,不涉及端到端
  • 被抢占的帧必须是可抢占帧(通过帧头的一个标志位标识)
  • 最小片段大小是 64 字节(以太网最小帧长)

2.3 802.1Qci:流过滤与监管

Qbv 和 Qbu 解决了「怎么传」的问题。但还有一个问题:谁可以传?

Qci 就是干这个的。它像一个「门卫」,在数据进入交换机之前,先检查一下:这个流符合规矩吗?

我举个例子。假设你给摄像头分配了 100Mbps 的带宽。但摄像头出了故障,突然发了 200Mbps 的数据。如果没有 Qci,这 200Mbps 就会挤占其他流量的带宽,导致控制指令延迟。

Qci 会怎么做?它会根据预设的规则,把超出的 100Mbps 直接丢弃或标记为低优先级。

Qci 的核心功能:

  • 流识别(Stream Identification):根据源 MAC、目的 MAC、VLAN ID 等识别一个流
  • 流量监管(Policing):使用令牌桶算法,限制每个流的带宽
  • 过滤(Filtering):丢弃不符合规则的帧
// 令牌桶算法示例
// 假设摄像头流限制为 100Mbps,突发大小为 1500 字节
令牌桶参数:
  承诺信息速率(CIR):100 Mbps
  承诺突发大小(CBS):1500 字节
  超额信息速率(EIR):0(不允许超额)

处理逻辑:
  每到达一个帧,检查令牌桶中是否有足够的令牌
  如果有,放行并消耗对应数量的令牌
  如果没有,直接丢弃该帧

我记得有一次调试,发现某个摄像头流总是被 Qci 丢弃。检查了半天,发现是 CBS 设置得太小了。摄像头偶尔会发一个大的 I 帧,超过了 CBS 的大小。嗯,这里要注意,CBS 要设置得比最大帧长大一些。

避坑指南:我曾经把 Qci 的过滤规则设置得太严格,导致正常的 ARP 请求都被丢弃了。建议在部署 Qci 之前,先用抓包工具分析一下网络中的正常流量模式。

2.4 三个标准的配合

这三个标准不是孤立的。它们必须协同工作,才能实现真正的确定性通信。

标准 作用 配合关系
802.1Qbv 时间调度 Qbv 保证高优先级流量在特定时间窗口内独占带宽
802.1Qbu 帧打断 Qbu 在 Qbv 的时间窗口边界处,处理正在传输的帧
802.1Qci 流量准入 Qci 在入口处限制流量,防止某个流破坏 Qbv 的调度

我个人的经验是:先配 Qci,再配 Qbv,最后配 Qbu。为什么?因为 Qci 先把不守规矩的流量挡在外面,Qbv 的调度才能准确。Qbu 是最后的补充,用来处理边界情况。

举个例子。你有一个控制指令流,要求延迟小于 100us。你先用 Qci 限制它的带宽为 10Mbps,防止它发太多。然后用 Qbv 给它分配一个 50us 的时间窗口。最后用 Qbu 确保即使有摄像头数据正在传输,控制指令也能在 50us 内发出去。

总结一下:

  • Qbv 是「时间表」,告诉交换机什么时候该做什么
  • Qbu 是「插队权」,让高优先级流量可以打断低优先级
  • Qci 是「门卫」,确保每个流都遵守规则

这三个标准配合好了,你的车载网络才能真正做到「该快的快,该准的准」。

下一章,我会讲 802.1Qav(信用整形器)和 802.1Qcr(异步整形器)。这两个标准处理的是另一种场景——没有全局时间同步时,怎么保证延迟?到时候见。