来源:TSNLAB 微信公众号
TSN近期技术系列文章第二篇,回顾下最基础的CQF(Cyclic Queuing and Forwarding,周期排队转发),再讲讲从CQF发展出来的各个变种。
本文目录:
•一、什么是CQF
•二、CQF的效果
•三、CQF的扩展
一些名词(CQF家族好壮大呀):
•BCQF: Bin CQF
•cCQF: Count-based CQF
•ECQF: Enhancements to CQF (P802.1Qdv项目的标题)
•tCQF: Time-based CQF
•TCQF: Tagged CQF
•xCQF: 作者起的名字,泛指以上所有
一、什么是CQF
虽然这是新技术系列,而CQF相关的标准大约在7年前就全部完成了,按理说不需再讲。但为了对本文后续章节理解上尽可能保持准确,还是要重新夯实基础。读者们也可以“自检”一下自己对于CQF的理解。
“CQF就是Qch”,“CQF就是Qci+Qbv”。这两种说法都OK。不过从本文开始,我们将停止“用标准项目编号来指代技术”的做法。一来,这些IEEE 802.1标准项目完结后,新产生的文稿内容最终会合入大文档,如Qch、Qci、Qbv的内容都会合入802.1Q,而只有技术名称具有最显著的标识特性,例如你完全不需要去记802.1Qbb是啥、802.1Q的第36章是啥,你知道PFC(Priority-based Flow Control)这个技术就可以了。其次,一个标准项目可能会有不止一个目标,例如在TSN圈还算比较有名的“Qcc”,这个项目的主要目的是对SRP流预留协议做补充,同时定义了TSN配置模型,但如果说一个设备支持TSN配置就叫支持Qcc能力,显然就会很有歧义。而且,最近快要完结发布的P802.1Qdj项目,对TSN配置模型所在的802.1Q文档第46章会做出很多修改,那以前所谓的“支持Qcc”,还能继续这么说么,或者改成“支持Qdj”,不论怎样都不合理。
按标准的一致性定义,如一个网桥宣称支持CQF,则需要按IEEE 802.1Q中的相关定义,支持Enhancements for scheduled traffic(也就是我们常说的门控调度)和PSFP(逐流过滤与策略)。即CQF是基于门控调度和逐流过滤与策略的能力实现的一种周期排队转发的方案。同时,在802.1Q的附录T中,给出了CQF的部署案例:通过逐流过滤与策略,将报文按时间基准导入一组出口队列中的一个,之后门控调度使用相同的周期时间、保障该报文可以被发送。
具体举例如下,图中第一个长方形是PSFP中流过滤(Stream Filter)的能力,基于流识别的ID和优先级3,把流分配到ID为1的流门。第二个长方形就是PSFP中流门(Stream Gate,注意这个和门控调度的gate不是一个),右侧是流门1的门控列表配置:在T00时隙,门开,配置IPV(内部优先级值)为7;在T01时隙,门开,配置IPV为6。这意味着,在T00时隙内抵达流门1的报文,因为门开,可以正常通过,因为被分配了IPV为7,则后续会进入相应的出口队列7;而在T01时隙内抵达流门1的报文,后续会进入出口队列6。(注:如果门关,则报文被丢弃,所以流门在PSFP中也可以起到类似CAR“发红牌”的流量监管作用)

相应地,下图门控调度的门控列表的配置中,也是T00和T01两个时隙。可以看到,队列7和6在这两个时隙的状态分别是关、开,开、关。

