赞
踩
报文编码 | 基于目的IP地址的最长匹配做查询 |
软件结构 | 在软件算法上优化,使用Tree查找和Cache优化 |
硬件结构 | 大量基于MIPS指令集的CPU进行软件转发,后期逐渐出现了基于总线的分布式转发架构,例如Cisco的7500系列路由器 |
报文编码 | MPLS简化核心路由表条目数 |
软件结构 | 软件结构相对稳定没有太大变化 |
硬件结构 | 专用处理器繁荣的十年,各种专用芯片来做Offload,加密芯片,TCAM查表,各种基于微码的网络处理器,Fabric逐渐采用CLOS架构构建多机集群. |
报文编码 | VXLAN和Overlay的兴起 |
软件结构 | 软件转发的回归,DPDK/VPP等开源软件的出现 |
硬件结构 | 多核通用处理器性能越来越强,SR-IOV的出现,核心交换芯片越来越强并支持虚拟化 |
报文编码 | SegmentRouting,数据包即指令 |
软件结构 | 容器技术的出现,CNI触发Host Overlay,尽量采用协处理器或者网络设备卸载负担, P4等通用网络编程语言的出现 |
硬件结构 | 可编程交换芯片的出现,各种SmartNIC方案盛行,低延迟通信的需求日益增加,特别是AI带来的快速I/O响应 |
报文编码 | QUIC+SR |
软件结构 | 给更多的终端以后浪般的选择的权力 |
硬件结构 | 智能都在设备上了,网络可以简单一点了 |
一开始的路由器其实是叫服务器的,1986年思科发布的AGS(Advanced Gateway Server). 而Cisco IOS本质上不就是一个软件的操作系统么.
最早的报文处理系统就是软件的,当然密级高的资料我是不会说的,接下来每个资料我都会引用公开的文档以免惹来麻烦,第一本公开文档就是一本老书
1.1 进程交换那个年代也是极力的从软件算法上优化,最早的时候就是进程交换,如下图所示,在操作系统上执行一个转发进程,每个包进来都走这个进程去查询路由表,然后转发:
1.2 快速交换->CEF但是这样是不是太蠢了点,每个报文都要查询一次路由表,随着网络规模的扩大,路由表多了就发现性能有问题了,所以后面出现了所谓的快速交换,也就是增加了一个Cache用于路由查询,也就是我们常说的Fast Switching。后来随着路由表规模进一步加大,然后只能在数据结构上改了, 也就是逐渐出现的基于各种树的查询, 例如Linux Kernel很长一段时间都在使用Radix Tree,而Cisco也是从RadixTree到后期的CEF。
1.3 第一个软件转发时代的总结其实从这个时代来看,网络通信数据量并不是太大,协议也相对复杂,更多的是通过IP协议和其它各种协议互通互联,通信需求来看也基本上是在100Mbps处理能力以内,用软件转发是相对较好的解决方案,这一时代的很多产品都是基于MIPS处理器实现的,所以本质上CPU内部还是执行的标准的MIPS指令集, 而路由器的升级更多的就是CPU的升级,从最早AGS使用的Motorola 68000,到后面开始采用 R4600, R4700,到后期的R5000, 总线结构从最早的私有的Cisco Cbus到后期标准的PCI总线的PA卡,以及CyBus这些东西,本质上结构并没有太多的变化:
当然这种也是集中式的转发架构, 很多人就会自然而然的想到:性能不够那么就换成多个CPU来转发吧,当年Cisco 7500系列的推出便是这样,在所谓的线卡上放置了CPU,然后将转发表下载到线卡上成就了所谓的Distributed-CEF报文编码 | 基于目的IP地址的最长匹配做查询 |
软件结构 | 在软件算法上优化,使用Tree查找和Cache优化 |
硬件结构 | 大量基于MIPS指令集的CPU进行软件转发,后期逐渐出现了基于总线的分布式转发架构,例如Cisco的7500系列路由器 |
对于VOQ的解决方案, 核心部分在"matching Scheduler"上, 如何调度将是一个难题. 其数学模型实质上是一个二分图匹配的问题. (敲黑板:华为任总说的数学很重要)通常调度算法被分为两类, 最大匹配(maximum size matching, MSM)是指边数达到最大,而最大权重匹配(maximum weight matching, MWM)是指边的权重之和达到最大.由于这两种算法具有复杂度高、硬件实现复杂等缺点, 在实际应用中, 我们一般用极大匹配(maximal matching)近似最大匹配. 所谓的极大匹配是指在当前已完成的匹配下, 无法再通过增加未完成匹配的边的方式来增加匹配的边数或权重.
这也就是日后那个引领SDN的Nick教授搞的事情:Cisco GSR 12000上实现了基于VOQ+iSLIP调度的算法. 如下左图所示: 在使用共享总线的架构中, 仅有最大吞吐量的25%, 使用不带VOQ的FIFO队列时, 吞吐量为最大值的58.6%. 而如果使用变长报文而不使用Cell模式转发, 则吞吐量大约为最大值的60%. 使用VOQ+iSLIP的方式后, 吞吐量为100%, 非常接近理论的最大值. VOQ这种技术在日后Nexus7000,ASR9000上继续使用着... 当然还有一种技术是华为使用的CIOQ,这个技术来自于Avici,至于Avici的TSR和华为的NE5000是什么关系以及日后的什么什么,自己感兴趣去搜吧。对于CIOQ的调度, 通常采用的是基于稳定婚姻问题(Stable marriage Problem)的算法. 稳定婚姻问题也是一种二分图的匹配。 2.1.3 CLOS架构 随着技术的发展,问题又来了,1Tbit以下的交换结构, 一般采用多个并行交换的Crossbar 构成, 可称为多平面单路径的交换结构, 每个Crossbar完成几十Gbit/s到上百Gbit/s的交换. 但是, 基于Crossbar的交换结构存在扩展性差的问题:一方面, 实现很大的Crossbar有一定困难, 主要受芯片的管脚和IC实现复杂度的限制(其复杂度以O(N^2 )增长); 另一方面, Crossbar 采用集中调度的仲裁器, 调度算法的复杂度也高于O(N^2 ). 当端口速率增大到10Gbit以上, 端口数增加到10以上时, 仲裁器难于在一个信元时隙完成仲裁, 其处理速度极大地限制了系统容量的提升. 新的做法便是使用多级交换架构来替代原有的基于单级架构的crossbar技术. 多级交换结构的基本组成单位叫交换单元, 每个交换单元具有输入和输出功能. 各个交换单元通过一定的逻辑顺序相互连接, 形成一个巨大的、可扩展的交换网络. 多级交换结构的形式有很多种, 包括Clos、Banyan、Butterfly和Benes等, 各种交换结构的不同主要在于交换单元的互联方式. 例如Cisco的CRS-1则采用了BENES架构: 这样多个芯片构成的交换网可以作为并行作为多个fabric连接到线卡上,也可以做成路由器集群构建专门的Fabric机框。 基于Benes网络的转发平面非常容易扩展从而支持路由器集群技术. Cisco使用新的Fabric Card机箱(FCC)和原有的LineCard机箱(LCC)的方式构建Multichasis的集群技术. 最多支持8xFCC+72xLCC的方式群集. 从而使得转发容量从原有的1.25T上升为92T. 但为什么标题是CLOS呢, 因为这段时间Huawei NE5000E和Juniper T-Series采用的是CLOS架构,后期很多交换机厂商没有12.8T的单芯片交换也用这种方式堆,本质上是一样的。 最近一些年的某些厂商的实践也类似: 例如为了提供128x100GE接口能力,如果采用3.2T芯片,需要4(Spine)+8(Leaf)共12颗芯片的 架构,本质上其实都在玩十多年前的老东西,没啥创新。 详细的专著可以看下面这本书:2.2 硬件转发之Linecard
Fabric设计是相对简单的,困难的还是在线卡上,一方面是路由表的容量越来越大,另一方面是对功能的需求越来越多了。 线卡结构的发展历程参考Cisco可以清晰地看到, 从最早的路由器全部使用核心CPU转发. 到后来在总线上使用控制器调度. 再到后期Cisco 7500上使用VIP接口卡, 实现分布式的CPU处理; 然后在基于Crossbar的平台上使用ASIC进行处理. 例如7600上OSM线卡和Cisco 10000系列所使用的PXF. 到最后在线卡上使用网络处理器(NP), 例如Cisco的SPA/SIP架构. 后期例如在CRS-1使用的SPP处理器以及使用全新QuantumFlow网络处理器构建的ASR1000边缘路由器平台等. 其实那些年有很多的争论也有很多的实现,真是百花齐放的年代: 注:GPP表示General Purpose Proccesor, ASIP表示Application Specific Instruction Processor 2.2.1 不得不说的ASIC:TCAM传统的表项查找方法都是基于SRAM的软件查找方法,共同特点是查找速度慢。线型查找法需要遍历表中的所有表项;二叉树查找法需要遍历树中大多数节点,而且查找速度受树的深度影响较大;基于硬件的TCAM查找法正是在这种背景下提出的,用此方法进行查找时,整个表项空间的所有数据在同一时刻被查询,查找速度不受表项空间数据大小影响。TCAM为啥叫Ternary Content呢,其实就是每个bit位有三种状态, 0,1,Don't care,这样不就很容易去做一些匹配了么,特别是路由器那样的Longest Match
一般来说的做法如下,通过TCAM查询然后获取Index,然后再到内存里面把index对应的信息返回给路由器。
基本上那个年代所有的网络设备都采用这个方式查表,ACL匹配等功能也在这上面实现,直到现在也有很多厂商还在这么做,例如华为的NE40系列以及大量的交换机产品。 2.2.2 固定流水线的ASIP 当我们开始对线卡处理器进行加速时,最先想到的便是将一些固定的功能Offload到硬件上批量执行,Cisco PXF(Parralled eXpress Forwarding)也就是在那个特定的年代诞生的, 所以那个年代非常成功的7200系列路由器便是基于这个架构实现的,也使得IOS第一次用上了类多核的转发。只可惜这个处理器不算是真正的处理器,还需要很多微码编程。 本质是是不是觉得和现在的P4ASIC类似了啊,其实就是一长串的流水线和内存构成的一个ASIC,第一级做A功能,第二级做B功能,一次性并发处理多个报文(后面开源的VPP架构其实也类似于这个东西)。 有个教授写了一段话,原文摘录,: “The PXF consists of a pair of ICs, each comprised of 16 processors arranged in 4 pipelines. When used together, the pair of PXFs results in a 4x8 systolic array. Each of the 32 processors is a 2-issue VLIW with special instructions for packet processing. Each processor has an independent memory and each column of processors has access to its own separate memory (off-chip). Each of the 8 stages in the pipeline is responsible for a different packet forwarding function. ” 文章来源 《Understanding Network Processors,Niraj Shah》更多的东西就不多透露了也不是本文的重点 2.2.2 RTC的网络处理器(SPP/QFP) 固定流水线的网络处理器会面临一些问题, Feature的使用并不是那么的均衡的,可能有些资源放在那里,功能没用上,但是还是要走,而且可能还会存在某些功能用的多,资源不够的状况, 另外一方面随着那个年代MPLS VPN的兴起,路由表容量的需求也越来越大, 另外针对不同功能例如BRAS/DSLAM/Cable接入也推出了大量的硬件平台,使得研发难以维护,微码编程也逐渐的无法满足丰富的市场需求,在这个年代发生的一些事情,不得不提Will Eatherton,最开始有一篇论文,然后通过这样的方法避免了IP路由查询受限于TCAM, Will设计了思科的SPP和QFP,然后又去Juniper 设计了Trio系列处理器。但是2019年一次测试碰到华X的NXXX,还在用TCAM,而且似乎还丝毫没有意识到路由表容量大有那么多好处,同时也可把TCAM的资源节省出来给ACL用。 FP的设计都是采用Run-To-Compile(RTC)的结构,即即便功能再多,一个处理器处理完一个包的所有功能, 然后编程上以C代码为主,内存操作也非常灵活: 它从逻辑上很好的把功能抽象分离了, 一部分是On-Chip Memory用于等待调度到网络处理器PPE中,PPE是一个多核心的专用指令集的处理器(Tensillica的一个精简指令集),这也是我需要强调的,提高性能的方法也可以把通用CPU的指令集精简获得,同时针对网络处理,内存访问的位宽并不一定需要64bit或者32bit,所以很多时候用8bit 16bit的内存访问可以获得很好的加速,然后针对加密和ACL查询采用了片外的TCAM和加密协处理器,QoS这些采用了专用的TM芯片,而路由表查询就是采用了前文所述的Tree Bitmap的算法直接使用DRAM来处理。 这样的做法在软件编程上就有足够的弹性了,想加什么功能加什么功能,后期基本上一台设备单挑了一堆盒子,成为名副其实的瑞士军刀: 它的IOS XE软件架构也成为后期企业网软件的拳头产品,如今单芯片单系统肩负了所有企业网路由/交换/无线的功能。但是这里要强调的只是它的多芯片融合的设计方案和RTC的解决方案,类似的解决方案还有Juniper MX/SRX系列使用的Trio,从最早的查表引擎LU/XL,到转发引擎MQ/XM,QoS的TM使用的XQ/QX,到接口上使用的IX/XF芯片,至于后面的Trio3D和Penta ASIC,后面会讲, 其它我就不多说了,说多了危险啊~~商用的可以看到的书就是下面这本,读读也行。 2.2.3 商用多核网络处理器(RMI/Cavium/Tilera) 思科QFP的使得大量的厂商开始尝试构建商用的多核处理器,在这段时间里有RMI 和Cavium各个厂商提供,基本上都是以MIPS多核为主的架构,本质上还是片上网络的发展,但是它们为了更加通用的编程能力,采用的多是标准的MIPS核心,同时在上面辅助一些特殊的与网络相关的加速协处理器。 2.2.4 Cache 一致性与FBD 这些芯片极大的丰富了中低端的市场,但是多核调度又变成了一个难题, 如何将数据包调度到不同的核, 也就是说多核处理器的平台如何进行负载均分, 思科的做法是Cache非一致性的,然后反正内存带宽大,要干嘛自己去查,然后一个锁锁住flow,不让同一个flow的其它包更新。而另一种做法就是Flow Based Distribution, 例如华X的SXXX,采用首包查好,然后建立好流表,然后根据流表分配到不同的核上处理的方式, 但在一些特殊的测试中, 很容易两个elephant flow hash到一个核上面去导致丢包,甚至在源目的IP地址各一个并采用随机端口发送流时,性能下降到几百兆,完全无法使用。 2.2.5 商用网络处理器(Ezchip NP5c) 当你以为各种方案都很完美的时候,总会出现一些意想不到的方案出来,并且成功了, 这就是基于EzChip NP系列的ASR9000. 在网络这一行,各种Trade Off才是真正的艺术,CRS-1和ASR1000虽然有SPP和QFP,但输在了一个字上:“贵” ,在那些年互联网宽带业务快速发展和城域以太网快速兴起以及MPLS快速普及的年代,给了运营商边缘路由器很大的发展空间, 很多高速Fabric交换芯片的面世也使得CRS那种多级交换架构显得过于昂贵,而ASR1000也一直没有把QFP做成分布式的架构,这个时候借助NP4和NP5的ASR9000获得了极大的成功,原因就是在运营商边界和大型企业网核心/DCI的位置, 软件特性需求相对简单, 业务场景适合并行的向量化的包处理,具体EzChip的东西我就不多说了,放本它家的书自己看看吧:挑出两三页挺重要的贴个图就好,意会一下,详细的宝宝不说~~
其实那些年设计路由器都有很多很独到的计算和调度算法以及严格的数学证明和计算, 现在好像变得很随意了,纪念一下那个年代SDN它爹的胶片,紧接着他将登上那个闪耀的舞台。 2.3 总结 这真是一个百花齐放的年代,伴随着软件算法遇到瓶颈, 一方面各个厂商从协议上采用MPLS标签来降低查表的复杂度,另一方面则是 大量的ASIC和网络处理器的出现,在指令集上针对网络处理进行精简指令集,使用TCAM加速查询,使用Tree Bitmap+DRAM和TCAM解决方案容量上和速度上做取舍, 多核心处理器和片上网络架构在网络处理器中逐渐出现,这也为以后商用处理器出现多核心架构打下了基础。 这一章讲了这么多,给大家灌输的观念只有一个,在软件出现瓶颈后,可以通过硬件和报文编码的方式解决, 这个故事过十年又会再重演一次。1995~2010 由软向硬的过渡
报文编码 | MPLS简化核心路由表条目数 |
软件结构 | 软件结构相对稳定没有太大变化 |
硬件结构 | 专用处理器繁荣的十年,各种专用芯片来做Offload,加密芯片,TCAM查表,各种基于微码的网络处理器,Fabric逐渐采用CLOS架构构建多机集群. |
3. 软件定义的网络
分分合合,合合分分,谁都没想到随着虚拟化的兴起,虚拟机内互相通信的网络成为网络设备再一次软件化的开端,当然开始的时候只有交换机, 于此同时为了大量的虚拟交换机编程和转发方便,openflow和openvswtich诞生了,然后公有云和私有云的部署使得网络设备进一步虚拟化,虚拟云路由器也随之诞生, 后面伴随着VDC/VPC的发展,更多的设备虚拟化了: 3.1 SR-IOV 软件虚拟化带来的一个问题就是大量的设备通信该怎么弄,于是有了PCI-E SR-IOV实现:经过演化,最后形成了如下的标准架构:
System Image(SI)主要指的客户机,也就是虚拟机的OS, Virtual Intermediary(VI)主要是虚拟机的管理层,SR-PCIM配置和管理SR-IOV功能和PF/VF,PF是PCIE的物理功能,每个PF都可以被物理主机发现管理,而VF是每个PF虚拟出来的。传统虚拟化系统中大量的资源和时间损耗在Hypervisor(或者VMM)软件层面,PCIe设备的性能优势因此无法彻底发挥。而SR-IOV的价值在于消除这一软件瓶颈,助力多个虚拟机实现物理资源共享。 3.2 DPDK 在由硬到软的过程中,传统的Linux转发遇到了瓶颈:数据包到达网卡设备。
网卡设备依据配置进行DMA操作。
网卡发送中断,唤醒处理器。
驱动软件填充读写缓冲区数据结构。
数据报文达到内核协议栈,进行高层处理。
如果最终应用在用户态,数据从内核搬移到用户态。
如果最终应用在内核态,在内核继续进行。
具体去看一本书撸一圈代码都会了:
3.3 VPP 本质上就是对报文编程一个向量,然后批量处理,同时它定义了灵活的转发链状结构,可以很容易的在转发链条上添加新的软件特性: 3.4 总结 在这个年代,报文编码的发展主要是为了解决虚拟化的问题,基于VXLAN和LISP的overlay技术逐渐兴起,并且随着虚拟化的进程,大量的网络设备被要求在X86的虚拟化平台下运行,虚拟路由器交换机防火墙逐渐出现。当然这个年代为了优化虚拟机的性能出现了DPDK/VPP等开源的软件库,伴随着BGP-EVPN和Yang/netconf等技术的控制器的兴起,SDN逐渐落地,一些专门的虚拟化交换机厂商出现,但似乎最终都没能过上好日子。倒是那些卖交换机的过的日子蛮舒服的, 硬件技术上在这个年代其实就是Serdes的加强,然后大家在Chip上堆料,MAC上定义到100G,似乎整个行业进入了一个简单粗暴的发展过程。 2010~2015 由硬到软:软件定义时代报文编码 | VXLAN和Overlay的兴起 |
软件结构 | 软件转发的回归,DPDK/VPP等开源软件的出现 |
硬件结构 | 多核通用处理器性能越来越强,SR-IOV的出现,核心交换芯片越来越强并支持虚拟化 |
报文编码 | SegmentRouting,数据包即指令 |
软件结构 | 容器技术的出现,CNI触发Host Overlay,尽量采用协处理器或者网络设备卸载负担, P4等通用网络编程语言的出现 |
硬件结构 | 可编程交换芯片的出现,各种SmartNIC方案盛行,低延迟通信的需求日益增加,特别是AI带来的快速I/O响应 |
丢包的统计如下图:
所以到了2020年了,每个老司机开车都有选择道路的权力了,而我们是否应该赋予我们手机选路的权利呢? 那么和SR的结合也就成了一个非常不错的选择了: 也就是我们常说的,安全,可靠,可控, 其实对QUIC协议的扩展也非常简单,加一个带SRH的明文的quic-packet放在UDP payload里面就好: 后浪就真的拥有可选择的能力了: 由于它还是一个L4的传输层协议,有CONNECTION-ID维持连接特征, IP头随便改啦,V4/V6 MPLS随便穿越,把对应的下一跳信息放在uSID和一个KVmapping表里就好了 其实还有一个问题就是,过去的十年,我们用了太多的Overlay了,既然QUIC已经和IP地址无关的传输了,那么为什么不借机把Overlay干掉呢?都2020年了,你还IPsecVPN拨到VPC么? 服务器端支持也变得容易了,反正有sidecar改QUIC-SR 其实连数据中内部的ROCE都可以改成这个,毕竟能让SmartNIC选择Spine switch也是一件好事啊: 5G和WIFI的融合也会更加平滑可控:做安全,微分段也可以给你加字段啊:
这就是一个前浪过去10多年的从业经验和见到的盛世繁华,以及给后浪的选择的权力。
2020~未来 :NewIP:后浪:给更多的终端可以智能选择的权力报文编码 | QUIC+SR |
软件结构 | 给更多的终端以后浪般的选择的权力 |
硬件结构 | 智能都在设备上了,网络可以简单一点了 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。