昨天给大家拆解了ASR 9K的NP实现,那么,当数据包进入ASR99路由器的时候,它会经历一个什么样的生命旅程呢?
请看下图。
图中,入方向PHY可以处理MACSEC、Retimer等简单操作。在NP中查找二层/三层转发表项,执行ACL/QoS/PBR策略。
特别地,端口聚合和ECMP涉及到等价多出口,需要按优化过的Hash算法,将数据包尽量均匀地分担到多条流上。
数据包经过了线卡的Switch Fabric或背板Switch Fabric,就到达了出方向。出方向的FIA和入方向的FIA会配合完成VoQ的信用控制。
如图,FIA芯片在向Switch Fabric芯片发送数据之前,需要先进行请求。得到Switch Fabric仲裁批准后,上游FIA向下游FIA发送数据并消耗相应的信用值(credit)。在下游处理完毕后将返还Credit。
那么,FIA是通过什么样的策略进行负载分担的呢?
实际上,FIA是通过类似Round-Robin的方式进行负载分担的。
如图,在FIA连接多个Fabric ASIC的情况下,FIA会向所有的Fabric仲裁单元发起请求,并向最先响应的Fabric发送数据包。
FIA在发送数据包的时候,利用类似BCM的HiGig的方式,在包头插入metadata,其中就包括数据包的序号。在下游FIA中依据序号进行重新排序,以避免数据包并行处理造成的乱序。
而组播的发送方式则不然。
如上图所示,组播的负载分担是基于(S,G)组的,每个(S,G)组只会分流到一个Fabric ASIC上。这是为了保证每条组播流的完整性。(为什么?)由于组播的转发不涉及到一条流走多个Switch Fabric,也无需向交换网仲裁单元发送请求。
让我们再次回到第一个图:
我们看到,从同一个NP芯片进出的数据包,也需要绕行线卡的Switch Fabric和背板的Switch Fabric,回到NP处理完毕。这是为什么呢?
其实这个问题非常简单。
如果同一个NP进出的数据包,仅在NP内部处理,那么,就没有办法实现基于信用的VoQ流控机制,当NP上接口A、接口B同时对接口C打流,并造成接口C拥塞时,接口A/B发送到其他非拥塞接口的数据包,也会按一定比例被丢弃。
因此,无论是NP内部还是跨NP芯片的转发,都需要经过FIA和两级Switch Fabric处理。
当数据包到达出方向NP后,出方向NP进行出方向二层/三层查找、出方向ACL/PBR处理等。
对于三层转发,还需要在邻接表中查找到目的IP对应的二层地址并发送。由于Tomahawk和LightSpeed集成了TM,QoS等功能也在同一颗芯片内完成。
ASR9900的QoS功能非常强大。以一个3级H-QoS配置为例:
L0和L1为端口组和端口。从L2开始,配置流量整形策略;L3工作在三层子接口上(基于VLAN),可配置不同优先级的流量整形,丢弃策略为WRED。
L4可配置基于CBQ的带宽保障/带宽控制/WRED丢弃等策略。
明天,我们将详解ASR9900的分布式控制平面机制,而QoS的详解,我们将在后面的专题中分享。(其实是我还没有研究透彻)
今天的遗留问题:
既然ASR9900有N+1冗余的交换网板,而且同一线卡之间的NP也需要在交换网板上互通,为什么还要在线卡上设计Switch Fabric?
昨天遗留问题的答案:
多个包处理流水线同时处理数据包,有可能造成数据包乱序,数据包乱序的后果是什么?
答案:在TCP流中,如果数据包发生乱序,接收方先收到了后面的数据包,在设定的时间内没有收到前面的数据包的情况下,会触发快速重传(连续回复3个ACK),相应地,发送方拥塞窗口增加,降低发送速度,最终影响传输效率。