一种基于Hash-Trie的流规则冲突检测方法转让专利

申请号 : CN201910394863.4

文献号 : CN110120923B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 虞红芳柴林博章雨鹏孙罡

申请人 : 电子科技大学

摘要 :

本发明公开了一种基于Hash‑Trie的流规则冲突检测方法,充分考虑了流规则的生命周期,作用于流规则的下发阶段,通过在控制器和交换机之间部署中间层,拦截控制器和交换机之间交互报文来获取流规则,在不对控制器进行任何改动的情况下完成流规则的冲突检测;对流规则进行建模,利用优先级、匹配域和动作域来表达流规则,把匹配域字段拆分为精确匹配字段和范围匹配字段,为了加快流规则的匹配过程,通过引入Hash表和Trie树重构流规则的存储结构,大大缩短流规则冲突检测的时间。

权利要求 :

1.一种基于Hash-Trie的流规则冲突检测方法,其特征在于,包括以下步骤:S1、在交换机中构建存储流规则的流规则存储结构;

S2、根据控制器下发的Flow_Mod报文,进行流规则的解析并构建流规则;

S3、判断流规则存储结构是否存在该流规则所在的流表table_id;

若是,则进入步骤S4;

若否,则进入步骤S6;

S4、根据当前流规则存储结构,对该流规则进行匹配域匹配,进入步骤S5;

S5、判断匹配后的流规则是否存在冲突;

若是,则进入步骤S7;

若否,则进入步骤S6;

S6、将该流规则存储在流规则存储结构中对其进行更新,返回步骤S2;

S7、确定该流规则的冲突类型,实现流规则的冲突检测;

所述步骤S1中流规则存储结构为五级存储结构,依次包括交换机datapath_id、流表table_id、优先级、匹配域和流表项flow_id;

对于交换机datapath_id,在SDN网络中,每个交换机有唯一的交换机datapath_id,且每个datapath_id使用Hash表存储流表,在对应的Hash表中以流表table_id为键,以具体的流表对象为值;

对于流表table_id,在同一交换机中,每个流表有唯一的流表table_id;

对于优先级,所述优先级使用Hash表进行存储,在对应的Hash表中以优先级的数值为键,以具体的优先级对象为值,且每个优先级对象包括13个匹配字段;

对于匹配域,所述匹配域包括精确匹配字段和范围匹配字段;

所述精确匹配字段通过Hash表存储,在对应的Hash表中以匹配字段的值为键,以流表项flow_id构成的数组为值;

所述范围匹配字段通过Trie树存储,在对应的Trie树中,叶子节点为IP地址,中间节点为包含子网掩码的IP地址,节点所在的树高为其掩码范围,每个节点有一个属性为流表项flow_id;

对于流表项flow_id,每个流规则有唯一的流表项flow_id;

所述步骤S4具体为:

S41、确定需要进行匹配域匹配的优先级;

其中,需要进行匹配域匹配的优先级包括与流规则R优先级相同的优先级和流规则存储结构中当前流表table_id下比流规则R优先级更高的优先级;

S42、在步骤S41确定的优先级下,将流规则R与流规则存储结构中的13个匹配字段依次进行匹配;

其中,13个匹配字段包括精确匹配字段和范围匹配字段;

S43、判断匹配时流规则R的当前字段是精确匹配字段还是范围匹配字段,若是精确匹配字段,则进入步骤S44;

若是范围匹配字段,则进入步骤S45;

S44、判断该精确匹配字段是通配还是精确的数值;

若是通配,则进入步骤S44-1;

若是精确的数值,则进入步骤S44-2;

S45、判断范围匹配字段是否存在子网掩码;

若是,则进入步骤S45-1;

若否,则进入步骤S45-2;

S44-1、取出当前优先级下当前匹配字段包含的所有流表项flow_id,进入步骤S46;

S44-2、确定和当前匹配字段数值相等的流表项flow_id和当前匹配字段数值是通配的所有流表项flow_id,进入步骤S46;

S45-1、确定在Trie树的查找过程的所有流表项flow_id及其子孙节点中的流表项flow_id,进入步骤S46;

S45-2、确定在Trie树的查找过程的所有流表项flow_id,进入步骤S46;

S46、根据步骤S43-S45,对当前优先级下的13个匹配字段进行匹配域匹配后,每个匹配字段得到一个包含对应流表项flow_id的集合,对该13个集合求交集C1,进入步骤S5;

其中,交集C1中的数据为当前优先级下和流规则R在匹配域存在交集的流表项flow_id。

2.根据权利要求1所述的基于Hash-Trie的流规则冲突检测方法,其特征在于,所述步骤S2具体为:S21、对Flow_Mod报文进行解析,提取其对应的流表table_id、优先级、匹配域和动作域字段;

S22、将匹配域扩充为由13个匹配字段组成;

S23、利用优先级、扩充后的匹配域和动作域字段构建流规则;

S24、为构建的流规则分配其唯一标识流表项flow_id,完成流规则的解析。

3.根据权利要求2所述的基于Hash-Trie的流规则冲突检测方法,其特征在于,所述步骤S2中构建的流规则R为:R={P,M,A}

