文摘

高级编程的软件定义网络的有效利用的关键构件(SDN)。现有的解决方案,然而,要么(1)不能利用最先进的开关与流表流水线,关键技术,防止流规则集爆炸或(2)迫使程序员手动组织和管理硬件流表管道,这是耗时且容易出错。本文提出了高层SDN编程框架来解决这些问题。框架可以自动开关(1)为异构生成规则集与不同流表管道设计和(2)网络状态改变时更新安装规则。因此,框架不仅可以产生有效的规则集开关还提供程序员集中,直观,因此易于使用的编程API。实验表明,该框架可以生成紧凑的规则集,29 - 116倍小于其他开源SDN生成控制器。此外,框架是5倍恢复网络连接失败相比其他控制器。

1。介绍

软件定义网络(SDN)带来的呼吁更有效地管理复杂网络屏蔽底层细节(例如,设置流表和处理网络链接失败等事件)。近年来,SDN越来越司空见惯的场景,如高性能计算和数据中心(1- - - - - -4]。

为此,SDN的主要研究方向是提供更复杂的SDN编程接口,我们称之为高层SDN编程api。通过使用这些api, SDN程序员可以管理一个SDN网络在一个集中的,直观的,因此易于使用的方式(5- - - - - -7]。现有的编程api的基本思想是SDN程序静态编译,然后生成一个特定流表为每个网络交换机方案。我们称这种方法为积极的高层SDN编程模型(8)(从今以后积极的编程)。然而,积极的编程,有一定的局限性。具体来说,管理网络交换机,程序员必须显式地指定每个流表的匹配字段,因此是程序员的责任正确处理硬件细节。

