Forwarding Metamorphosis: Fast Programmable Match-Action Processing in Hardware for SDN
摘要
在SDN (Software Defined Networking)中,控制平面与转发平面在物理上是分离的。控制软件使用开放接口(如OpenFlow)对转发平面(如交换机和路由器)进行编程。本文旨在克服当前交换芯片和OpenFlow协议的两个限制:i)当前的硬件交换非常严格,只允许在固定的一组字段上进行“匹配-动作”处理;ii) OpenFlow规范只定义了有限的数据包处理动作。我们提出了RMT(可重构匹配表)模型,这是一种新的risc启发的用于切换芯片的流水线架构,我们确定了基本的最小操作原语集,以指定如何在硬件中处理头信息。RMT允许在不修改硬件的情况下现场改变转发平面。就像在OpenFlow中一样,程序员可以指定任意宽度和深度的多个匹配表,只受总体资源限制,每个表都可以配置为在任意字段上匹配。然而,RMT允许程序员比OpenFlow更全面地修改所有报头字段。
本文介绍了一种实现RMT模型的64口10gb /s开关芯片的设计。我们的具体设计表明,与社区的担忧相反,灵活的OpenFlow硬件交换机实现几乎不需要额外的成本或功率。
介绍
好的抽象——比如虚拟内存和分时——在计算机系统中是至关重要的,因为它们允许系统处理变化,并允许在下一层简化编程。由于关键抽象,网络已经取得了进步:TCP提供了端点之间连接队列的抽象,IP提供了从端点到网络边缘的简单数据报抽象。然而,网络中的路由和转发仍然是路由协议(例如,BGP, ICMP, MPLS)和转发行为(例如,路由器,网桥,防火墙)的混乱组合,控制和转发平面仍然纠缠在封闭的,垂直集成的盒子里。
软件定义网络(SDN)在抽象网络功能方面迈出了关键的一步,它通过控制平面和转发平面之间的开放接口(例如OpenFlow[27])分离了它们的角色。控制平面从开关中抬起,置于外部软件中。这种对转发平面的程序化控制允许网络所有者在复制现有协议的行为的同时向其网络添加新功能。OpenFlow作为控制平面和转发平面之间基于“Match-Action”方法的接口已经变得非常有名。粗略地说,数据包字节的子集与表匹配;匹配的表项指定了应用于该报文的相应动作。
可以想象在通用CPU上的软件中实现Match-Action。但是对于我们感兴趣的速度——今天大约1tb /s——我们需要专用硬件的并行性。十年来,交换芯片的转换速度一直比中央处理器快两个数量级,比网络处理器快一个数量级,而且这种趋势不太可能改变。因此,我们需要考虑如何在硬件中实现Match-Action,以利用流水线和并行性,同时在片上表内存的约束下生活。
在可编程性和速度之间存在着一种自然的折衷。如今,支持新功能经常需要更换硬件。如果Match-Action硬件允许(刚好)在现场进行足够的重新配置,以便在运行时支持新的数据包处理类型,那么它将改变我们对网络编程的看法。这里真正的问题是能否在不牺牲速度的情况下以合理的成本完成。
单个匹配表:最简单的方法是在我们称为SMT(单个匹配表)模型中抽象匹配语义。在SMT中,控制器告诉交换机根据单个匹配表中的条目匹配任意一组包报头字段。SMT假设解析器定位并提取与表匹配的正确报头字段。例如,一个以太网数据包可能有一个可选的MPLS标签,这意味着IP报头可以在两个不同的位置。当所有字段都完全指定时,匹配是二进制精确匹配,当某些位被切换为0(通配符项)时,匹配是三元匹配。从表面上看,SMT抽象对程序员(还有什么比单个匹配更简单的呢?)和实现者(SMT可以使用广泛的三元内容可寻址内存(TCAM)来实现)都有好处。请注意,转发数据平面抽象具有最严格的硬件实现约束,因为转发通常需要以大约1tb /s的速度运行。
然而,仔细观察就会发现,由于一个经典问题,SMT模型的使用成本很高。表需要存储头的每一个组合;如果报头行为是正交的(条目将有许多通配符位),这是浪费的。如果一个报头与另一个报头匹配,例如,如果第一个报头上的匹配决定了第二个报头(例如,在虚拟路由器[11]中)上匹配的一组不相交的值,则需要表保存两者的笛卡尔积,这可能会更加浪费。
多匹配表:MMT(多匹配表)是SMT模型的自然细化。MMT在一个重要方面超越了SMT:它允许多个较小的匹配表由数据包字段子集匹配。匹配表被安排成一个阶段的管道;阶段j的处理可以依赖于阶段i<j的处理,阶段i修改数据包头或传递到阶段j的其他信息。MMT很容易在每个阶段使用一组更窄的表来实现;事实上,它与现有开关芯片的实现方式非常接近,可以很容易地映射到现有的管道上[3,14,23,28]。
谷歌报告使用商用交换机芯片[13]将他们的整个私有WAN转换为这种方法。
OpenFlow规范过渡到MMT模型[31],但没有强制规定表的宽度、深度,甚至表的数量,使实现者可以自由地选择他们想要的多个表。虽然许多字段已经标准化(例如,IP和以太网字段),但OpenFlow允许通过用户定义的字段设施引入新的匹配字段。
现有的交换芯片实现的表数量很少(4-8),这些表的宽度、深度和执行顺序在芯片制造时设置。但这严重限制了灵活性。用于核心路由器的芯片可能需要一个非常大的32位IP最长匹配表和一个很小的128位ACL匹配表;用于L2桥接的芯片可能希望具有48位目的MAC地址匹配表和第二个48位源MAC地址学习表;企业路由器可能希望有一个较小的32位IP前缀表和一个大得多的ACL表以及一些MAC地址匹配表。为每个用例制造单独的芯片是一个“客户端”,因此商用交换机芯片往往被设计为支持所有常见配置的超集,并以预先确定的管道顺序排列一组固定大小的表。这给网络所有者带来了一个问题,他们想要调整表大小以优化他们的网络,或者实现超出现有标准定义的新转发行为。在实践中,MMT通常转换为固定的多个匹配表。
第二个更微妙的问题是,交换芯片只支持与普通处理行为相对应的有限动作,例如,转发、丢弃、减少ttl、推送VLAN或MPLS报头以及GRE封装。到目前为止,OpenFlow只指定了其中的一个子集。这个动作集不容易扩展,也不是很抽象。一组更抽象的操作将允许修改任何字段,更新与数据包相关的任何状态机,并将数据包转发到任意一组输出端口。
可重构匹配表:因此,在本文中,我们探索了MMT模型的细化,我们称之为RMT(可重构匹配表)。与MMT一样,理想的RMT将允许一组管道阶段,每个阶段都具有任意深度和宽度的匹配表。RMT超越了MMT,它允许以以下四种方式重新配置数据平面。首先,可以更改字段定义并添加新字段;其次,可以指定匹配表的数量、拓扑结构、宽度和深度,只受匹配位数量的总体资源限制;第三,可以定义新的动作,例如编写新的拥塞字段;第四,可以将任意修改的数据包放置在指定的队列中,以便在任何端口子集输出,并为每个队列指定队列规则。该配置应该由SDN控制器管理,但我们在本文中没有定义控制协议。
通过考虑最近几年提出的新协议,例如PBB[16]、VxLAN[22]、NVGRE[19]、STT[21]和OTV[20],可以看出RMT的好处。每个协议都定义了新的报头字段。如果没有像RMT这样的体系结构,就需要新的硬件来匹配和处理这些协议。
请注意,RMT与当前的OpenFlow规范完全兼容(甚至部分由其实现)。
单个芯片显然可以允许一个接口重新配置数据平面。事实上,一些现有的芯片,至少在一定程度上是由于需要满足多个细分市场的需求,已经具有一些可重构性,可以使用芯片的特别接口来表达。
许多研究人员已经认识到需要类似于RMT的东西,并提倡它。例如,IETF ForCES工作组开发了灵活数据平面[17]的定义;类似地,ONF中的转发抽象工作组也在研究可重构性[30]。
然而,对于RMT模型是否可以在非常高的速度下实现,存在着可以理解的怀疑。没有芯片来提供RMT的存在证明,标准化控制器和数据平面之间的重新配置接口似乎是徒劳的。
直觉上,在太比特速度下的任意可重构性似乎是一项不可能完成的任务。但是在这样的速度下,什么样的可重构性是可行的呢?受限的可重构性是否涵盖了我们前面提到的足够大的需求部分?是否可以通过工作硅来证明这些想法的可行性?与固定表的MMT芯片相比,这种RMT芯片有多贵?这些都是我们在本文中要解决的问题。
通用有效载荷处理不是我们的目标。
SDN/OpenFlow(和我们的设计)旨在识别基本的最小基本集来处理硬件中的标头。
可以把它想象成一个像RISC这样的最小指令集,设计成在大量流水线硬件上运行得非常快。我们非常灵活的设计与固定的设计相比具有成本竞争力。在美国,灵活性几乎不需要任何成本.
论文贡献:我们的论文对哪些转发抽象在高速下是实用的争论做出了具体的贡献,以及转发平面可以通过控制平面重新配置的程度。具体而言,我们解决上述问题如下:1。RMT的体系结构(§2):我们描述了一个RMT交换体系结构,它允许定义任意头和头序列,通过任意数量的表任意匹配字段,任意写入包头字段(但不包括包体),以及每个包的状态更新。引入了一些限制以使该体系结构可实现。我们概述了如何通过定义头的解析图和表达匹配表拓扑的表流图来表达所需的配置。
- 用例(§3):我们提供的用例显示了如何配置RMT模型来实现使用以太网和IP报头的转发,并支持RCP[8]。
- 芯片设计和成本(§4-5):我们证明了我们所倡导的可重构性的具体形式确实可行,并描述了一个640 Gb/s (64 × 10 Gb/s)开关芯片的实现。我们的架构和实现研究包括逻辑和电路设计,平面规划和布局的重要细节,使用设计团队开发复杂数字ic的长期历史证明的技术。
采用工业标准28nm工艺。这项工作是必要的,以证明在满足时间和芯片面积(成本)等目标的可行性。我们还没有生产出完整的设计或实际的硅。根据我们的调查,我们表明重新配置的成本预计是适度的:比固定(不可重新配置)版本的成本高出不到20%。
我们不主张我们是第一个提倡可重构匹配的人,也不主张我们提出的可重构功能是“正确的”。我们确实声称,重要的是通过对RMT模型进行具体的定义,并通过展示芯片来显示它是可行的,正如我们在本文中试图做的那样。虽然芯片设计通常不是SIGCOMM的工作范围,但我们的芯片设计表明,RMT模型的一种相当通用的形式是可行的,而且价格低廉。我们表明,RMT模型不仅是考虑网络编程的好方法,而且还可以使用匹配表和动作处理器的可配置管道在硬件中直接表达。
2 RMT ARCHITECTURE
我们说RMT是“允许一组管道阶段……每个都有一个任意深度和宽度的匹配表,匹配字段”。逻辑推论是,RMT开关由一个解析器组成,它支持对字段进行匹配,然后是任意数量的匹配阶段。为了谨慎起见,我们建议在输出端加入某种队列来处理拥塞。
让我们看得更深一点。解析器必须允许修改或添加字段定义,这意味着一个可重新配置的解析器。解析器输出是一个数据包报头向量,它是一组报头字段,如IP dest、以太网dest等。此外,包报头向量包括“元数据”字段,如数据包到达的输入端口和其他路由器状态变量(例如,当前路由器队列的大小)。
向量流经一系列逻辑匹配阶段,其中每个阶段抽象了图1a中数据包处理(例如,以太网或IP处理)的逻辑单元。
每个逻辑匹配阶段都允许配置匹配表的大小:例如,对于IP转发,可能需要一个包含256K 32位前缀的匹配表,对于以太网,可能需要一个包含64K 48位地址的匹配表。输入选择器选择要匹配的字段。包修改是使用宽指令(vliw——图1c中非常长的指令字块)完成的,它可以同时操作报头向量中的所有字段。
更准确地说,报头向量中的每个字段F都有一个操作单元(图1c),它可以接受最多三个输入参数,包括报头向量中的字段和匹配的操作数据结果,并重写F。允许每个逻辑阶段重写每个字段可能看起来有点过分,但它在移动报头时很有用;我们稍后会说明,与匹配表相比,行动单位成本很小。
逻辑MPLS阶段可以弹出MPLS报头,将后续MPLS报头向前移动,而逻辑IP阶段可以简单地减少TTL。指令还允许修改可能影响后续包处理的有限状态(例如计数器)。
控制流是通过来自每个表匹配的附加输出nexttable-address实现的,该输出提供了要执行的下一个表的索引。例如,阶段1中特定以太网类型的匹配可以指导后面的处理阶段在IP上进行前缀匹配(路由),而不同的以太网类型可以指定以太网da上的精确匹配(桥接)。通过更新一组目的端口和队列来控制数据包的命运;这可以用于丢弃数据包、实现多播或应用指定的QoS,如令牌桶。
在管道的末端需要一个重组块来将报头向量修改推回到数据包中(图1a)。最后,将数据包放在指定输出端口的指定队列中,并应用可配置的队列规则。
总而言之,图1a的理想RMT允许通过修改解析器来添加新字段,通过修改匹配内存来匹配新字段,通过修改阶段指令来添加新操作,通过修改每个队列的队列规则来添加新队列。理想的RMT可以模拟现有的设备,如网桥、路由器或防火墙;并且可以实现现有的协议,如MPLS和ECN,以及文献中提出的协议,如使用非标准拥塞字段的RCP[8]。最重要的是,它允许将来在不修改硬件的情况下修改数据平面。
2.1 Implementation Architecture at 640Gb/s
我们提倡如图1b所示的实现体系结构,它由大量的物理管道阶段组成,根据每个逻辑阶段的资源需求,可以将少量的逻辑RMT阶段映射到这些阶段。这个实现架构的动机是:1。分解状态:路由器转发通常有几个阶段(例如,转发,ACL),每个阶段使用一个单独的表;将这些组合到一个表中产生状态的交叉积。阶段是按照依赖关系顺序处理的,因此物理管道是很自然的。2. 灵活分配资源,减少资源浪费.
一个物理管道阶段有一些资源(例如,CPU,内存)。逻辑阶段所需的资源可以有很大的不同。例如,防火墙可能需要所有acl,核心路由器可能只需要前缀匹配,而边缘路由器可能每种都需要一些。通过灵活地将物理阶段分配到逻辑阶段,可以重新配置管道,使其从防火墙转变为现场的核心路由器。
物理阶段的数量N应该足够大,以便使用很少资源的逻辑阶段最多浪费1/N /N的资源。当然,增加N会增加开销(布线,电源):在我们的芯片设计中,我们选择N = 32作为减少资源浪费和硬件开销之间的折衷。
- 布局优化:如图1b所示,通过将逻辑阶段分配给多个连续的物理阶段,可以为逻辑阶段分配更多的内存。另一种设计是通过横杆[4]将每个逻辑阶段分配给一组解耦的内存。虽然这种设计更加灵活(任何内存库都可以分配到任何阶段),但在最坏的情况下,处理阶段和存储器之间的线路延迟至少会随着pM而增长,这在需要大量内存的路由器芯片中M可能会很大。虽然这些延迟可以通过流水线来改善,但这种设计的最终挑战是布线:除非减少当前匹配和动作宽度(1280位),否则在每个级和每个存储器之间运行这么多导线可能是不可能的。
总而言之,图1b的优点是它使用了具有短连接的平铺架构,其资源可以以最小的浪费进行重新配置。我们承认有两个缺点。首先,拥有更多的物理级似乎会增加对电力的需求。其次,这个实现体系结构合并了处理和内存分配。需要更多处理的逻辑阶段必须分配两个物理阶段,但这样它就会获得两倍的内存,即使它可能不需要内存。实际上,这两个问题都不重要。我们的芯片设计表明,阶段处理器使用的功率最多占总功耗的10%。其次,在网络中,大多数用例主要是内存使用,而不是处理。
2.2 Restrictions for Realizability
物理管道阶段架构需要限制以允许实现太比特速度:
比赛限制:设计必须包含固定数量的物理比赛阶段和一组固定的资源。
我们的芯片设计在入口和出口都提供了32个物理匹配阶段。出口的匹配动作处理通过将每个端口的修改延迟到输出之后,允许对多播数据包进行更高效的处理。
包头限制:包头矢量包含用于匹配和操作的字段必须受到限制。
我们的芯片设计限制是4Kb (512B),允许处理相当复杂的标头。
内存限制:每个物理匹配阶段包含相同大小的表内存。通过将每个逻辑匹配阶段映射到多个物理匹配阶段或其分数来近似任意宽度和深度的匹配表(见图1b)。例如,如果每个物理匹配阶段只允许1000个前缀项,那么一个2000个IP的逻辑匹配表将分两个阶段实现(图1b的左上角矩形)。同样,一个小的Ethertype匹配表可能占用匹配阶段内存的一小部分。
SRAM中基于哈希的二进制匹配比TCAM三元匹配在面积上便宜6 / 4。两者都是有用的,因此我们在每个阶段提供固定数量的SRAM和TCAM。每个物理阶段包含106个1K × 112b SRAM块,用于80b宽哈希表(开销位稍后解释)并存储操作和统计数据,以及16个2K × 40b TCAM块。块可以并行地用于更广泛的匹配,例如,使用四个块进行160b ACL查找。32级的总内存为370mb SRAM和40mb TCAM。
动作限制:必须限制每个阶段指令的数量和复杂性,以保证其可实现性。
在我们的设计中,每个阶段可以在每个字段执行一条指令。指令仅限于简单的算术、逻辑和位操作(见§4.3)。这些操作允许实现RCP[8]之类的协议,但不允许在包体上进行包加密或正则表达式处理。
指令不能实现状态机的功能;它们可能只修改包头向量中的字段,更新有状态表中的计数器,或者将包直接发送到端口/队列。排队系统提供四个层次结构和每个端口2K队列,允许赤字轮询、分层公平排队、令牌桶和优先级的各种组合。但是,它不能模拟WFQ所需的排序。
在我们的芯片中,每个阶段包含超过200个动作单元:一个用于数据包报头向量中的每个字段。芯片中包含超过7,000个操作单元,但与内存相比,这些操作单元占用的面积很小(< 10%)。动作单元处理器很简单,特别的架构避免了昂贵的指令实现,并且每比特需要少于100个门。
应该如何配置这样一个RMT体系结构?需要两个信息:一个表示允许的头序列的解析图,以及一个表示匹配表集和它们之间的控制流的表流图(参见图2和§4.4)。理想情况下,编译器执行从这些图到适当的开关配置的映射。我们还没有设计这样的编译器。
3. EXAMPLE USE CASES
为了对如何使用RMT芯片有一个高层次的了解,我们将看两个用例。
例1:L2/L3交换机。首先,我们需要配置解析器、匹配表和操作表。对于我们的第一个示例,图2a显示了L2/L3交换机的解析图、表流图和内存分配。解析图和表流程图告诉解析器在宽报头总线上提取并放置四个字段(Ethertype、IP DA、L2 SA、L2 DA)。表流程图告诉我们应该从宽报头总线中读取哪些字段并在表中进行匹配。内存分配告诉我们四个逻辑表是如何映射到物理内存阶段的。在我们的示例中,Ethertype表自然地落入阶段1,其余三个表分布在所有物理阶段,以最大化它们的大小。大多数哈希表RAM在L2 SA和DA之间分配,每个表有120万个条目。我们在所有32个阶段投入TCAM条目,以容纳100万个IP DA前缀。最后,我们需要存储匹配后执行的VLIW动作原语(例如出口端口,减量TTL,重写L2 SA/DA)。
这些需要舞台30%的RAM内存,剩下的留给L2 SA/DA。如果启用,数据包和字节计数器也会消耗RAM,使L2表大小减半。
配置完成后,控制平面可以开始填充每个表,例如通过添加IP DA转发表项。
例2:支持RCP和ACL。我们的第二个用例添加了速率控制协议(RCP)支持[8]和用于简单防火墙的ACL。RCP通过让开关显式地指示流的公平共享速率来最小化流完成时间,从而避免了使用TCP慢启动的需要。公平共享率被每个交换机戳入RCP报头。图2b显示了新的解析图、表流图和内存分配。
为了支持RCP,解析器将提取数据包的当前速率和估计的RTT字段,并将其放在报头向量中。阶段32中的出口RCP表更新出包中的RCP速率—最小操作选择包的当前速率和链路的公平共享速率中较小的一个。(公平份额由控制平面周期性计算。)有状态表(§4.4)积累计算公平份额率所需的数据。有状态表在阶段32中实例化,并累积每个目的端口的字节和RTT总和。
我们还从TCAM的最后两个阶段创建了20K ACL条目(120b宽),将L3表减少到960K前缀,以及用于保存相关操作(例如,删除、日志)的RAM条目。
在实践中,用户不应该关心底层配置细节,而应该依赖编译器从解析图和表流图生成开关配置。
4. CHIP DESIGN
到目前为止,我们已经使用了一种方便网络用户的RMT转发平面的逻辑抽象和一种物理架构来实现RMT。现在我们描述实现设计的细节。
我们为开关芯片选择了1GHz的工作频率,因为在64端口/ 10gb /s和960M数据包/s的总吞吐量下,单个管道可以处理所有输入端口数据,为所有端口服务,而在较低的频率下,我们将不得不使用多个这样的管道,以额外的面积费用。开关IC的框图如图3所示.注意,这与图1a中的RMT架构图非常相似。
输入信号由64个10Gb SerDes(序列化-反序列化)IO模块接收。40G通道是由4个10G端口组合而成的。输入数据经过执行低级信令和MAC功能(如CRC生成/检查)的模块后,由解析器处理。我们使用16个入口解析器块而不是图1a所示的单个逻辑解析器,因为我们的可编程解析器设计可以处理40Gb的带宽,即四个10G通道或一个40G通道。
解析器接受各个字段位于可变位置的数据包,并输出一个固定的4 Kb数据包报头向量,其中每个解析的字段被分配一个固定的位置。位置是静态的,但是是可配置的。字段的多个副本(例如,多个MPLS标签或内部和外部IP字段)在包报头矢量中被分配唯一的位置。
输入解析器结果被多路复用到单个流中,以提供匹配管道,该管道由32个顺序匹配阶段组成。一个大的共享单元提供存储以适应由于输出端口超额订阅而导致的排队延迟;根据需要将存储分配给通道。在将数据存储到公共数据仓库之前,发送器将包头向量中的数据重新组合到每个包中。
一个排队系统与公共数据单元相关联。数据单元存储分组数据,而指向该数据的指针保存在每个端口的2K队列中。每个通道依次使用可配置的队列策略从公共数据存储请求数据。接下来是一个出口解析器,一个出口匹配管道,由32个匹配阶段和一个分离器组成,之后数据包数据被定向到适当的输出端口,并由64个SerDes输出通道驱动到芯片。
虽然单独的32阶段出口处理管道似乎有些多余,但我们展示了出口和入口管道共享相同的匹配表,因此成本最小。此外,出口处理允许按端口定制多播数据包(例如针对其拥塞位或MAC目的地),而无需在单元中存储多个不同的数据包副本。现在我们描述设计中的每个主要组件。
4.1 Configurable Parser
解析器接受传入的数据包数据,并产生4K位的数据包报头向量作为其输出。解析由用户提供的解析图(如图2)指导,并由一个o -作品集算法转换为一个256个条目的TCAM中的条目,该TCAM匹配32b的传入数据包数据和8b的解析器状态。请注意,此解析器TCAM与每个阶段中使用的匹配TCAM完全分开。
例如,当16位的以太类型到达时,CAM匹配32位中的16位(通配符其余的),更新指示下一个报头类型(例如,VLAN或IP)的状态以指导进一步解析。
更一般地说,TCAM匹配的结果触发一个操作,该操作更新解析器状态,将传入数据移动指定字节数,并将一个或多个字段的输出从输入数据包中的位置定向到数据包报头向量中的固定位置。此循环重复以解析每个数据包,如图4所示。通过将关键更新数据(如输入移位计数和下一个解析器状态)从RAM中提取到TCAM输出优先级逻辑中,循环得到了优化。解析器的单周期循环以32 Gb/s的速度匹配字段,这意味着更高的吞吐量,因为不是所有字段都需要解析器匹配。一个解析器实例很容易支持40 Gb/s的数据包流
4.2 Configurable Match Memories
每个匹配阶段包含两个640b宽的匹配单元,一个TCAM用于三元匹配,一个基于SRAM的哈希表用于精确匹配。SRAM哈希单元的位宽由8个80b子单元聚合而成,而三进制表由16个40b TCAM子单元组成。这些子单元可以单独运行,在组中运行以获得更宽的宽度,或者组合在一起形成更深的表。输入交叉栏向每个子单元提供匹配数据,子单元从4Kb包报头向量中选择字段。如前所述(图1b),相邻匹配阶段中的表可以组合成更大的表。在极限情况下,所有32个阶段都可以创建一个表。
此外,图3中的入口和出口匹配管道实际上是相同的物理块,在入口和出口线程之间以细粒度共享,如图1b所示。为了实现这一点,首先在输入和输出矢量之间共享包头矢量;向量中的每个字段被配置为由入口线程或出口线程拥有。其次,每个字段对应的功能单元以相同的方式分配到入口或出口。
最后,将每个内存块分配给入口或出口。由于每个字段和内存块都由出口或入口独占,因此不会出现争用问题。
每个比赛阶段有106个RAM块,每1K项。分配给匹配、操作和统计内存的RAM块的比例是可配置的。精确匹配表被实现为Cuckoo哈希表[10,26,32],具有(至少)四种方式,每种方式有1K条目,每种方式需要一个RAM块。读取确定地在一个周期内执行,所有方式都是并行访问的。每个比赛阶段也有16个2K条目的TCAM块,可以组合成更宽或更深的表。
与每个匹配表RAM条目相关联的是一个指向动作内存的指针和一个动作大小、一个指向指令内存的指针和一个下一个表地址。动作内存包含参数(例如,在输出封装中使用的下一跳信息),指令指定要执行的功能(例如,添加Header)。动作存储器和匹配存储器一样,是由8个更窄的单元组成的,每个单元由1K个字组成,每个单元产生96b个数据(连同字段有效位和存储器ecc纠错码位)。操作内存从106个RAM块中分配,而操作指令保存在单独的专用内存中。
在OpenFlow中,我们的芯片为每个流表条目存储数据包和字节统计计数器。这些计数器的完整64b版本包含在0芯片DRAM中,芯片上的有限分辨率计数器使用1K RAM块并应用LR(T)算法[33]来提供可接受的DRAM更新速率。统计内存的一个字可配置地保存两个或三个流条目的计数器,允许统计内存成本与DRAM更新速率的tradeo (s)。每个计数器增量都需要一个读写内存操作,但在1GHz管道中,每个数据包只有一个操作可用,因此通过添加一个内存库来合成第二个内存端口1
4.3 Configurable Action Engine
为每个包头字段提供了一个单独的处理单元(见图1c),因此所有的都可以同时修改。包报头向量中分别有64、96和64个字,分别为8、16和32b,每个字都有一个相关的有效位。较小的单词单元可以组合起来执行较大的字段指令,例如,两个8b的单元可以合并,作为一个16b的字段来操作它们的数据。每个VLIW包含每个字段字的单独指令字段。
OpenFlow指定了简单的操作,例如将字段设置为一个值,以及复杂的操作,例如PBB封装和内外TTL复制,其中外部和内部字段可能是许多选择之一。
复杂的修改可以是低速的子程序,但必须使用精心选择的指令集,在我们的1ghz时钟速率下被平化为单周期操作。
表1是操作指令的子集。Depositbyte允许将任意字段从源词中的任何位置存储到背景词中的任何位置。Rotmask-merge独立字节旋转两个源,然后根据字节掩码合并它们,在执行IPv6到IPv4地址转换[18]时很有用。bitmask -set用于选择性元数据更新;它需要三个源:两个要合并的源和一个位掩码。像其他操作符一样,Move只会在源有效的情况下将源移动到目的地,也就是说,如果该字段存在于数据包中。
另一个通用的可选条件化是目标有效的。cond-move和cond-mux指令用于内部到外部和外部到内部的字段复制,其中内部和外部字段依赖于数据包。例如,一个内部到外部的TTL复制到一个MPLS标签,可以从一个内部MPLS标签(如果它存在)中获取TTL,或者从IP报头中获取TTL。移位、旋转和字段长度值通常来自指令。一个源操作数从包报头向量中选择字段,而第二个源操作数从包报头向量或动作字中选择字段。
一个复杂的操作,如PBB、GRE或VXLAN封装,可以被编译成一条VLIW指令,然后被认为是一个原语。灵活的数据平面处理允许以更高的成本和640Gb/s的功耗进行操作,否则需要使用网络处理器、fpga或软件来实现。
4.4 Other Features
通过依赖分析减少延迟:通过要求物理匹配阶段I只在阶段I % 1完全完成处理P之后才处理数据包报头向量P,可以很容易地确保正确性,但在许多情况下,这是过度的,并且会严重增加延迟。减少延迟的关键是在连续的阶段中识别匹配表之间的三种依赖关系:匹配依赖关系、操作依赖关系和后继依赖关系[2],每种依赖关系将在下面进行描述。
匹配依赖发生在匹配阶段修改数据包报头字段并在该字段上进行后续阶段匹配时。在这种情况下,执行不可能有重叠(图5a)。当匹配阶段修改数据包报头字段并且后续阶段使用该字段作为操作的输入时,就会发生动作依赖,例如,如果一个阶段设置TTL字段而下一个阶段减少TTL。
部分执行重叠是可能的(图5b)。当匹配阶段的执行基于前一个阶段的执行结果时,后继依赖关系就会发生;前一阶段的执行可能导致跳过后继阶段。如果后继阶段是推测性地运行的,并且在提交之前解决了预测问题,则后继阶段可以与其前导阶段并发运行(图5c)。表之间没有依赖关系的表也可以并发运行。连续阶段之间的管道延迟可以在图5的三个选项之间静态配置,分别用于入口线程和出口线程。
组播和ECMP:组播处理在入口和出口之间进行分割。入口处理写入输出端口位向量字段以指定输出,并可选地写入用于以后匹配的标记和路由到每个端口的副本数量。每个多播数据包的一个副本存储在数据存储单元中,多个指针放置在队列中。
在将数据包注入出口管道时创建副本,其中表可以匹配标记、输出端口和数据包复制计数,以允许对每个端口进行修改。ECMP和uECMP处理是相似的。
仪表和状态表:仪表用于测量和分类匹配表项的流量,并可用于修改或丢弃数据包。仪表只是有状态表的一个例子,在有状态表中,一个动作修改对后续数据包可见的状态,并可用于修改它们。可以任意增加和重置的有状态计数器。
它们可以用来实现,例如GRE序列号(在每个封装的数据包中递增)和OAM[15,25]。
一致和原子更新:为了允许一致的更新[34],版本信息包含在表项中,并且版本ID与每个包一起流经管道,通过版本兼容性限定表匹配。
5. EVALUATION
与传统的可编程开关芯片相比,我们的设计增加了面积和功率,从而表征了可配置性的成本。我们的比较在第5.5节中对总芯片面积和功耗的比较中达到高潮。为了实现这一点,我们依次考虑解析器、匹配阶段和操作处理,从而考虑成本的贡献者。
5.1 Programmable Parser Costs
可编程性是有代价的。传统解析器针对一个解析图进行了优化,而可编程解析器必须处理任何受支持的解析图。通过比较常规设计和可编程设计的综合结果来评估成本。图6显示了实现几个解析图和一个可编程解析器的传统解析器的总门数。我们通过组合16个运行在1 GHz的40 Gb/s解析器实例,假设解析器的总吞吐量为640 Gb/s。所有设计的结果模块在解析过程中都包含4Kb的包头向量。可编程解析器使用256位、40位TCAM和256位、128位动作RAM。
解析器门计数由填充解析器头向量的逻辑控制。根据解析图的不同,传统设计需要290 - 300万个门,而可编程设计需要560万个门,其中160万个门是由增加的TCAM和动作RAM模块贡献的。从这些结果来看,解析器可编程性的成本大约是2 (5.6/3.0=1.87 <e:2> 2)。
尽管解析器门数增加了一倍,但解析器只占芯片面积的不到1%,因此使解析器可编程的成本不是问题。