式中,P,M和A分别为Flow_Mod报文解析时获取的流规则的优先级、匹配域和动作域字段信息。

4.根据权利要求1所述的基于Hash-Trie的流规则冲突检测方法,其特征在于,所述步骤S5中判断匹配后的流规则是否存在冲突的方法具体为:当交集C1为空集时,当前优先级不存在有冲突的流规则,进入步骤S6;

当交集C1不为空集时,当前优先级存在有冲突的流规则,进入步骤S7。

5.根据权利要求4所述的基于Hash-Trie的流规则冲突检测方法,其特征在于,所述步骤S7中流规则冲突类型包括冗余冲突、遮蔽冲突、泛化冲突、关联冲突和交叠冲突。

6.根据权利要求5所述的基于Hash-Trie的流规则冲突检测方法,其特征在于,所述步骤S7具体为:S71、取出交集C1中的任意流规则R2;

S72、判断流规则R的匹配域是否包含于流规则R2的匹配域;

若是,则进入步骤S73;

若否,则进入步骤S76;

S73、判断流规则R的动作域和流规则R2的动作域是否相同;

若是,则流规则R与流规则R2存在冗余冲突,实现流规则冲突检测;

若否,则进入步骤S74;

S74、判断流规则R的优先级与流规则R2的优先级是否相同;

若是,则流规则R与流规则R2存在关联冲突,实现流规则的冲突检测;

若否,则进入步骤S75;

S75、当流规则R的优先级小于流规则R2的优先级时,则流规则R与流规则R2存在遮蔽冲突,实现流规则的冲突检测;

S76、判断流规则R2的匹配域是否包含于流规则R的匹配域;

若是,则进入步骤S77;

若否,则进入步骤S710;

S77、判断流规则R2的动作域与流规则R的动作域是否相同;

若是,则流规则R与流规则R2存在为冗余冲突,实现流规则的冲突检测;

若否,则进入步骤S78;

S78、判断流规则R2的优先级与流规则R的优先级是否相同;

若是,则流规则R与流规则R2存在关联冲突,实现流规则的冲突检测;

若否,则进入步骤S79;

S79、当流规则R的优先级大于流规则R2的优先级时,则流规则R与流规则R2存在泛化冲突,实现流规则的冲突检测;

S710、判断流规则R的匹配域和流规则R2的匹配域的交集是否为空;

若是,则流规则R与流规则R2不存在冲突;

若否,则进入步骤S711;

S711、判断流规则R的动作域和流规则R2的动作域是否相同;

若是,则流规则R与流规则R2存在交叠冲突,实现流规则的冲突检测;

若否,则流规则R与流规则R2存在关联冲突,实现流规则的冲突检测。

说明书 :

一种基于Hash-Trie的流规则冲突检测方法

技术领域

[0001] 本发明属于SDN网络中的流规则冲突检测技术领域,具体涉及一种基于Hash-Trie的流规则冲突检测方法。

背景技术

