查看原文
其他

凡是过往,皆为序章: 源路由路径感知转发

zartbot.Net zartbot 2021-10-06

(以下内容已经申请专利,抄作业不好,当然.....)

在云服务提供商的数据中心或者广域网中,很多云服务提供商在尝试着引入SRv6,当然另一方面是数据中心P4交换机弄出来的INT场景,例如阿里的HPCC。但是两种技术是否能够有机的整合呢,这就是本文要给出的一个答案。
首先我们来看SRv6这一类的源路由,相对于MPLS的SR,SRv6把过往的SID都存放在SegmentList中,采用SegmentLeft作为一个指针来指定活动的标签。

而对于P4 INT来说,则是通过在报文中插入Header的方式来获取随路遥测信息:

同时还有一些借助INT进行快速拥塞控制的算法,例如阿里的HPCC:


1. 原理概述
我们来看一个事实,当转发SRv6、SRoU时,用过的SID并不会像MPLS那样弹出,而且当转发的时候,标签指针正好拷贝完SID到目的地址后留在这个标签末尾,如下图所示:

例如当R3(2001::3)收到报文后,查询SL字段,然后将SegmentList[1] 2001::4拷贝到目的地之后,指针正好停在SegmentList[1] [2]之间的位置,这个时候顺势可以将INT相关的信息写入。这128bit可以采用如下多种方式编码,例如最简单的64bit进入时间戳和64bit离开时间戳,但是这样的做法可能不太有效,那么我们可以采用32bit的时间戳配合其它字段的方式。
<Router-ID(32bit),IngressTimestamp(32bit),EgressTS(32bit),egressPortID(16bit),queueID(8bit),congestionLevel(8bit)>
从编码上来看,这些字段几乎都来自于INT,但实际上我们仔细想想,链路传输延迟通常是固定的,特别是在高性能数据中心内部,当通过SR规定了链路后,影响延迟的只有队列深度,因此很多时间戳根本就不需要,而头端SR也明确知道中间重写SegmentList的原始值对应的路由器,因此RouterID也不需要,而针对于出接口和队列ID可能需要,也可能不需要,因为最终都要绕开拥塞路径的,而对于队列深度,通常可能2个bit就能表示一个拥塞程度落在四分位哪个区间(0:0~25%, 1:25%~50%,2:50%~75%,3:75%~100%),如果更细致一点4bit就够了。那么<portid(8bit),queueid(4bit),congestionid(4bit)>应该完全够用了,所以针对Ruta这样的SRoU封装,则可以在IPv4 UDP网络中局部修改SID中的port位就可以满足拥塞通告了。

2. ECN拥塞控制

例如阿里云需要SRv6和HPCC落地,这个场景就是一个不错的选择,既实施了SRv6又把HPCC的能力加入,而且不光是在两端的智能网卡上实施,中间的交换机也做了很好的协同。

由于每一跳转发的时候可以清楚的看到每个中继交换机(PSW/DSW/PSW)所经历队列深度和拥塞程度,那么对于收端可以很好的根据这个结果ECN通知发端是降速或者重路由。例如收到的队列拥塞程度全部为0-0-0,可以采用MI乘性增加的方式,2-2-2以上则采用AI加性增加,而任何一跳出现3时,采用MD的方式,最终有了一个AIMD和MIMD混合的方案,策略逻辑也非常简单,当出现多跳拥塞时重路由就可以实施了,当然针对MPTCP可能还需要一些魔改,所以另一个选择是采用SRoU with QUIC鹅厂要不这么干干?)。


3.主动测量

这种方案整合了SR和INT,事实上使得路径控制(Path Enforcement) 和路径遥测(Path Telemetry)可以完全的随路同步,因此各个TOR交换机就可以用非常小的代价来测量全网的性能并生成链路状态拓扑。这也是SRoU随路测量和链路状态随路通告功能的一部分,因为在传递的过程中,中间路由器或者交换机也能很好的感知链路上游的拥塞状态。我们会在下一版的RFC draft中添加上。


4.中断回报

对于源路由可能比较担心的一个问题是路由黑洞,我们可以在报文因策略丢弃(Queue满了Taildrop,No Route, ACL Drop)时,反向传播到上游传播Drop Notification。


4.和以往实现的不同

看上去非常简单的整合了SR和INT,具体又有什么不同呢?传统的MPLS Performance Measurement,由于MPLS标签需要弹出,无法maintain路径信息而需要额外的字段来进行处理。当转发SRv6时,用过的SID并不会像MPLS那样弹出,但是似乎还是采用做加法的方式增加新的TLV,而INT本身就是做加法加Header的方式。实际上造成了测量值和转发实际值的细微的不一致(包size变化和处理时间的问题)。

本文所述的方法复用了处理完的SID,不影响下游转发,同时又增加了INT的功能,正好操作指针在完成Dst IP更新后,停留在需要overwrite的SID前,操作相对简单,进queue前本来就要读取queue depth来决定是否要taildrop,顺势把它更新到接下来的一些字段中就好了。



所以本文才有:“凡是过往(被处理完的SID),皆为序章(更新的INT)”,今日技术扶贫结束。


有高网和想做SRv6、HPCC的某云,啥都没有又想做高网的另一个动物云,还有凡事必谈IPv6+的某司,学习去吧:)






: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存