时间敏感网络是传统以太网的扩展,实现实时能力和确定性通信。终端通常是基于Linux OS 的,它的实时能力是通过PREEMPT-RT 补丁实现的。而设备的实时性网络是通过时间敏感性网络技术实现。到目前为止,大多数Linux OS 的TSN 都是通过特殊的解决方案实现的,那么,是否能够在主流的Linux 中实现TSN 网络呢?时间同步和流量调度都已经能够实现了。但是并没有实现完整的TSN 标准。
本文介绍如何在标准的Linux 系统中配置TSN ,主要是linuxptp,tc 等工具。
TSN 解决方案
TSN 网络的核心思想是将以太网通信带宽划分为多个流(stream)。数据流具有一个优先等级。与此同时,将数据包依据优先等级排队(传统的方式是先进先出方式),调度优先等级高的帧在一个stream 中传输。Stream 的调度方法采取时隙的方式,例如,将带宽分为固定周期,每个周期分为三个时隙,Slot0,Slot1和Slot3。time slot 0 的优先等级最高,time slot 1 其次。而time slot2 传输非实时数据。
实现TSN 的必备条件
时间同步协议PTP
显然,要实现数据的周期性时隙传输,必备的条件是网络中的所有设备和交换机需要使用全网统一时钟,这样才能够避免数据帧的发送冲突。实现时分复用(TDM time division multplexer)。在TSN中,使用IEEE1588/PTP 实现全网精确时钟同步。
Linux 内核具有支持PTP 硬件时钟(PHC)的子系统·,可以使用POSIX 时钟显示该时钟。通过·POSIX 接口读取,设置和控制。PTP 协议不是Linux 内核的一部分,在用户空间,使用linuxptp 实现IEEE 1588 和IEEE 802.1AS-1 的PTP 协议。在TSN 中通过802.1AS 完成同步,它是IEEE1588 的一部分,并且做了某些扩展,例如在Wifi 中的时间同步。TNS 目前计划实现IEEE802.1AS-2020.它在主流Linux 上还没有实现。值得一提的是,并非所有的以太网硬件接口都支持IEEE1588。有的设备上linuxptp 是软件实现的。精度大打折扣。
VLAN 的配置
TSN基于IEEE 802.1Q[7]的虚拟局域网(virtual local area network,VLAN)和优先级标准。
VLAN 帧结构
TSN有一个服务等级(class of service,CoS)的概念。对TSN网络而言,不同优先级的服务对应PRI码。3位PCP码定义了0(最低)~7(最高)这8个优先级 。
TSN域和非TSN域的区别在于VLAN ID,即,进入TSN网络会被交换机给打上VLAN标签,然后借助于TSN机制在该网络中传输,但离开了TSN网络的时候,这个VLAN标签会被去除,它也可以变为一个标准以太网帧被传输。
显然,TSN需要使用Linux 添加VALN。
时间敏感网络的机制
TSN 的实时能力是通过各种整形和调度(shapers and schedulers)完成。
时间敏感整形是一种控制在网络数据路径中的每个跃点发送哪些数据包的方法。时间敏感整形器 (TAS) 通过将时间分解为用户指定长度的周期来实现此目的。然后,这些周期进一步细分为每个周期内用户指定的时间片数。
其中每个时间片都有一个用户指定的持续时间。在每个时间片期间,用户通过指定与每个队列对应的哪些门(可能单个或多个门)“打开”或“关闭”来配置可以传输的流量优先级/队列,如图 2 所示:
使用此机制,可以在非常特定的确定性时间发送时间关键型流量,而不会中断,否则可能会由其他流量的拥塞引起,因为计划列表可用于保证传输窗口。此外,可以在网络中的每个传输节点上配置和同步 TAS。鉴于数据路径上的所有节点都是时间同步的(使用 gPTP (802.1AS) 完成),它们可以被协调,并且可以授予特定数据包一个保留的时间范围,以在整个网络中不受阻碍地传播。因此,用户可以非常精细地控制发送哪些数据以及何时发送。
在Linux 中配置整形和调度算法
Linux 的应用程序通过socket 接口实现通信。网络协议栈处理数据包。网络协议有TCP/IP,UDP、IP和原始的以太网数据包和硬件控制。网络栈通过调度,类和过滤器等来配置。这些机制已经建立了许多年。由于TSN 是以太网的扩展,因此,TSN 的Linux 实现仍然使用这些机制。TSN直接将它集成到Linux 网络栈中,基本原理如下图所示:
Linux内核控制网络硬件的访问,保证数据包在正确的时间发送。这就是时间隙管理组件(Time Slot Management component)。然而内核需要正确的配置。由于需求来自于应用程序, 协议栈通过Qdiscs配置。
Qdisc 对应一个数据包调度器,作为TSN 实现的一部分,各种Qdiscs 开发了出来,并且集成到主流Linux内核中。
使用Linux 原有的tc 命令来设置Qdiscs。
tc 命令
Linux操作系统中的流量控制器TC(Traffic Control)在2001 年被导入,用于Linux内核的流量控制,主要是通过在输出端口处建立一个队列来实现流量控制。
数据包调度
TSN 开发了几种数据包调度算法
- MQPRIO
MQPRIO qdisc 是一个简单的队列规则,可以通过优先级以及优先级对应的流量等级,将不同流量映射到硬件队列的区间。连续的流量等级可以1对1的映射到硬件的队列上。
- ETF (Earliest TxTime First)
ETF会在发送时间(txtime)到达之前的一段时间(delta) 缓存数据包,这个时间可以由delta选项控制。
- ETS
ETS基于预先设定的周期性门控制列表,动态地为出口队列提供开/关控制的机制。ETS定义了一个时间窗口,是一个时间触发型网络(Time-trigged)。这个窗口在这个机制中是被预先确定的。这个门控制列表被周期性的扫描,并按预先定义的次序为不同的队列开放传输端口。
在Linux 中 ETS 被称为Time Aware Priority Shaper (TAPRIO)。
流量整形(traffic shaping)
shaper翻译为汉语的的意思是整形器, 整形的目的是为了让数据包发送的更规律,不至于短时间发送很多,然后很长时间不发送。同时可以根据需要限定带宽。
内核 version 4.15 实现了 Credit Based Shaper(CBS),以Qdisc 的形式设置:
结束语
本文介绍了在标准的Linux OS 中,配置时间敏感网络的方法。进一步的实验在后续的博文中介绍。