[0002] 近年来,随着网络流量的大规模增长和数据中心的不断扩大,传统的网络架构暴露出灵活性差、架构复杂和难以维护等问题,增加了网络建设和维护的成本。业内的企业和高效开始着手研究新的网络架构来满足未来网络发展。
[0003] 软件定义网络(SoftwareDefined Networking,SDN)的概念起源于斯坦福大学的Clean Slate项目组,NikeMiKeown教授等在2008年正式提出了OpenFlow的概念,并基于此建立了以OpenFlow协议为主的SDN网络架构。SDN网络有别于传统的网络架构,它基于控制平面和数据平面分离的思想,由统一且集中的控制平面来完成对网络的管控,网络中的交换机和路由器等网络设备只负责数据的转发。同时引入软件定义的概念,为控制平面提供丰富的编程接口,为多样化的网络管理和服务提供可扩展性。正是由于SDN网络具有的开放性、灵活性,提出之后受到了业内的广泛关注。企业和高校纷纷展开对SDN网络架构的研究。
[0004] 但是作为一种新兴的技术,SDN在带来便捷的同时,也引发了一些不容忽视的安全问题。正是由于其集中控制特点,使得针对控制平面的拒绝服务攻击成为可能,控制平面作为SDN架构的核心部分,一旦瘫痪,会对整个网络的功能造成影响。此外,SDN开放、可编程的网络接口为攻击者提供了便利。攻击者不仅能够这些接口发现控制器可能存在的安全漏洞,也利用这些接口通过开发恶意程序实施对控制平面和整个网络的攻击。控制平面中主要功能集成于控制器中,控制器本身也是软件,其本身可能存在的安全问题也会对网络安全造成影响。因此大规模商用SDN网络之前,充分研究SDN网络特别是控制平面及控制器中存在的安全问题,具有重要的意义。
[0005] 在应用平面,存在多个功能不相同的应用同时工作,应用需要下发流规则来保证其制定的策略能够得到有效的执行。多个应用同时下发的流规则时,这些流规则之间因为执行的动作不同可能存在相互冲突的现象。存在冲突的流规则导致应用制定的策略得不到有效的执行,更可能对网络的安全稳定造成影响。
[0006] 在控制平面,因为目前主流的控制器缺乏有效北向接口认证及授权机制,造成流规则的来源不可控,恶意应用也可以下发流规则故意造成流规则冲突现象发生,使得一些应用不能正常的工作。
[0007] SDN网络是流规则驱动的网络,交换机根据流表项来完成数据包的匹配和转发,控制器下发流规则完成对数据平面网元设备的控制。流规则冲突的根本原因是针对相同或者存在交集的流,不同的流规则动作域不同造成冲突问题。因此对于流规则冲突问题,基本的检测方式首先确定流规则匹配域的精确匹配字段和范围匹配字段之间的关系,然后根据匹配字段之间的关系进一步确定两条流规则匹配域之间是否存在包含关系,最后根据流规则动作域是否存在不同确定流规则是否存在冲突。为了对SDN网络中的流规则冲突问题进行检测,研究人员提出基于优先级的流规则冲突检测算法、基于转发图的流规则冲突检测算法,下面对下面相关技术进行介绍。该方法作用于流规则的生成阶段,同时需要部署在控制器内部,但是目前主流的开源控制器的开发语言和开发流程完全不相同,因此检测算法需要针对不同的控制器进行开发部署,不具备通用性。另外该方法作用于流规则的生成阶段,同时需要部署在控制器内部,但是目前主流的开源控制器的开发语言和开发流程完全不相同,因此检测算法需要针对不同的控制器进行开发部署,不具备通用性。
[0008] 另外一种基于转发图的流规则检测算法的基本思想是利用控制平面集中控制的特点来获取全局的网络拓扑,然后结合流规则的匹配域字段和动作域字段建立全局的转发拓扑图;当有新的流规则到达时,利用流规则的匹配域字段中的源目IP地址和动作域,结合现有的转发拓扑图,利用拥有相同源目IP的节点的连通性及报文转发状态,判断是否存在冲突。这种检测算法作用多作用于流规则的下发阶段。该方法在建立转发拓扑图的过程中,需要对流规则匹配域中的源目IP字段进行处理,不同的流规则包含的源目IP地址的范围不统一,在进行IP地址映射时开销比较大。同时当插入新的流规则时,转发拓扑图的更新和维护操作的成本比较高。且该方法需要结合真实的网络拓扑来建立转发拓扑图,在实际的网络环境网络拓扑可能随时变化,新的主机接入,旧的主机断开,当拓扑变化时就要对转发拓扑图进行更新和维护,大大增加了流规则检测的时间成本和算法复杂度。

发明内容

