基于网络处理器的核心路由器设计技术研究
2008-05-27
作者:何小明,张永福,戴紫彬
摘 要:分析了Intel IXP2400网络处理器" title="网络处理器">网络处理器硬件结构和软件模型,提出了基于网络处理器的高效、可扩展、分层核心路由器体系结构,重点阐述它的系统处理软件模型。
关键词:网络处理器 体系结构微引擎" title="微引擎">微引擎数据处理 路由器 软件开发平台
Internet骨干网络流量的增长及新业务的出现,要求路由器具有线速和智能的处理能力。基于通用处理器GPP(General Purpose Processor)的解决方案虽然灵活,但在数据处理速度上难以满足要求;基于专用集成电路ASIC(Application Specfic Integrated Circuit)的解决方案虽然有效地提高了网络处理速度,却降低了灵活性。它们都难以满足下一代互联网的要求。在这种情况下,一种可编程的网络处理器NP(Network Processor)被应用到路由器设计中,成为一种新兴、有效的统一解决方案。基于网络处理器的路由器具有ASIC高速处理性能和GPP的灵活性, 得到了快速的发展。
1 网络处理器硬件架构
IXP2400网络处理器是Intel公司在2002年推出的第二代互联网交换架构IXA网络处理器[1]。它面向中高端应用,可用于实现OC-48的网络路由交换设备。IXP2400的结构充分体现了片上系统SoC(System on Chip)的思想。IXP2400结构框图如图1所示,它的内部主要包括8个完全可编程的8线程微引擎ME和1个XScale核。此外,还有用于连接外部设备MAC的媒质和交换结构接口MSF单元、连接各种存储器和总线的接口单元等。这些单元通过内部的高速数据总线和控制总线彼此协作。
XScale核是32位的嵌入式精简指令集处理器,时钟频率是600MHz,具有32KB的指令缓存和32KB的数据缓存,它在IXP2400中起控制和管理作用。具体包括:对系统初始化和配置;提供系统时钟;建立并管理路由表;提供一个对应于IXP2400各寄存器、存储器和外部存储器的地址映射表等。它在应用中主要完成加载微码、启动微引擎、完成必要的数据分析、高复杂度的算法、统计、管理等应用任务。
IXP2400中的每个微引擎就是一个32位精简指令集RISC处理器,时钟频率是600MHz,可以由8个并行硬件线程共享。数据包的接收、处理和发送等任务均由微引擎指令存储区中微代码程序的各线程并行执行。网络处理器数据的高速转发正是因为充分利用了硬件的并行性。
IXP2400通过数据线连接着各种存储设备,如SRAM和DRAM等。DRMA主要用于存放需要处理和转发的数据包、路由表等大型数据结构;SRAM主要存放对数据包包头进行处理所需的重要信息和数据包的队列描述等内容,如表、缓冲区描述符。
IXP2400具有丰富的标准高速I/O接口,包括物理链路接口、交换接口、存储器接口、PCI总线接口,能够方便地与其他厂家的设备进行接口、互连;拥有专用硬件加速处理单元;采用专用硬件对特定协议操作进行协处理:如CRC、哈希查找、树查找、字符匹配;针对安全产品,提供加/解密、大数运算等硬件单元。
综上所述,IXP2400拥有网络处理的一般特点,从系统角度看,IXP2400属于一个并行式的多处理器共享总线的计算机系统。
2 网络处理器软件开发平台
Intel提供了网络处理器开发平台,称为Intel IXA可移植" title="可移植">可移植框架(Intel IXA portability framework)[2]。IXP2400软件开发可移植框架层次图如图2所示。
Intel IXA可移植框架中,将数据的处理分为两个层次:数据面(Data Plane,也称为Fast Path)处理和控制面(Control Plane,也称为Slow Path)处理。
数据平面主要运行在微引擎处理之上,充分利用数据包的无关性,采取并行处理方式,用于实现高速转发数据包的处理功能,具有线速执行特点。数据面的数据包处理可分为若干微模块Microblock。各个微模块之间相互独立,可实现数据面层次上的可移植性。
控制平面一般运行在网络处理器核上,处理各种通信协议、更新路由表、管理数据平面任务与状态、完成高层的QoS控制等。这些操作的性能要求低于数据层面,因此通常采用高性能" title="高性能">高性能通用处理器硬件平台。为了有效支持网络处理功能,控制平面与数据平面之间存在复杂的信息交互与依赖关系。
IXP2400的软件开发分为内核程序和微代码两部分。XScale内核的开发通常使用基于嵌入式操作系统集成开发工具" title="开发工具">开发工具,如WindRiver公司提供的基于嵌入式操作系统VxWorks的集成开发工具Tornado或BMR TEC CO提供的基于嵌入式操作系统Montavista Linux 的集成开发工具Teja。Teja开发工具给基于网络处理器的嵌入式开发带来极大的方便,它能缩短开发周期,优化生成代码,提高代码性能,而且生成的代码很容易移植到不同的目标系统。使用Teja集成开发工具,能独立于复杂的硬件而将网络应用表达为状态机。状态机逻辑可以被映射到选定的目标网络处理器的分布资源,基于这种逻辑设计和到硬件的逻辑映射,生成优化的目标代码(C、C++和MicroC)并且编译生成最终的映像文件。此外,Teja对于此逻辑和系统设计还能提供模拟测试和调试功能;IXP2400中对微引擎的编程使用Intel公司提供的Developer Workbench开发环境,主要使用微代码来进行编程。Developer Workbench提供了完善的编译、链接、仿真和调试功能。
Intel IXA可移植框架中最重要的组成部分就是在微引擎上和XScale核上开发的代码模块。基于不同硬件开发的代码模块分别为微模块和核心组件(Core component)。每个模块都代表了一个进行包处理的代码单元。这里实际上引入了构件的思想,各种模块以一定的顺序组织在一起,形成一个特定的应用。
3 基于网络处理器IXP2400的核心路由器体系结构
路由器体系结构[3]的发展经历了四次大的发展,由单机集中式到单机分布式共享总线,再到分布式Crossbar结构,最后到多机互联的集群式结构,目前正朝着系统化、高性能、可扩展方向发展。由于基于网络处理器的路由器体系能够满足这些要求,被公认为推动下一代网络向灵活性和高性能发展的核心技术。Princeton大学的可扩充路由器VERA[4]和Columbia大学的Genesis系统[5]在这方面做了一些推进。前者主要是基于区分服务Diffserv体系结构,注重服务的灵活性和可扩充性;后者基于“Spawn”思想和Netbind机制,注重虚拟网络系统的动态创建,但是两者都没有提出一个通用的体系模型。
从本质上说,路由器是一种进行网络数据包转发的网络设备,其体系结构可分为三大部分:(1)输入/输出端口;(2)路由计算及处理;(3)交换结构。其中路由计算和处理是路由器的关键,对路由器高性能和灵活性起决定作用。由于网络处理器IXP2400具有高速和灵活性,本文采用IXP2400作为路由计算和处理部分,提出了一种全双工、可扩展的高性能路由器系统体系结构,如图3所示。
在图3中,IXP2400是系统核心部分,负责对数据包进行转发,实现路由功能。SRAM是IXP2400的外接存储设备,通过SRAM Controller与IXP2400连接,主要实现存储数据包处理过程中用到的发送列队、查找表等数据结构。DRAM也是IXP2400外接的存储设备,通过DRAM Controller与IXP2400连接,主要存储数据包和路由表。控制处理器是IXP2400的外接处理器,通过PCI Controller与IXP2400连接,主要为系统提供高层的控制和管理功能。物理层设备收发数据包,通过介质和交换接口MSF与IXP2400连接。交换结构作为处理器与外部接口的传输枢纽,对整个系统的性能起着至关重要的作用。它主要分为总线、Cross-bar(纵横制矩阵)和共享内存三种方式。Cross-bar同其他技术相比,具有成本低,可扩展性良好和非阻塞特性,并且可以根据实际需要扩充宽带。
4 基于网络处理器IXP2400的核心路由器系统处理软件模型
基于IXP2400的核心路由器软件模块框图如图4所示。入口(Ingress)IXP2400首先通过IXF1104或IXF6048从外部网络接收数据包,然后对数据进行处理,并将处理后的数据通过交换接口芯片发送到交换结构(SF);出口(Egress) IXP2400首先通过交换接口芯片从交换结构接收数据,然后对数据包进行处理,最后通过IXF1104或IXF6048将数据包发送出去。微引擎的编程模式有流水线模式(HTC)和线程池(POTS)模式,二者各有优缺点。本文采用了HTC和POTS相结合的编程模式,扬长避短,以取得最佳的处理效率。所有的Context Pipe Stage模块(如包接收、包发送、列队管理等)各自占据一个单独的微引擎,采用HTC方式,每个Context Pipe Stage模块都映射到单独的一个微引擎上。而Funcational Pipeline映射到4个微引擎上,采用POTS方式,执行PPP Decap(数据包解封装)、Classfication(数据包分类)和IP Forwarding(IP数据包转发)等操作。
如图4所示,系统的数据处理由以下模块组成:
(1)包接收模块。包接收(Packet Rx)模块是一个与低层硬件密切相关的驱动模块,负责接收来自外部网络的数据包分片mpacke,并将mpacket重组得到一个完整的数据包。将重组后的数据包写入DRAM,建立包头信息,Packet Rx模块使用一个微引擎上的8个Thread来进行mpacket包的接收和重组,每个Thread负责处理一个mpacket。
(2)解封装/分类/过滤模块。数据包处理模块包括PPP解封装、分类、转发、过滤子模块。这些子模块组成Funcational Pipeline,运行在4个微引擎、32个线程上。PPP解封装子模块通过修改Metadata中的offset和size,将MAC帧头去掉,提取IP数据帧,实现数据包的解封装功能。分类子模块执行分类操作,将数据包分为IPv4、IPv6和ARP等类型。如果是ARP数据包,将其标记为异常数据包送到Xscale Core作进一步处理;否则,将数据包传送到下一个处理模块处理。
(3)包转发模块。首先检查包头是否符合RFC2460规范。如果不符合,则将该包丢弃;否则,根据IP头进行最长前缀匹配LPM查找,得到Next Hop ID(下一跳ID)、Fabric Blade ID和Output Port三个参数。如果LPM没有找到匹配表项,则将包标记为异常提交给Xscale Core作进一步的处理;否则,根据Next Hop ID进行表查询,获得PPP头信息。将数据包封装为PPP格式之后, Forwarder将包交给DL-QM-Sink模块,该模块判断数据包是否合法,若合法,则向列队管理发送加入队列请求,将数据包加入到相应的发送队列。此外, Forwarder还将修改后的IP头和包描述符Metadata写回SRAM。
(4)队列管理模块。管理模块是一个运行在单个微引擎的驱动模块,负责利用SRAM Controller中的Q-Array硬件结构对发送队列执行解封装Decap和封装Encap操作。
(5)发送调度模块。模块将处理来自Fabric的流量控制信息、来自QM的队列转换信息和来自MSF的发送状态机。
(6)CSIX发送模块。该模块是位于单个微引擎的驱动模块,接收来自QM发送的消息,对于每次发送请求,微模块将每个Cframer写入发送缓冲TBUF,通过MSF发送状态机发送到Fabric。
(7)CSIX接收模块。接收来自CSIX Fabric的Cframer,并将其重组为IP数据包。
(8)包封装模块。为接收到的信息添加包头,将IP Packet封装为PPP格式,并向队列管理发送加入队列请求,请求将封装后的包加入到相应的发送队列。
(9)出口的队列模块。该模块与信元队列模块的区别在于列队中传递的是分组而不是信元。对于每个出队请求,分组队列模块向调度模块返回一个出队响应消息。
(10)出口包调度模块。出口包调度模块是基于分组的调度,不需要处理来自Fabric的流控信息,出口调度模块对端口进行WRR调度,对每个端口的队列可进行DRR(Deficit Round Robin)调度。
(11)包发送模块。通过媒体介质接口发送分组,将分组分段成mpacket,并写入TBUF,通过MSF状态机进行发送。
本文以Intel IXP2400网络处理器为例,讨论了网络处理器硬件结构和软件开发技术,并在此基础上提出了一种基于网络处理器的路由器体系结构和软件开发流程。在今后几年里,基于网络处理器的路由器将有着非常巨大的发展空间,但其发展也是一个复杂的、长期的过程,将面临严峻的挑战。
参考文献
1 Intel Corp.Intel IXP2400 Network Processor Hardware Refer-ence Manual.Intel Press,2003:27~29
2 Intel Corp.Intel Internet Exchange Architecture Portability Framework.Intel Press,2003:16~22
3 徐 恪,吴建平,徐明伟.高等计算机网络——体系结构、协议机制、算法设计与路由技术.北京:机械工业出版社,2003:495~505
4 Karlin S,Peterson L.VERA:An extensible router architecture.Computer Networks,2002;38(3):277~293
5 Kounavis M E,Campbell A T,Chou S T et al.The gnesis kernel:A programing systerm for spawing network architec-tures.IEEE Journal on Selected Areas in Communications,2001;19(3):511~526