近年来,另一个有前途的方法,活性高层SDN编程模型(反应性编程从今以后),提出了。反应性编程取决于一个运行时optimizer-rather比程序员(1)识别开关配置SDN控制器开始运行时,(2)生成流表方案每个开关,必要时(3)和填充流规则。这些独特的特性、反应性编程隐藏开关细节和程序员提供了一个更一般的和易于使用的抽象。一些积极的编程系统(8,9提出了。然而在实践中,我们发现利用积极的编程可以复杂和具有挑战性的,和许多编程的复杂性仍然存在。以下是两个主要的挑战。

首先,流表流水线是一个关键技术,防止流规则集爆炸,几乎所有主要采用SDN换供应商。例如,最近的开关P4 [6],Domino [10],OF-DPA [11[],POF7所有支持流水线流表。不幸的是,现有的实现反应性编程(例如,枫(8)只生成规则集开关与一个流表。据我们所知,没有实现的反应性编程能够支持开关与流表流水线。的主要挑战是支持流水线流表,每一个流动法则必须分成多个阶段,和每个插入管道中的流表。,因此,智能策略需要分裂规则,不同阶段插入不同的流程表,使所有阶段分布在流表自动(详细的节3)。

第二,当反应性编程使用,是控制器的责任网络状态时自动重新计算和更新安装流规则(如拓扑)的变化。这个工作是重要的,因为多个流管道中的表必须自动更新;否则,性能问题,甚至出现安全问题(详细的部分2)。不幸的是,没有现有的实现反应性编程能正确有效地处理网络状态依赖。

总的来说,应用反应性编程先进的交换机,支持流表流水线相当具有挑战性。我们所知,没有现有的工作已经成功地解决了上述问题。在研究中,它仍然是一个悬而未决的问题如果反应性编程可以应用于先进的交换机?如果答案是肯定的,预期的好处是什么?

本文试图回答上述问题给枫+ +,第一个实现高层SDN反应性编程开关与管道流表。枫+ +是枫的扩展(8),一个典型的反应性编程模型。枫只支持开关与单流表。相比之下,枫+ +可以支持开关与流表管道设计,解决上述问题。具体来说,枫+ +介绍转发树,一个数据结构由控制器运行时系统来管理维护交换机的转发规则集统一和集中的方式。每片叶子在转发树由路由决定,依赖关系,处理环境的快照。转发树的基础上,发明了一种新型树压缩算法去除冗余。压缩转发树,这是一个有向无环图(DAG),可以显著减少流规则生成。利用流表管道设计开关、枫木+ +树分割压缩转发到多个子树,根据硬件的配置交换机。然后,小说映射算法将子树映射到多个流表,并作为一个管道。此外,处理网络链接失败等事件,枫+ +包括小说programmer-oblivious订阅/通知策略来有效地处理网络事件。战略不仅提供了一个易于使用的API的程序员,也有助于枫+ +运行时高效、自动更新退休流规则。据我们所知,枫木+ +是第一个真正的反应性编程实现SDN网络包括异构交换机与流表管道设计(作者强调积极的编程和反应性编程并不互相排斥。在实践中,一个系统可能采用这两种方法。 This paper focuses on reactive programming).

实验表明,生成的规则集枫+ +更有效比其它SDN控制器,所产生的规则集更紧凑和消耗更少流表空间。例如,规则集生成的枫木+ + 29 - 116 x小于所产生的痘,照明灯,OpenDaylight,三个最广泛使用的开源SDN控制器。此外,枫+ + 5倍的速度比其他编译器从链路故障中恢复。我们实现了一个开源版本的Python中的枫+ +。我们希望这个实现可能是有用的为学术界和工业。

剩下的纸是组织如下:部分2给出了激励的高层SDN编程的例子。部分3介绍了枫的设计细节+ +。我们目前的评估部分4节中,讨论相关工作5,和结论部分6

2。一个激励的例子

激励反应性编程挑战面临管理异构开关与流表管道设计,我们使用以下高层SDN程序。

假设程序员是管理一个本地网络使用政策,包括三个部分:(1)程序员想定义一个白名单的主机,命名recognizedHost。每一次当一个数据包,如果源MAC地址或目的MAC地址不存在在白名单中,数据包应该下降;(2)程序员想推导出访问主机的开关。如果访问开关在“programmer-defined”列表中protectedAP,应该使用一个安全的路径转发数据包;(3)否则,应该使用默认的最短路径。

这一政策在概念上简单明了。反应性编程模型允许程序员使用熟悉的编程语言(如Java、Python)和数据结构(如哈希映射和列表)来执行该政策。图1介绍了代码,程序员需要程序如果他/她个人喜欢Python。

具体来说,程序员定义了一个词典,recognizedHost,保存MAC地址和相关的接入交换机(第1行图1)。然后,程序员定义了一个列表,protectedAP记录安全接入交换机。每一次当一个开关接收到数据包,但不知道如何向前,开关发送一个PACKET_IN消息包含头包的控制器。控制器然后调用onPacket函数,它检索源MAC和目的地MAC地址的数据包。如果源MAC或目的MAC地址不存在recognizedHost,这是建立和维护由另一个独立L2-learning计划,控制器指示开关包(第6 - 7行)。否则,控制器指示开关路由数据包沿着安全路径或最短路径,通过检查如果其中一个接入交换机protectedAP。控制器最后插入流规则匹配源MAC和目的地MAC地址。尽管它的简单性,反应性编程有以下缺点:流表爆炸。现有的反应性编程的实现不能有效工作。一个问题是,onPacket产生流规则单流表,因此,规则集生成可能爆炸。例如,规则生成的程序的数量secure-or-shortest-forwarding在图1是指数级的MAC地址(主机)的网络。在坏的情况下,网络组成 源MAC地址和 目的MAC地址,导致的规则集 转发表的条目,远远超出了能力在现代硬件开关(详细的节3.4)。网络状态不一致。另一个问题是,onPacket不能正确处理网络状态依赖。假设开关主机的访问一个并没有在protectedAP,因此,数据包发送或接收从主机一个被转发的最短路径。然后,一位经理手动切换到补充道protectedAP一些安全原因。只是迫使后续流动路线通过安全的路径是远远不够,因为规则插入到网络交换机还需要删除以避免数据包穿过不安全的链接。我们称这种情况为网络状态不一致问题。

据我们所知,没有现有的工作集中在反应性编程解决这两个基本问题。枫+ +试图实现和部署反应性编程在现实网络中,通过求解问题。

3所示。系统设计

枫+ +的目的是实现对异构反应性编程开关不同流表管道设计。具体来说,枫+ +地址挑战包括规则集爆炸和网络故障恢复。

为此,枫+ +引入了一个复杂的SDN控制器框架如图2。枫+ +采用OpenFlow协议来管理网络交换机和提供了一个算法的政策编程API (8]。算法的政策API允许程序员使用熟悉的编程语言(如Java、Python)设计程序和管理网络。枫+ +的核心由四个模块组成,包括运行时,全局优化,局部优化,环境信息的收集。当消息到达PACKET_IN控制器,模块运行时检索包字段、programmer-defined运行程序和日志网络状态依赖。模块全局优化是为整个网络计算路由决策和执行全球优化(如选择最短的路由路径)。模块局部优化是为特定的网络交换机和路由决策计算进行优化,如利用通配符规则集压缩流规则。整个系统由一个单独的实例全局优化。相比之下,系统可能有多个实例局部优化,每一个都被分配给一个开关网络。模块环境信息的收集是收集网络信息,如网络拓扑和网络设备的状态。另一个重要的角色环境信息的收集模块是通知其他模块通过调用回调函数,当环境变化的信息。本章的剩余介绍枫+ +的一个一个关键功能,从“programmer-defined”高级程序规则集生成的开关。

3.1。算法策略和北行的枫+ +的API

枫的北向的应用程序编程接口(API) + +是基于算法的政策提出了在枫8),它允许一个SDN程序员指定如何处理传入的数据包和应该如何转发数据包,通过提供一个通用的功能。例如,onPacket在图1是这样一个函数,调用每个OpenFlow PACKET_IN消息。函数onPacket需要一个参数:包的头。身体内的onPacket,程序员可以定义局部变量和计算转发决策通过使用熟悉的算法和数据结构。路由决策可能取决于全局变量(例如,recognizedHost在图1)和网络环境的上下文(例如,网络拓扑计算最短路径)。这些数据存储在数据存储模块环境信息的收集,负责保持数据存储中的数据更新和通知其他模块是否有注册的部分数据。在枫+ +,每个全局数据结构是一个包装器的原始数据结构除了一个回调函数。回调函数是用来注册当前数据存储转发决定。函数的返回值onPacket转发路径,指定应该如何转发数据包。

3.2。高级语言程序全局转发树

每次当一个包到达控制器,枫c++运行时调用“programmer-defined”项目,并生成一个转发决策(如下降,广播,或转发路径)。同时,枫+ +运行时记录决策依赖关系的本质:包字段访问(源和目标MAC地址和以太网类型在示例程序图1)、全局变量和环境上下文访问(网络拓扑转发决策)。我们将作为一个这样的记录全球货运的决定

转发决策是本质上的记录,因为枫叶+ +运行时可以使用它来生成开关转发规则防止后续数据包相同的流不必要被发送到控制器。这可以大大节省带宽之间的控制器和开关。例如,假设一个执行onPacket如下:(1)程序读取源MAC地址的数据包,(2)结果是00:00:00:00:00:01(具体性今后:01),(3)程序然后读取数据包的目的MAC地址,(4)结果是00:00:00:00:00:11具体性(今后:11),和(5)程序计算,决定放弃这个主机的数据包,因为访问开关不在白名单recognizedHost。枫+ +运行时然后再插入一个流动规则匹配的字段是源和目的地MAC地址(srcMAC = =: 01 & & dstMAC = =: 11)和行动正在下降。然后,我们可以推断,如果程序再次给出任意数据包的源和目的MAC地址是:01和:11日分别,程序也会选择放下包。结果,我们可以重用第一个数据包的转发决定,插入一个流动法则的开关。

转发决策组织在枫叶树+ +运行时。假设onPacket程序运行一段时间,和五个不同流数据包到达。在其中的一个决定,到达的数据包的MAC地址是:01,因此程序返回转发决策下降。在第二个跟踪,到达的数据包的MAC地址是:02,protectedAP,因此程序返回一个安全路径源和目的地之间的交换机转发决策。同样,假设随后三个包有相同的源MAC地址,:03但有不同的目的地MAC地址(11日:12,:13日分别),枫+ +运行时将产生三种不同的痕迹,每个包的一个。枫+ +维护这些决定通过组织树如图3。我们把树转发树。在这个图中,椭圆代表一个匹配的字段和一个矩形动作。箭的标签代表匹配字段的值。值得注意的是,一个“如果”语句在高级程序生成一个椭圆节点有两个分支,一个积极的,另一个负面的。

3.3。全球转发树交换机的转发树

全球转发树是维护的全局优化模块和用于计算转发决策对整个网络。结果,其转发决策(例如,最短路径)的列表(开关ID、端口号)对。生成流表为一个特定的开关,枫+ +需要知道每个开关的具体转发决策(例如,输出端口号)。

幸运的是,转发决定为一个特定的开关可以组织成一个树,这是全球的一部分转发树,树叶是交换机的转发决策。我们将转发树为一个特定的开关本地转发树。例如,全球转发树如图3将开关转换到本地转发树吗一个(图4),如果端口1的开关一个连接到安全的路径,端口2的开关一个连接到的最短路径,主机MAC地址:01和02附加到其他交换机。对于每个开关,都有一个相应的本地转发树枫+ +。

本地转发树生成和维护的模块局部优化。一个简单的策略来生成一个本地转发树为一个特定的开关如下:(1)复制全球转发树,(2)取代switch-specific转发的行为决策,(3)遍历树本地转发和删除分支,不涉及开关,(4),然后监测全球转发树,并相应地更新本地转发树。

值得注意的是,本地转发树的结构不一定是固定的。换句话说,树在图4可以选择srcMAC dstMAC,或任何其他的包树的根,只有枫+ +可以生成相同的转发规则集的开关。在实践中,本地转发树的结构取决于流表管道设计的开关。

3.4。压缩转发树

的一个缺点反应性编程是生成的规则集可能遭受爆炸问题,可以通过转发树的大小。图5转发树中显示了冗余和潜在规则集爆炸。在坏的情况下,节点srcMAC 儿童( MAC地址),每一种都有 孩子(叶子),导致树的总数 节点。

为了解决冗余问题,枫+ +采用一种新的压缩算法极大地减少了转发树的大小。具体来说,如图5,很多兄弟姐妹的节点srcMAC和dstMAC是冗余的,父母可以参考相同的孩子和其他人。例如,MAC地址路由决定对(1日:11)MAC地址和路由决定对(1日:13)是相同的,因此这两个分支可以合并(图6(一))。同样,MAC地址路由决定对(:1, )MAC地址和路由决定对(:03, )可以合并,因为他们有相同的孩子集(图6 (b))。

压缩转发树的基本思想是进行深度优先遍历树。该算法从树的根,然后递归地检查每一个孩子。每当算法达到一个节点时,它首先检查是否有两个孩子的这个节点是相同的和合并冗余的孩子保持一个孩子和删除。

所示的压缩算法是算法的伪代码1。该算法首先设置字段的值压缩每个节点的树。然后算法从根开始,调用函数压缩()(4号线),树进行深度优先遍历。每次当达到一片叶子时,该算法集压缩场并返回(7 - 9行)。否则,压缩()当前节点的遍历每个孩子(11行)。如果有孩子,表示child_t1的算法,没有压缩(12行),压缩()第一次压缩这个孩子(13号线)。否则,算法检查如果有其他孩子已被压缩(1)和(2)有相同的孩子设置为孩子child_t1(16行)。如果算法发现任何这样的一个孩子child_t2,压缩()(1)指导执行压缩child_t2child_t1然后(2)删除节点所指出的child_t2(17 - 18行)。最后,压缩()设置压缩当前节点然后返回。算法压缩()基本上树进行深度优先遍历和压缩大小的树,把树变成DAG。执行的另一个好处压缩()转发树是它更容易产生的DAG映射到一个流表管道(在后续部分中详细)。

参数:英国《金融时报》:转发树
(1) 过程CompressFT(英尺)
(2) 节点在英国《金融时报》:
(3) node.compressed = false;/∗初始化。∗/
(4) 压缩(ft.root);
(5) 返回;
(6) def压缩(节点):/∗深度优先树遍历。∗/
(7) 如果 = =叶:/∗检查是否一片叶子节点。∗/
(8) node.compressed = true;
(9) 返回
(10) 其他的:
(11) 在node.children child_t1:/∗找到孩子。∗/
(12) 如果child_t1.compressed = =假:
(13) 压缩(child_t1);孩子/∗递归地压缩。∗/
(14) 返回;
(15) child_t2 (node.children-child_t1):/∗发现一个孩子child_t1是一样的。∗/
(16) 如果child_t2压缩和child_t1 = = child_t2:
(17) child_t1 child_t2指向相同的节点;/∗去除冗余。∗/
(18) node.children.delete (child_t2);
(19) node.compressed = true;
(20) 返回
3.5。从压缩生成流表转发树

给定一个压缩转发树,现在我们可以生成流表与流开关表管道设计。这包括两个步骤:建立一个适当的管道生成流规则

设置表流管道的基本思想是,压缩转发树可以分为多个分支,每一个都可以被映射到一个专门的流程表,以避免规则集爆炸在一个流表。如果一个分支太大了,适合单流表,然后我们可以把它和其分支机构映射到多个流表。在理想的情况下,考虑到压缩转发树,树的每个节点可以被映射到一个专用的流表。可以由不同节点之间的边说明不同流表。此外,我们使用元数据(64位长变量OpenFlow 1.3)将信息从一个流表对其后续表。

例如,图7显示了我们如何映射压缩转发树如图6多个流表。具体来说,树的根节点srcMAC)可以被映射到一个专门的流程表,表格宽度。因为根有两个分支(由边缘节点指向贴上:01和:03和节点边贴上指出:02和:04),我们可以映射节点dstMAC表1表2,分别。同样,儿童左dstMAC节点可以被映射到一个专用的表,表操作。值得注意的是,保存表的数量;枫+ +可能几个节点映射到一个流表。例如,在图7,所有的叶子都映射到一个专门的流程表,表操作

地图压缩转发树(DAG)管道流表所示的算法2。它开始从树的根(第5行),然后遍历转发树并生成流表为每个节点通过调用函数GenerateSingleFT ()。对于每个nonleaf节点(13-23行),GenerateSingleFT ()遍历每个childrenGroup(13号线),这是一组边指向相同的压缩转发树的子节点。例如,对于转发树图7,边缘”:01”和“:03”属于相同的childrenGroup。除了边集,childrenGroup有两个其他领域:节点groupID。为每一个childrenGroup、枫木+ +为它分配一个专门的流程表,为这个节点通过调用生成流表GenerateSingleFT ()(17行)。然后,每条边的childrenGroup、枫木+ +当前流表中插入一个流动法则。流动规则匹配字段的当前节点和跳跃的流表子节点(22行)。对于每个叶(第7行),流规则插入流表表操作(第10行)。匹配的字段是寄存器值存储在积累元数据

(1) / /全局变量
(2) tableID:全局变量记录最大tableID管道。
(3) 过程GenerateFT(英尺)
(4) tableID = 0;/∗初始化。∗/
(5) GenerateSingleFT (ft.root );/∗分配一个流表,并生成规则流节点。∗/
(6) defGenerateSingleFT(节点,元数据):
(7) 如果 = =一片叶子:/∗检查节点。∗/
(8) 匹配=元数据;
(9) 优先级= 0;这个叶/∗排放规则。规则匹配寄存器值的元数据和插入在一个特定的流程表,表操作。∗/
(10) emitRule(表操作,配、优先级、node.action);
(11) 返回表操作;
(12) 其他的/∗childrenGroup是一组压缩边缘指向相同的子节点的转发树,然后呢childrenGroup.groupID是一个独特的整数。∗/
(13) 在getChildrenGroup childrenGroup(节点):
(14) tableID_t = tableID;
(15) tableID = tableID + 1;/∗保存元数据的匹配条件。∗/
(16) 元数据+ =” ”;/∗为这个孩子节点生成流表。childTableID子节点的流tableID。∗/
(17) childTableID = GenerateSingleFT (childrenGroup。节点,元数据);
(18) 在childrenGroup:
(19) =(节点相匹配。领域:edge.value);
(20) 优先级= 0;
(21) + = goto childTableID行动;/∗为每个边指向子节点,添加一个流动法则跳子节点的流程表。∗/
(22) emitRule (tableID_t、匹配、优先级、动作);
(23) 返回tableID_t;

管道和规则集生成流表如表所示1。具体,我们省略进入港口在匹配字段。每个表对应一个压缩转发树中的节点和火柴在单个包的字段。表的每个条目对应的出口边缘节点。假设一对源和目的MAC地址的包(00:00:00:00:00:01 00:00:00:00:00:11)到达开关,该算法首先走过表格宽度。然后,算法1设置的值reg01在元数据将被传递给后续流表,和(2)跳跃流动表吗表1。流表表1(1)匹配目的MAC地址的数据包,(2)设置的值reg1在元数据1中,然后(3)跳到流表表操作表操作匹配的元数据的包。

3.6。处理网络事件

在SDN编程中,它仍然是相当具有挑战性的正确和有效地处理状态依赖。把代码在图1作为一个例子。假设开关主机的访问一个并没有在protectedAP,因此数据包,发送或接收从主机一个被转发的最短路径。然后,一位经理手动切换到补充道protectedAP一些安全原因。只是迫使后续流动路线通过安全的路径是远远不够,因为规则插入到开关之前经理增加开关protectedAP还需要被删除。

一般来说,有两种方法在处理状态依赖。(1)天真的方法是简单地冲洗流表通过删除所有的规则时安装网络状态改变。这种方法直观、容易实现。然而,它是低效的,因为它可能会导致假阳性问题并导致不必要的re-executions生成流的规则。(2)另一种方法是为程序员提供订阅api允许他们启用状态相关的编程。例如,每当一个程序访问环境数据(例如,网络拓扑结构或全局变量),它需要注册的数据存储。然后,当数据发生变化时,系统运行时将自动重新运行程序和更新退休流规则。自从程序可以注册访问一个特定的部分数据,这种方法能准确地去除影响流规则不碰别人。这种方法是有效的。然而,很难使用,因为它是程序员的责任来处理识别依赖数据的复杂性和订阅数据存储。

基于现有的两个方法,枫+ +使效率和易于使用的特性,利用programmer-oblivious订阅/通知策略。具体来说,枫+ +运行时采用正常订阅/通知策略。基础上,枫+ +提供(1)包装器的数据结构,包括原始数据结构除了隐式订阅功能和(2)包装器函数调用,包括原始函数调用和隐含的订阅功能。因此,在枫+ +,程序员使用包装器函数和数据结构编程没有订阅数据存储。是枫c++运行时的责任自动登记流规则生成数据访问。同时,模块环境信息的收集负责接收网络事件,分类,通知不同的模块重新运行和更新退休流程规则。

4所示。实验

在本节中,我们证明了枫+ +提高端到端性能和编程经验在现有SDN控制器通过(1)生成紧凑的转发规则流的最先进的开关表管道设计和(2)更新退休自动转发规则。枫+ +目前作为一个组件实现Ryu [12]。我们选择Ryu因为它是基于组件和开源。值得注意的是,枫+ +也可以实现其他控制器。我们的实现的枫+ +包含1100行Python代码。组件(如OpenFlow 1.3实现中,枫+ + Ryu重用的实现。

4.1。实验设置

我们戴尔R730服务器上运行的控制器。服务器配备两个Intel Xeon e5 - 2609处理器,每个由8个CPU内核运行在1.7 GHz的最大速度。每个CPU核心有一个32 kB L1缓存数据,一个32 kB L1缓存指令,和一个256 kB的L2缓存。所有的8核在同一模分享20 MB L3缓存之一。两个处理器通过两个连接QPI链接6.4 GT / s。服务器使用128 GB DDR4记忆。服务器运行一个Ubuntu 16.04系统与64位的Linux内核版本4.4.0。

(部分进行比较实验4.24.3),我们评估所有控制器通过使用Open vSwitch 1.3.4 (ov)和OpenFlow版本。对实验测量枫+ +的性能(部分4.4),我们使用两个惠普ProCurve 5412 zl开关。

4.2。利用管道流表的影响

在本节中,我们比较了规则集生成的枫木+ +对那些由其他控制器生成强调利用先进的流表的影响管道设计开关。我们选择四个广泛使用的控制器,包括OpenDaylight(光延迟线),照明灯,枫树,痘。光延迟线和照明灯种工业开发的开源控制器,形成商业系统的基础,而枫和痘是学术系统。

我们运行SDN程序secure-or-shortest-forwarding(如图1在每个控制器)。我们选择这个项目,因为它非常简单,可以在每个控制器实现与小修改。在实验中,我们执行一个所有ping主机。然后我们记录每平的往返时间(RTT),然后安装在开关计数OpenFlow规则。

2列出主机模拟(列的数量#主机),使用流表(列的数量使用#表),生成的规则数量(列#规则),平均萍RTT(列地中海RTT (ms)。为每个控制器)。80主机的数量是固定的,这是足够的模拟用例的一个小的企业网络。我们观察到使用80台主机时,枫+ +生成只有162条规则,这是29 - 116倍小于其他控制器生成的规则。

规则压缩在枫+ +是由于硬件的利用率管道流表。列使用#表表明,枫+ +利用12硬件流表建立一个复杂的管道,这从根本上防止爆炸规则集。从理论上讲,枫+ +生成近似 规则。相比之下,对方控制器生成近似 规则。

内河货运地中海。介绍了每个控制器的往返时间。值得注意的是,枫+ + RTT的中位数并不能提高在这个实验中,因为只有80台主机模拟,因此生成的规则集可以驻留在硬件流表即使一个流表使用。然而,随着主机数量的增加,规则集生成的其他控制器可能会爆炸,因此必须经常赶出硬件流表,导致非常大的RTT。我们在接下来的实验证明了这一点。

强调流表的好处避免流表中管道爆炸,我们比较枫+ +与其他控制器通过改变网络中主机的数量。从枫,光延迟线,照明灯和痘都有类似的趋势,我们只显示结果的照明灯和枫+ +图8具体性。请注意,图的横轴的规模8对数。图8表明,随着系统中主机数量的线性增加,流枫+ +生成的规则的数量也会增加线性约40至462主机的数量从20增加到320人。相比之下,由泛光灯的规则数量达到100000,这太大了,被部署在一个真正的开关。值得注意的是,在这个实验中,我们使用Open vSwitch是基于软件的,因此其容量是“无限。然而,“生产硬件流表的大小是有限的。例如,惠普5612 zl开关只能支持1500硬件和64000年规则。这意味着如果一个程序员想要实现良好的性能,OpenFlow规则生成的控制器的数量必须小于1.5 K。否则,交换机的转发性能急剧恶化。

4.3。快速修复系统状态的变化

现在我们评估的有效性枫+ +康复系统状态的变化。具体地说,这个实验侧重于网络故障,这是意想不到的,关键,很难处理。我们评估控制器使用三个拓扑:“线性”,“广场”和“FatTree”[16]。线性拓扑包含4个开关。拓扑是一个小广场环拓扑4开关。FatTree拓扑包含20每边开关,开关和两个主机

在实验中,我们删除一个链接从网络来模拟一个链接失败。然后,我们测量时间完成所有主机之间ping。枫+ +,一旦环境信息的收集模型接收链路失败消息,立即通知枫c++运行时系统进而重播“programmer-defined”功能注册数据存储。相比之下,其他控制器,程序员需要实现一个函数负责清理规则和安装新的退休。光延迟线和痘,除此之外,所有的转发规则必须手动删除,因为没有办法识别受影响的流规则。因为枫类似的趋势作为照明灯,我们只显示照明灯的结果。同样的,因为光延迟线类似的趋势作为水痘,我们只显示痘的结果。

9表明,枫+ +提供了实质性的改善康复在所有拓扑连接失败。具体地说,同时完成一个所有萍在枫+ +链接失败后是0.72秒,1.55秒和2.03秒,三个拓扑。结果是竞争照明灯,比控制器基于痘和光延迟线。痘和光延迟线执行差因为他们冲流表收到链接失败消息,导致假阳性问题和部队控制器重新计算每流规则。值得注意的是,枫的原因+ +不执行比泛光灯是枫+ +来更新多个流表由于其流表管道设计。这个瓶颈可以被允许枫+ +验算和更新多个并行流表。我们离开这个优化未来的工作。

4.4。枫+ +在现实网络

在本节中,我们在一个真正的网络部署枫+ +,显示生成的流程表,并讨论我们已经学到了教训。一个简化的拓扑网络如图10。本地网络包括两个正常开关(开关1开关3)和两个惠普5012 zl OpenFlow开关(开关2开关4)。所有的四个开关通过1 Gbps链接联系在一起。之间的联系开关2开关4和之间的联系开关1开关4是安全的路径。然而其他的链接是不安全,因为它可能存在恶意交换机之间的这些链接。我们假设开关1是在secureAP列表,而其他开关。每个开关由两个主机连接。例如,开关1连接到两台主机,主机1主机2。这两个主机的IP地址是“10.0.0.1”表示,“10.0.0.2”,分别。为了简化规范,我们假设的MAC地址主机1主机2“00:00:00:00:00:01”(做空:01)和“00:00:00:00:00:02”(做空:02),分别。此外,我们假设主机的MAC地址与绿色复选标记recognizedHost。数据包从其他主机应该下降。

为了演示枫+ +是如何工作的,我们部署secure-or-shortest-forwarding程序如图1并选择开关2作为一个例子。具体,我们省略入口点在匹配字段。最初,这个开关的流表是空的。然后,第一次当主机3要连接到主机6,PACKET_IN消息发送从开关控制器,进而调用secure-or-shortest-forwarding程序,然后再插入一个规则到开关指示开关因为阻止后续的数据包主机6一直没有得到人们的认识。同样,当第一次主机3主机5想互相连接,控制器调用secure-or-shortest-forwarding程序,然后再插入开关2和开关3规定,允许连接通过最短路径。相反,如果主机3要连接到主机1,路由路径必须 因为开关1是在secureAP,因此涉及主机后面的所有连接开关1必须通过安全路由路径。

流表由枫+ +开关2如表所示3。表3表明,枫+ +利用四个流表开关2。具体地说,表格宽度用于匹配源MAC地址。对于网络中的每台主机,添加一个流动法则表格宽度。在实践中,压缩转发树后,流动法则可以对应于一组MAC地址。例如,第一个流动法则表格宽度可以匹配的数据包主机3主机4。第一个规则指示开关设置的值reg01在元数据然后跳表1处理传入的数据包的目的地MAC地址。第二个规则指示开关设置的值reg02在元数据然后跳表1。同样的,表1检查数据包的目的MAC地址,记录路由决定元数据通过设置字段的值reg1,然后跳跃表操作表操作检查中的值元数据然后需要行动。

3显示的大小表格宽度,表1,表2增加线性网络中主机的数量。的大小表操作线性增长的政策由程序员定义的,这通常是一个常数。总体而言,由枫树的规则数量+ +是线性的,这使得枫+ +实用SDN控制器通过阻止规则集爆炸。

流表流水线的重要性促使研究人员提供相应的高级程序设计语言。例如,在[17),提出了一种类型的编程语言称为并发NetCore指定流表。P4 [6],[7)转发模型提供可配置的流程表管道和可编程解析器。何塞et al。6]研究算法流表设计映射到特定目标交换机(18,19]。然而,这些语言需要程序员显式地指定底层流表的详细信息。

另一种类型的高级编程反应性编程(8,20.)一个控制器可以自动识别开关配置,生成流表、和填充流规则。枫(8)是一个典型的实现反应性编程。然而,枫树是专为开关与单流表。枫+ +是枫的扩展和支持流表管道开关在枫解决固有的问题。

另一个趋势在支持异构开关控制器通过提供一个统一的API。例如,MACSAD [21,22)旨在隐藏数据平面编程复杂性通过使用P4的编程语言,同时保持灵活的数据平面可移植性。TableVisor [23,24),通过提供一个透明代理层,允许管道处理,使硬件的扩展流表大小使用多个硬件开关。这些作品集中在开关,而枫+ +着重于编程语言。

6。结论和未来的工作

本文探索了一种有效的和程序员友好的SDN编程框架先进的开关与流表管道设计。我们现在的小说技术压缩规则集,并将它们映射到管道和流表显示生成的规则集是高度紧凑的各种基准测试使用模拟和真实网络的工作负载。这项工作可以优化为例,利用优先级数字生成规则。

数据可用性

项目痘、照明灯和OpenDaylight,用于支持本研究的结果,可以发现https://github.com/noxrepo/pox,http://floodlight.openflowhub.org/,http://www.opendaylight.org,分别。源代码的枫木和枫+ +正在禁运而研究成果商业化。请求源代码,12个月后发表这篇文章中,将会被相应的作者。

的利益冲突

作者宣称没有利益冲突有关这篇文章的出版。

确认

作者感谢匿名审稿人的宝贵意见帮助提高文章的质量。这项工作是支持部分由中国国家自然科学基金批准号61602264下,中国博士后科学基金会批准号2017 m611882和江苏省的主要研究和开发计划批准号BE2017743。