由于流门的门控列表和门控调度的门控列表使用了相同的周期(包括周期的基准Basetime和周期的长度CycleTime),也就意味着,T00时隙内抵达的报文,会被放到出口队列7,并且在T01时隙内允许被调度出队,而T01时隙内抵达的报文,会被放到出口队列6,并且在T00时隙内允许被调度出队。形成了“你进我出,你出我进”的循环,这也是为什么这种方案被称为周期排队转发了。
以上是最基础的一种、两个队列“乒乓”的CQF实施案例。那么可不可以实现更多队列的循环轮转?不同队列的轮转时间可不可以不相同,而是成倍数关系?当然可以,并且还沿用上述案例类似的方式就可以实现。有兴趣的读者可以自己尝试。
二、CQF的效果
端到端如何使用CQF?最基本的方法,就是在端到端时间同步的基础上,每一跳都做类似的配置。在第一跳,保证在时隙0之内抵达的报文,都在时隙1之内发出,并且留足够的安全量(即时隙后段留一段时间不允许再发包)以保障在时隙1之内这些报文都抵达第二跳,那么第二跳设备就可以在时隙2之内发出这些报文。以此类推,端到端的时延就在2NT这个范围(N是跳数,T是时隙长度)。
由此我们看出,CQF的核心优势有两个:1是大大简化了传统门控编排编排的难度,不需要逐流编排,只需要保证进入每个周期时隙的报文不超过这个时隙的容量;2是端到端的时延容易计算,基本和跳数、时隙长度成正比(因具体实施方案的差异可能略有不同)。而CQF的代价就是牺牲了低时延,即大部分报文原本可以更快被转发,而在CQF机制下,必须等到下一个自己的时隙。同时,CQF还有一个额外的效果,就是端到端的时延抖动比较低。
三、CQF的扩展
其实CQF的本质,在于周期时隙之间的映射,包括一个网络设备内从入口(流门)到出口(门控调度)的映射,也包括从上一跳网络设备的出口到下一跳网络设备的入口的映射。而由于每个时隙可以承载一些报文,所以一个时隙更像是一个车厢、一个容器。在P802.1Qdv项目中,正在讨论新增一种传输选择算法(和CBS、ATS等并列),暂定名称为BCQF(Bin Cyclic Queuing and Forwarding),其中又具体包含tCQF和cCQF两种分配Bin的方式。
第一章所讲的CQF案例,属于基于时间的CQF(tCQF,Time-based CQF)。因为端到端时间同步,一个设备内也容易获取相同的时间基准,因此端到端所有设备的入口、出口都有相同的时间基准。在流门给报文分别的IPV,就是指示报文进入相应bin的号码。其实CQF的核心问题,就是对于一个入报文,如何决定把它分配到哪个缓存或者说出队列。这一问题包括两个方面:其一,该缓存对应的转发资源是否充足,即在该缓存作为出队列的时候是否能够在指定时隙内清空队列;其二,某一个报文预期是在哪个时隙被发出。对于网络设备而言,能确认不同时隙的边界就可以。例如,仅仅在频率同步(而非时间同步)的基础上,相邻网络设备只要能计算出周期的相位偏差,即可确认时隙的对应关系,如下图。参考阅读:https://mentor.ieee.org/802.1/dcn/21/1-21-0056-00-ICne-input-synchronization-for-cyclic-queueing-and-for

除了通过时间同步或者频率同步配合计算相位差的方法,还可以通过发送Beacon信标来标识bin的边界,或者还可以通过在报文头中添加标识字段Tagging来区分报文归属于不同的bin。例如TCQF,相关信息可参考IETF Detnet工作组的个人文稿:https://datatracker.ietf.org/doc/draft-eckert-detnet-tcqf/,这一tag逐跳随着MPLS标签交换进行替换;另一篇DetNet文稿CSQF: https://datatracker.ietf.org/doc/html/draft-chen-detnet-sr-based-bounded-latency-01,将时隙信息带在SR(SegmentRouting)标签中,在使用SR标签指定路径的同时,也可以指定在路径上的每一个节点出端口的转发时隙。
根据计数实现CQF,即cCQF(Count-based CQF)。Paternoster是一种案例,具体可参考:http://www.ieee802.org/1/files/public/docs2019/cr-seaman-paternoster-policing-scheduling-0519-v04.pdf
除了bin的设置和边界映射的区分,xCQF还有太多可以展开的研究课题。例如通过同时运行多种长度不同的bin,使得网络在支持对更大范围的具有不同带宽和时延需求的流量进行调度的同时,尽可能提高缓存利用效率;通过组合逐流门控调度,在总体上降低逐流状态机数量(降低编排难度)的同时也能保障少数具有极严苛时延要求的流量;还有相关参数的配置优化等等。结合第二章所述的xCQF类方案的效果——简化编排难度,保障易计算的时延上界,同时一定程度上牺牲了网络轻载时原本能达到的低时延效果——来看,xCQF为大规模网络的时延确定性提供了一种可行的方案,让我们共同期待它的进展。
--------------------------------
特别鸣谢:很荣幸邀请到参与IETF Detnet相关研究8年的资深专家耿雪松共同参与本文的撰写与修订。