[0009] 针对现有技术中的上述不足,本发明提供的基于Hash-Trie的流规则冲突检测方法解决了上述背景技术中的问题。
[0010] 为了达到上述发明目的,本发明采用的技术方案为:一种基于Hash-Trie的流规则冲突检测方法,包括以下步骤:
[0011] S1、在交换机中构建存储流规则的流规则存储结构;
[0012] S2、根据控制器下发的Flow_Mod报文,进行流规则的解析并构建流规则;
[0013] S3、判断流规则存储结构是否存在该流规则所在的流表table_id;
[0014] 若是,则进入步骤S4;
[0015] 若否,则进入步骤S6;
[0016] S4、根据当前流规则存储结构,对该流规则进行匹配域匹配,进入步骤S5;
[0017] S5、判断匹配后的流规则是否存在冲突;
[0018] 若是,则进入步骤S7;
[0019] 若否,则进入步骤S6;
[0020] S6、将该流规则存储在流规则存储结构中对其进行更新,返回步骤S2;
[0021] S7、确定该流规则的冲突类型,实现流规则的冲突检测
[0022] 进一步地,所述步骤S1中流规则存储结构为五级存储结构,依次包括交换机datapath_id、流表table_id、优先级、匹配域和流表项flow_id;
[0023] 对于交换机datapath_id,在SDN网络中,每个交换机有唯一的交换机datapath_id,且每个datapath_id使用Hash表存储流表,在对应的Hash表中以流表table_id为键,以具体的流表对象为值;
[0024] 对于流表table_id,在同一交换机中,每个流表有唯一的流表table_id;
[0025] 对于优先级,所述优先级使用Hash表进行存储,在对应的Hash表中以优先级的数值为键,以具体的优先级对象为值,且每个优先级对象包括13个匹配字段;
[0026] 对于匹配域,所述匹配域包括精确匹配字段和范围匹配字段;
[0027] 所述精确匹配字段通过Hash表存储,在对应的Hash表中以匹配字段的值为键,以流表项flow_id构成的数组为值;
[0028] 所述范围匹配字段通过Trie树存储,在对应的Trie树中,叶子节点为IP地址,中间节点为包含子网掩码的IP地址,节点所在的树高为其掩码范围,每个节点有一个属性为流表项flow_id;
[0029] 对于流表项flow_id,每个流规则有唯一的流表项flow_id。
[0030] 进一步地,所述步骤S2具体为:
[0031] S21、对Flow_Mod报文进行解析,提取其对应的流表table_id、优先级、匹配域和动作域字段;
[0032] S22、将匹配域扩充为由13个匹配字段组成;
[0033] S23、利用优先级、扩充后的匹配域和动作域字段构建流规则;
[0034] S24、为构建的流规则分配其唯一标识流表项flow_id,完成流规则的解析。
[0035] 进一步地,所述步骤S2中构建的流规则R为:
[0036] R={P,M,A}
[0037] 式中,P,M和A分别为Flow_Mod报文解析时获取的流规则的优先级、匹配域和动作域字段信息。
[0038] 进一步地,所述步骤S4具体为:
[0039] S41、确定需要进行匹配域匹配的优先级;
[0040] 其中,需要进行匹配域匹配的优先级包括与流规则R优先级相同的优先级和流规则存储结构中当前流表table_id下比流规则R优先级更高的优先级;
[0041] S42、在步骤S41确定的优先级下,将流规则R与流规则存储结构中的13个匹配字段依次进行匹配;
[0042] 其中,13个匹配字段包括精确匹配字段和范围匹配字段;
[0043] S43、判断匹配时流规则R的当前字段是精确匹配字段还是范围匹配字段,[0044] 若是精确匹配字段,则进入步骤S44;
[0045] 若是范围匹配字段,则进入步骤S45;
[0046] S44、判断该精确匹配字段是通配还是精确的数值;
[0047] 若是通配,则进入步骤S44-1;
[0048] 若是精确的数值,则进入步骤S44-2;
[0049] S45、判断范围匹配字段是否存在子网掩码;
[0050] 若是,则进入步骤S45-1;
[0051] 若否,则进入步骤S45-2;
[0052] S44-1、取出当前优先级下当前匹配字段包含的所有流表项flow_id,进入步骤S46;
[0053] S44-2、确定和当前匹配字段数值相等的流表项flow_id和当前匹配字段数值是通配的所有流表项flow_id,进入步骤S46;
[0054] S45-1、确定在Trie树的查找过程的所有流表项flow_id及其子孙节点中的流表项flow_id,进入步骤S46;
[0055] S45-2、确定在Trie树的查找过程的所有流表项flow_id,进入步骤S46;
[0056] S46、根据步骤S43-S45,对当前优先级下的13个匹配字段进行匹配域匹配后,每个匹配字段得到一个包含对应流表项flow_id的集合,对该13个集合求交集C1,进入步骤S5;
[0057] 其中,交集C1中的数据为当前优先级下和流规则R在匹配域存在交集的流表项flow_id。
[0058] 进一步地,所述步骤S5中判断匹配后的流规则是否存在冲突的方法具体为:
[0059] 当交集C1为空集时,当前优先级不存在有冲突的流规则,进入步骤S6;
[0060] 当交集C1不为空集时,当前优先级存在有冲突的流规则,进入步骤S7。
[0061] 进一步地,所述步骤S7中流规则冲突类型包括冗余冲突、遮蔽冲突、泛化冲突、关联冲突和交叠冲突。
[0062] 进一步地,所述步骤S7具体为:
[0063] S71、取出交集C1中的任意流规则R2;
[0064] S72、判断流规则R的匹配域是否包含于流规则R2的匹配域;
[0065] 若是,则进入步骤S73;
[0066] 若否,则进入步骤S76;
[0067] S73、判断流规则R的动作域和流规则R2的动作域是否相同;
[0068] 若是,则流规则R与流规则R2存在冗余冲突,实现流规则冲突检测;
[0069] 若否,则进入步骤S74;
[0070] S74、判断流规则R的优先级与流规则R2的优先级是否相同;
[0071] 若是,则流规则R与流规则R2存在关联冲突,实现流规则的冲突检测;
[0072] 若否,则进入步骤S75;
[0073] S75、当流规则R的优先级小于流规则R2的优先级时,则流规则R与流规则R2存在遮蔽冲突,实现流规则的冲突检测;
[0074] S76、判断流规则R2的匹配域是否包含于流规则R的匹配域;
[0075] 若是,则进入步骤S77;
[0076] 若否,则进入步骤S710;
[0077] S77、判断流规则R2的动作域与流规则R的动作域是否相同;
[0078] 若是,则流规则R与流规则R2存在为冗余冲突,实现流规则的冲突检测;
[0079] 若否,则进入步骤S78;
[0080] S78、判断流规则R2的优先级与流规则R的优先级是否相同;
[0081] 若是,则流规则R与流规则R2存在关联冲突,实现流规则的冲突检测;
[0082] 若否,则进入步骤S79;
[0083] S79、当流规则R的优先级大于流规则R2的优先级时,则流规则R与流规则R2存在泛化冲突,实现流规则的冲突检测;
[0084] S710、判断流规则R的匹配域和流规则R2的匹配域的交集是否为空;
[0085] 若是,则流规则R与流规则R2不存在冲突;
[0086] 若否,则进入步骤S711;
[0087] S711、判断流规则R的动作域和流规则R2的动作域是否相同;
[0088] 若是,则流规则R与流规则R2存在交叠冲突,实现流规则的冲突检测;
[0089] 若否,则流规则R与流规则R2存在关联冲突,实现流规则的冲突检测。
[0090] 本发明的有益效果为:
[0091] (1)高效性。本发明提出的算法缩小流规则的冲突域到单个的交换机,减少了流规则比较的次数。通过构建流规则存储结构,存储结构不同层级之间利用Hash表来存储数据,利用Trie树来完成范围匹配字段(源目IP地址)的存储、查询和更新。充分利用这两种数据结构来保证不同流规则的匹配效率,缩短流规则冲突检测的时间。
[0092] (2)平台独立性。本发明提出的算法部署在控制器和交换机之间,作用于作用于流规则的下发阶段,不依赖具体的控制器,能够部署在真实或者仿真的网络环境中,具有一定的平台独立性。

