3. TSN协议栈基础:IEEE 802.1Qbv、802.1Qbu、802.1AS概念解析

好,咱们进入TSN最核心的三个协议。说实话,刚接触TSN的时候,我也被这一堆802.1的编号搞得头大。但别急,咱们一个一个拆开看,你会发现它们其实挺接地气的。

这三个协议解决的是三个不同的问题:什么时候发、发一半能不能打断、大家时间对不对得上。我习惯把它们叫做TSN的「三驾马车」。你想想看,一个工厂里,机器人的控制指令必须准时到,视频流可以稍微晚点,普通数据更无所谓。怎么让它们和谐共处?就是靠这三个家伙。

3.1 IEEE 802.1Qbv:时间感知整形(TAS)

Qbv,全称是Time-Aware Shaper,时间感知整形。说白了,就是给网络装了个红绿灯。

核心思想:把时间切成一个个小窗口,每个窗口只允许特定类型的数据通过。

举个例子。我做过一个项目,生产线上的机械臂每1毫秒要发一次控制指令。如果这时候有人传个大文件,把网络堵死了,机械臂就乱套了。Qbv怎么解决?它把1毫秒分成几个时隙:

  • 0~200微秒:只走控制指令(最高优先级)
  • 200~600微秒:只走视频流
  • 600~1000微秒:走普通数据

这样一来,控制指令永远有专属通道,谁也抢不走。

关键参数:门控列表(Gate Control List, GCL)

每个端口有8个队列,每个队列对应一个门。门开,数据就能走;门关,就等着。GCL就是一张时间表,告诉交换机什么时候开哪个门。

配置Qbv的时候,我建议你先画个时间轴。把关键流量画上去,看看它们的时间要求。我曾经有个客户,非要把所有数据都塞进同一个时隙,结果延迟反而更大了。嗯,这里要注意:时隙不是越多越好,也不是越少越好,得根据实际流量来算。

# 一个简单的GCL配置示例(伪代码)
# 周期1000微秒,8个队列
GCL:
  - time: 0,     gates: [1,0,0,0,0,0,0,0]  # 只开队列0(控制指令)
  - time: 200,   gates: [0,1,1,0,0,0,0,0]  # 开队列1和2(视频流)
  - time: 600,   gates: [0,0,0,1,1,1,1,1]  # 开所有其他队列(普通数据)
  - time: 1000,  gates: [0,0,0,0,0,0,0,0]  # 保护带,全部关闭

避坑指南:保护带(Guard Band)一定要留够。我曾经因为保护带设得太短,导致上一个时隙的数据包拖到了下一个时隙,把控制指令给污染了。一般建议保护带长度等于最大帧传输时间。

3.2 IEEE 802.1Qbu:帧抢占(Frame Preemption)

Qbu解决的是另一个问题:大包堵路怎么办?

你想想看,一个1500字节的以太网帧正在传输,这时候来了个紧急的控制帧,只有64字节。按照普通规则,得等大包传完,小包才能走。这一等可能就是几十微秒,对于控制指令来说太长了。

Qbu的做法很聪明:把大包拆了,先让小包过去

具体来说,大包传着传着,突然来了个高优先级的小包。交换机就把大包暂停,拆成两个片段(Fragment),先发小包,再发剩下的片段。接收端再把片段拼回去,上层应用完全感知不到。

关键点:可抢占MAC(pMAC)和表达MAC(eMAC)

pMAC负责发高优先级的小包,eMAC负责发普通的大包。两者共用一条物理链路,但逻辑上是独立的。

我记得第一次测试Qbu的时候,用示波器看波形,发现大包中间确实有个「缺口」,小包就插在那个缺口里。说实话,第一次看到这个效果,还是挺震撼的。

注意:帧抢占需要链路两端都支持。如果一端支持,另一端不支持,就会自动回退到普通模式。我建议你在部署前先用工具扫一遍,看看哪些设备支持Qbu。

3.3 IEEE 802.1AS:时钟同步(gPTP)

时钟同步,这是TSN的基石。没有它,Qbv和Qbu都是空中楼阁。

802.1AS,也叫gPTP(generalized Precision Time Protocol)。它和普通的PTP(IEEE 1588)有点像,但针对TSN做了优化。

核心原理:选一个主时钟(Grandmaster),其他设备都跟着它走。主时钟通过发Sync报文告诉别人「现在是几点几分几秒」,从时钟收到后,根据链路延迟修正自己的时钟。

我习惯把时钟同步比作「对表」。你想想看,一个车间里几十台设备,如果各走各的时间,Qbv的时隙就全乱套了。你说0微秒发控制指令,但你的时钟比主时钟慢了10微秒,那指令就晚了10微秒,可能就出事故了。

802.1AS的精度能做到亚微秒级。我在实验室里测过,用树莓派加TSN扩展板,同步精度大概在±200纳秒左右。对于大多数工业场景,这个精度完全够用。

# 查看时钟同步状态(Linux系统)
# 安装gPTP软件包
sudo apt-get install linuxptp

# 启动gPTP客户端
sudo ptp4l -i eth0 -m -f gPTP.cfg

# 查看同步结果
sudo pmc -u -b 0 'GET CURRENT_DATA_SET'

# 输出示例(简化)
# 主时钟ID: 00:1A:2B:3C:4D:5E
# 偏移量: +12 ns
# 路径延迟: 1850 ns

个人经验:时钟同步最怕的是网络抖动。我曾经在一个项目里,因为交换机缓存设置不对,导致Sync报文的延迟忽大忽小,同步精度直接掉到微秒级。后来把交换机的缓存调大,问题就解决了。所以,网络越稳定,时钟越准

3.4 三个协议的关系

这三个协议不是孤立的,它们互相配合:

协议 解决的问题 依赖
802.1Qbv 什么时候发数据 需要802.1AS提供统一时间
802.1Qbu 大包堵路怎么办 需要802.1Qbv配合调度
802.1AS 大家时间对不对得上 独立运行,但为其他协议提供基础

说白了,802.1AS是钟,802.1Qbv是红绿灯,802.1Qbu是应急车道。没有钟,红绿灯不知道什么时候切换;没有红绿灯,应急车道也发挥不了作用。

实战建议:在树莓派上搭建TSN实验平台时,我建议先搞定802.1AS时钟同步。等所有设备的时间都对齐了,再配置Qbv的时隙,最后测试Qbu的帧抢占效果。一步一步来,别想一口吃成胖子。

好,这一章的内容就到这儿。下一章咱们会动手在树莓派上配置这些协议,看看实际效果。到时候你会发现,理论懂了,动手其实也不难。