附图说明

[0093] 图1为本发明中基于Hash-Trie的流规则冲突检测方法流程图。
[0094] 图2为本发明中流规则存储结构示意图。
[0095] 图3为本发明中流规则解析方法流程图。
[0096] 图4为本发明中对流规则进行匹配域匹配方法流程图。
[0097] 图5为本发明中流规则冲突类型检测方法流程图。
[0098] 图6为本发明提供的实施例汇总冲突检测部署方案示意图。

具体实施方式

[0099] 下面对本发明的具体实施方式进行描述,以便于本技术领域的技术人员理解本发明,但应该清楚,本发明不限于具体实施方式的范围,对本技术领域的普通技术人员来讲,只要各种变化在所附的权利要求限定和确定的本发明的精神和范围内,这些变化是显而易见的,一切利用本发明构思的发明创造均在保护之列。
[0100] 本发明提出的方法主要分为两个部分:流规则存储结构和流规则冲突检测两部分;流规则冲突检测过程分为流规则解析、流规则匹配和冲突类型检测三个部分;流规则存储结构是流规则冲突检测的基础,流规则匹配过程正是利用流规则存储结构中的Hash表和Trie树来快速的完成。流规则解析是在中间层接收到OpenFlow报文之后,提取报文中的有效信息,标准化流规则的匹配域字段,构成一条流规则。流规则匹配是利用流规则存储结构,针对精确匹配字段利用Hash表确定在该字段存在交叠的流规则,针对范围匹配字段利用Trie树确定在该字段存在交叠的流规则,结合上述两种求交集确定在匹配域存在包含关系的流规则。冲突类型检测是利用匹配阶段得到的流规则,结合流规则的优先级和动作域来判定流规则之间的冲突类型。
[0101] 由此,本发明提供了如图1所示的基于Hash-Trie的流规则冲突检测方法,、包括以下步骤:
[0102] S1、在交换机中构建存储流规则的流规则存储结构;
[0103] S2、根据控制器下发的Flow_Mod报文,进行流规则的解析并构建流规则;
[0104] S3、判断流规则存储结构是否存在该流规则所在的流表table_id;
[0105] 若是,则进入步骤S4;
[0106] 若否,则进入步骤S6;
[0107] S4、根据当前流规则存储结构,对该流规则进行匹配域匹配,进入步骤S5;
[0108] S5、判断匹配后的流规则是否存在冲突;
[0109] 若是,则进入步骤S7;
[0110] 若否,则进入步骤S6;
[0111] S6、将该流规则存储在流规则存储结构中对其进行更新,返回步骤S2;
[0112] S7、确定该流规则的冲突类型,实现流规则的冲突检测
[0113] 如图2所示,上述步骤S1中流规则存储结构为五级存储结构,依次包括交换机datapath_id、流表table_id、优先级、匹配域和流表项flow_id;
[0114] (1)对于交换机datapath_id,在SDN网络中,每个交换机有唯一的交换机datapath_id,且每个datapath_id使用Hash表存储流表,在对应的Hash表中以流表table_id为键,以具体的流表对象为值;
[0115] 每一个交换机都有一个唯一的datapath_id,这意味着在网络中不允许有重复id的交换机出现。在进行冲突检测时,不论是同一个应用下发不同流规则到一个交换机,还是不同的应用下发不同流规则到一个交换机,都把冲突检测的最大范围限定到一个交换机之内,即只在一个交换机内进行冲突检测。
[0116] (2)对于流表table_id,在同一交换机中,每个流表有唯一的流表table_id;当控制器下发流规则到某一个具体的流表中时,这个流表项就在该流表中生效,那么其冲突检测范围也就被限制在这个流表中。
[0117] (3)对于优先级,所述优先级使用Hash表进行存储,在对应的Hash表中以优先级的数值为键,以具体的优先级对象为值,且每个优先级对象包括13个匹配字段;
[0118] 优先级是冲突检测中重要的一部分。
[0119] 假如两个流表项相同的优先级,匹配域相同但是动作域不同,那么这两个流表项存在冲突;两个流表项有用不同的优先级,但是匹配域相同,那么无论动作域是否相同,优先级低的流表项都不会生效。这里把优先级相同的流表项放在一起。在进行冲突检测的时候,需要在优先级相同及优先级更高的流表项之间进行进行冲突检测,这样能大大减少冲突比较的次数。
[0120] (4)对于匹配域,所述匹配域包括精确匹配字段和范围匹配字段;
[0121] 所述精确匹配字段通过Hash表存储,在对应的Hash表中以匹配字段的值为键,以流表项flow_id构成的数组为值;这个匹配域的值可以是通配符,也可以是一个具体的数值。当该字段的值为通配的时候,覆盖所有的流规则;当该字段的值为具体的数值,仅覆盖拥有相同匹配字段数值的流规则。
[0122] 所述范围匹配字段通过Trie树存储,在对应的Trie树中,叶子节点为IP地址,中间节点为包含子网掩码的IP地址,节点所在的树高为其掩码范围,每个节点有一个属性为流表项flow_id;Trie树在范围匹配字段存储中常用的一种数据结构。这13个匹配字段共同构成了一个优先级对象。
[0123] (5)对于流表项flow_id,每个流规则有唯一的流表项flow_id。
[0124] 一个流规则存在一个或者多个匹配字段,在第四层每一个对应的匹配字段存储该flow_id。在进行冲突检测的时候,对每个匹配字段得到flow_id集合求交集,来确定存在冲突的流规则。
[0125] 利用五层存储结构,利用优先级关系分割流规则,相同优先级的流规则存放在一起,把每一个流规则的匹配域拆分为13个匹配字段,字段数值为空代表该字段通配,把flow_id按照字段值放入到对应的匹配字段当中去。通过优先级的分割,通过比较相同优先级和更高优先级流表项之间的冲突,减少比较次数。通过匹配域的拆分,方便确定各个匹配字段之间的关系,有利于进行冲突关系的确定,利用唯一的flow_id来确定存在冲突的流表项。流表项存储结构的变更是冲突检测算法进行的重要一环。
[0126] 在上述步骤S2中,当接收到Flow_Mod消息的时候,如果消息类型是OFPFC_ADD时,即控制器向交换机下发新的流规则的时候,执行如图3所示的流规则解析过程:
[0127] S21、对Flow_Mod报文进行解析,提取其对应的流表table_id、优先级、匹配域和动作域字段;
[0128] 这个过程完成Flow_Mod报文的解析,OpenFlow协议规范定义了Flow_Mod报文的各个字段,需要从报文中读取table_id、优先级Priority、匹配域Match、动作域Action这四个字段。其中table_id字段决定了这条流规则属于哪一个流表,优先级Priority、匹配域Match、动作域Action构成一条流规则的三个要素,方便流规则的建模。
[0129] S22、将匹配域扩充为由13个匹配字段组成;
[0130] 匹配域由为OpenFlow1.3强制支持的13个匹配字段构成,但是每一条流规则包含的匹配域字段可能存在不同,因此需要标准化流规则的匹配域字段,统一扩充为由13个匹配字段构成的匹配域。对于原匹配域中存在的字段保留其值,对于原匹配域中不存在的字段把其值设置为通配。
[0131] S23、利用优先级、扩充后的匹配域和动作域字段构建流规则;
[0132] S24、为构建的流规则分配其唯一标识流表项flow_id,完成流规则的解析。
[0133] 上述步骤S2中构建的流规则R为:
[0134] R={P,M,A}  (1)
[0135] 式中,P,M和A分别为Flow_Mod报文解析时获取的流规则的优先级、匹配域和动作域字段信息。
[0136] 在OpenFlow的白皮书中定义了OpenFlow流表项的格式,每一个流表项可以看作一条流规则,由匹配域、优先级、计数器、定时器、动作域构成。计数器和定时器在进行流规则冲突检测时作用不大,因此每一个流规则可以描述为优先级、匹配域、动作域三部分组成,可以形式化描述为式(1);
[0137] 针对优先级,使用字母P来表示,在OpenFlow协议中优先级的取值范围为0-65535,数值越大代表优先级越高。
[0138] 针对匹配域,考虑到协议规定,这里采用OpenFlow强制支持13元组作为匹配域的匹配字段。这些匹配字段可以分为两类,一类是精确匹配字段,一类是范围匹配字段。精确匹配字段包含:IN_PORT、ETH_DST、ETH_SRC、ETH_TYPE、IP_PROTO、TCP_SRC、TCP_DST、UDP_SRC、UDP_DST,这些字段的数值存在要么是一个精确的数值,要么是一个通配符,必须注意的是在同一匹配字段下通配符匹配范围要大于一个精确的数值。
[0139] 范围匹配字段包含:IPV4_SRC、IPV4_DST、IPV6_SRC、IPV6_DST,这些字段的数值可以是一个精确的IP地址如10.0.1.1,可以是一个IP地址范围如10.0.1.1/24,也可以是通配符“*”,显而易见的是在统一的IP范围内,三种情况的覆盖IP地址范围为:“*”>“10.0.1.1/24”>“10.0.1.1”,即通配符的范围>点分十进制带掩码的IP地址>精确的IP地址。范围匹配字段的匹配范围存在交叠,这是进行冲突检测必须考虑的问题。
[0140] 针对动作域字段,在OpenFlow协议中定义了多种的操作类型,不同的流表项可以拥有完全不同的动作域描述,在比较两个流规则的时候直接对两个流表项的动作域字段进行比较,存在不同即不同,没有更复杂的情况。
[0141] 在上述步骤S3中,当接收到一条新的流规则时,首先要检测这条流规则的流表table_id是否存在,如果table_id不存在,那么就不需要进行冲突检测,直接存储流规则。table_id不存在意味着这条流规则需要比较的冲突域不存在,因为一条流规则想要生效必须存在于某一确定的流表中。按照流规则的存储结构直接存储这条流规则,用于后续流规则的比较。如果table_id存在,就需要进行冲突检测,进行后续步骤。
[0142] 如图4所示,上述步骤S4具体为:
[0143] S41、确定需要进行匹配域匹配的优先级;
[0144] 其中,需要进行匹配域匹配的优先级包括与流规则R优先级相同的优先级和流规则存储结构中当前流表table_id下比流规则R优先级更高的优先级;
[0145] 当进行当前流表table_id下比流规则R优先级更高的优先级下的匹配域匹配时,需要根据优先级高低依次进行匹配域匹配。
[0146] S42、在步骤S41确定的优先级下,将流规则R与流规则存储结构中的13个匹配字段依次进行匹配;
[0147] 其中,13个匹配字段包括精确匹配字段和范围匹配字段;
[0148] 在匹配过程中要依次比较每一个匹配字段,因为匹配域一共拥有13个匹配字段,这些匹配字段分为精确匹配字段和范围匹配字段。
[0149] S43、判断匹配时流规则R的当前字段是精确匹配字段还是范围匹配字段,[0150] 若是精确匹配字段,则进入步骤S4 4;
[0151] 若是范围匹配字段,则进入步骤S45;
[0152] S44、判断该精确匹配字段是通配还是精确的数值;
[0153] 若是通配,则进入步骤S44-1;
[0154] 若是精确的数值,则进入步骤S44-2;
[0155] S45、判断范围匹配字段是否存在子网掩码;
[0156] 若是,则进入步骤S45-1;
[0157] 若否,则进入步骤S45-2;
[0158] S44-1、取出当前优先级下当前匹配字段包含的所有流表项flow_id,进入步骤S46;因为这个字段是通配,那么它能覆盖所有的流表项flow_id;
[0159] S44-2、确定和当前匹配字段数值相等的流表项flow_id和当前匹配字段数值是通配的所有流表项flow_id,进入步骤S46;
[0160] 如果当前字段是精确的数值,那它对应的流表项flow_id包括两个部分,因此需要分别确定和当前匹配字段数值相等的流表项flow_id和当前匹配字段数值是通配的所有流表项flow_id;这是因为数值相等代表两条流规则在该匹配字段相等,字段值为通配代表两条流规则在该字段存在包含关系,准确值是通配的子集,这样就能覆盖和流规则R在当前匹配字段存在相等或者包含关系的所有flow_id。
[0161] S45-1、确定在Trie树的查找过程的所有流表项flow_id及其子孙节点中的流表项flow_id,进入步骤S46;
[0162] 针对存在子网掩码的情况,需要记录在Trie树的查找过程中所有遇到的flow_id,因为流规则R在该范围匹配字段为这些flow_id代表的流规则的子集;在确定流规则R所在结点之后,需要记录该结点中所有子结点中存在的flow_id,这些flow_id在该范围匹配字段是流规则R的子集。
[0163] S45-2、确定在Trie树的查找过程的所有流表项flow_id,进入步骤S46;
[0164] 如果不存在子网掩码,只需要记录在查询过程遇到的所有flow_id即可,因为流规则R在该范围匹配字段为这些flow_id代表的流规则的子集。
[0165] S46、根据步骤S43-S45,对当前优先级下的13个匹配字段进行匹配域匹配后,每个匹配字段得到一个包含对应流表项flow_id的集合,对该13个集合求交集C1,进入步骤S5;
[0166] 其中,交集C1中的数据为当前优先级下和流规则R在匹配域存在交集的流表项flow_id。
[0167] 针对步骤S45中的范围匹配字段,在存储结构中采用的是Trie树这种数据结构,每一个flow_id存储在Trie树的一个结点,在范围匹配字段的冲突检测过程就演变为Trie树的查找过程。如果是IPv4地址,最多经过32次比较就能得到查询结果。冲突检测需要能够确定所有在范围匹配字段和流规则R存在交集的flow_id。范围匹配字段如果存在子网掩码代表这个字段代表一个IP地址范围,不存在代表字段为一个确定的IP地址。
[0168] 上述步骤S5中在经过匹配域匹配过程之后,一个优先级的所有13个匹配字段,每一个匹配字段都能得到一个包含flow_id的集合,然后对这13个集合求交集,就能够得到在当前优先级下和流规则R在匹配域存在交集的flow_id。如果交集为空,则代表在当前优先级下不存在冲突的流规则,就把流规则R放到存储结构中;在得到这些在匹配域存在交集的flow_id之后,就需要进行冲突类型检测。
[0169] 因此,判断匹配后的流规则是否存在冲突的方法具体为:
[0170] 当交集C1为空集时,当前优先级不存在有冲突的流规则,进入步骤S6;
[0171] 当交集C1不为空集时,当前优先级存在有冲突的流规则,进入步骤S7。
[0172] 上述步骤S7中流规则冲突类型包括冗余冲突、遮蔽冲突、泛化冲突、关联冲突和交叠冲突;每一种冲突类型都有不同的判断标准。利用这些判断标准结合上文中得到的flow_id集合,判断存在的冲突类型。
[0173] 如图5所示,上述步骤S7具体为:
[0174] S71、取出交集C1中的任意流规则R2;
[0175] S72、判断流规则R的匹配域是否包含于流规则R2的匹配域;
[0176] 若是,则进入步骤S73;
[0177] 若否,则进入步骤S76;
[0178] S73、判断流规则R的动作域和流规则R2的动作域是否相同;
[0179] 若是,则流规则R与流规则R2存在冗余冲突,实现流规则冲突检测;
[0180] 若否,则进入步骤S74;
[0181] S74、判断流规则R的优先级与流规则R2的优先级是否相同;
[0182] 若是,则流规则R与流规则R2存在关联冲突,实现流规则的冲突检测;
[0183] 若否,则进入步骤S75;
[0184] S75、当流规则R的优先级小于流规则R2的优先级时,则流规则R与流规则R2存在遮蔽冲突,实现流规则的冲突检测;
[0185] S76、判断流规则R2的匹配域是否包含于流规则R的匹配域;
[0186] 若是,则进入步骤S77;
[0187] 若否,则进入步骤S710;
[0188] S77、判断流规则R2的动作域与流规则R的动作域是否相同;
[0189] 若是,则流规则R与流规则R2存在为冗余冲突,实现流规则的冲突检测;
[0190] 若否,则进入步骤S78;
[0191] S78、判断流规则R2的优先级与流规则R的优先级是否相同;
[0192] 若是,则流规则R与流规则R2存在关联冲突,实现流规则的冲突检测;
[0193] 若否,则进入步骤S79;
[0194] S79、当流规则R的优先级大于流规则R2的优先级时,则流规则R与流规则R2存在泛化冲突,实现流规则的冲突检测;
[0195] S710、判断流规则R的匹配域和流规则R2的匹配域的交集是否为空;
[0196] 若是,则流规则R与流规则R2不存在冲突;
[0197] 若否,则进入步骤S711;
[0198] S711、判断流规则R的动作域和流规则R2的动作域是否相同;
[0199] 若是,则流规则R与流规则R2存在交叠冲突,实现流规则的冲突检测;
[0200] 若否,则流规则R与流规则R2存在关联冲突,实现流规则的冲突检测。。
[0201] 上述过程流规则之间匹配域的关系为先决条件,结合流规则之间优先级和动作域的关系,确定流规则之间的冲突类型。
[0202] 在本发明的一个实施例中,本发明方法的部署方案如图6所示,从上至下由控制器及应用、冲突检测算法、底层网络三部分组成。冲突检测算法部署在控制器和底层网络之间,使用TCP连接代理的方式拦截底层网络和控制器之间的通信。控制器及应用可以是主流的开源控制器Floodlight、ONOS、OpenDaylight、Ryu等中任意一款,底层网络可是使用Mininet进行仿真搭建,也可以部署真正的SDN网络。
[0203] 冲突检测算法一直监听来自交换机的TCP连接,当有交换机连接到达时,就创建另外一个TCP连接到控制器,这样就构成了一对上行和下行的TCP连接。其中的任意一个连接中断,这对连接就会中断。所以当底层网络中拥有N个交换机的时候,冲突检测框架就会创建2N个连接,来完成TCP代理,实现控制器和交换机正常的报文交互。
[0204] 在冲突检测算法中每一个交换机对应唯一的datapath_id,维持一对TCP连接,为每一个交换机建立如图2所示的流规则存储结构,当拦截到控制器和交换机之间的Flow_Mod报文的时候,通过解析Flow_Mod报文得到流规则,执行报文的解析过程,获取流规则的优先级、匹配域、动作域等各个字段,然后在流规则的存储结构完成流规则匹配过程,确定存在冲突流规则及其flow_id,最后进行冲突检测确定冲突流规则之间的冲突类型。
[0205] 本发明针对存在多个应用时的流规则冲突问题,主要提出了一下新的检测方案:
[0206] (1)充分考虑了流规则的生命周期,作用于流规则的下发阶段,通过在控制器和交换机之间部署中间层,拦截控制器和交换机之间交互报文来获取流规则,在不对控制器进行任何改动的情况下完成流规则的冲突检测,具有一定的平台独立性和通用性。
[0207] (2)充分分析流规则的作用机制,细化流规则的冲突作用域,把流规则的冲突检测过程限制在单个交换机对象(在中间层创建)中,通过在每个交换机对象部署检测算法,完成所有流规则的冲突检测。
[0208] (3)充分分析OpenFlow协议,对流规则进行建模,利用优先级、匹配域和动作域来表达流规则,把匹配域字段拆分为精确匹配字段和范围匹配字段。为了加快流规则的匹配过程,通过引入Hash表和Trie树重构流规则的存储结构,大大缩短流规则冲突检测的时间。
[0209] 本发明的有益效果为:
[0210] (1)高效性。本发明提出的算法缩小流规则的冲突域到单个的交换机,减少了流规则比较的次数。通过构建流规则存储结构,存储结构不同层级之间利用Hash表来存储数据,利用Trie树来完成范围匹配字段(源目IP地址)的存储、查询和更新。充分利用这两种数据结构来保证不同流规则的匹配效率,缩短流规则冲突检测的时间。
[0211] (2)平台独立性。本发明提出的算法部署在控制器和交换机之间,作用于作用于流规则的下发阶段,不依赖具体的控制器,能够部署在真实或者仿真的网络网络环境中,具有一定的平台独立性。