一种高性能的OpenFlow虚拟流表查找方法与流程

文档序号:17985311发布日期:2019-06-22 00:22阅读:1315来源:国知局
一种高性能的OpenFlow虚拟流表查找方法与流程

本发明涉及一种openflow虚拟流表查找方法,尤其涉及一种高性能的openflow虚拟流表查找方法。



背景技术:

网络虚拟化通过软硬件解耦以及功能抽象,使网络功能不再依赖于专用硬件,硬件资源可以充分灵活共享,实现新业务的快速开发和部署,能有效解决现有网络体系的僵化问题,被普遍认为是构建下一代网络的关键技术。openflow协议是目前应用最广泛的南向接口协议之一,它将网络协议栈扁平化,将各层网络协议首部的重要字段作为流表项的匹配域,并支持通配符实现任意字段的组合,从而实现网络流的细粒度灵活管理。openflow虚拟交换机也因成本低、配置灵活、便于调度部署,已广泛应用于各类云环境中,尤其是云数据中心。

openflow虚拟交换机通常运行在通用pc((personalcomputer,个人计算机)上,往往采用sram和dram等地址寻址存储器存储openflow流表。由于openflow引入通配符,使得流表查找无法直接使用哈希表等传统的高效查找方式。目前主流的openflow虚拟交换机采用元组空间搜索法(tss),将所有规则按照各字段前缀长度的组合划分成比规则数目小得多的元组集合,然后在这些元组里进行哈希查找。元组(即流表)由具有相同字段前缀的流规则(即流表项)组成,并通过与匹配字段一一对应的掩码加以标识。

对于每个到达的数据包,openflow虚拟交换机依据其匹配字段组成的流标识符,逐个探测掩码,即将流标识符与对应的掩码进行与运算,然后在对应的流表中查找匹配流表项,进而实现数据包的转发处理。由于每个数据包通常最多成功探测一个掩码,而探测成功前每次探测掩码都会失败,需要查找遍历流表。因此,数据包的流表查找开销很大,严重制约openflow虚拟交换机的包分类速度。

openflow虚拟交换机由于采用纯软件交换方式,当进入实际大规模部署时,将面临着严重的数据转发性能瓶颈,而openflow流表查找是影响数据转发性能的关键环节之一。

如图1所示的openflow虚拟交换机的流表查找过程:openflow虚拟交换机每收到一个数据包时,首先解析其各层协议首部,提取其中的关键字段,并计算流标识符fid。然后,依次探测掩码数组中的每个掩码,即将流标识符fid与掩码进行与运算,得到关键字keyi,进而在流表中查找对应的流表项。如果查找成功,则执行对应流表项中的动作集,并进行更新处理。如果查找失败,则探测下一个掩码。若所有掩码探测失败,则该数据包封装成流安装请求发送给sdn控制器,等待sdn控制器下发对应的流规则,以便处理数据包,并更新流表。

在上述流表查找过程中,每个数据包都需要逐个探测掩码查找流表,直到成功探测某个掩码或者所有掩码探测完毕为止。这就是说,数据包在成功探测到一个掩码之前,所有的掩码探测均会失败,需要反复查找遍历流表,导致流表查找开销大。更为严重的是,当openflow虚拟交换机部署在高速网络中时,网络数据包流异常密集。例如:当网络流量达到千兆级时,每秒到达的数据包个数可达百万级。这导致openflow虚拟交换机的流表查找开销极大,迫切需要加以优化。

目前,openflow虚拟交换机的流表查找优化方案主要包括:掩码缓存机制、mtf掩码启发策略、cbf查找过滤方法。这三种优化方案的原理步骤分别介绍如下。

【方案一】掩码缓存机制

在openflow虚拟交换机中,缓存技术可用于绕过掩码探测过程,加快流表查找,提高包分类性能。pfaff等人在开发开源虚拟交换机openvswitch时,将带通配符且无优先级的宏流缓存在内核模块中,使得大多数包只需在内核态进行流表查找。同时,设计微流缓存将单向传输连接映射到相匹配的掩码,使得缓存连接中的数据包直接定位出对应的掩码。在此基础上,傅明等人在缓存中增加访问时间字段,每次进行缓存替换时选择最近最久未访问的缓存项,从而使活跃连接尽可能保留在缓存中,提高了缓存命中率。类似地,congdon等人利用网络流量局部性,为每个端口设置包签名与流关键字之间的映射缓存,预测包分类结果,从而使大部分数据包绕过流表查找过程。这些缓存方案的工作原理如图2所示。

当一个数据包到达openflow虚拟交换机时,上述掩码缓存机制的工作步骤如下:(1)首先提取关键字段,并计算流标识符fid,然后将fid经哈希运算得到32位签名fid_hash;(2)将fid_hash按字节分解成4个字段,分别作为掩码缓存(含256条缓存项)的索引值,读取4个缓存项,进而判断数据包签名fid_hash是否与缓存项中的连接签名fid_hashi是否相等;(3)若某条缓存项中的连接签名fid_hashi与数据包签名fid_hash相等,则根据缓存项中的掩码索引值mask_indexi到掩码数组中读取对应的掩码maski,然后将fid与maski进行与运算得到关键字keyi,进而在流表中进行哈希查找,否则执行步骤(5);(4)若流表查找成功匹配某条流表项,则执行其中的动作集,并更新流表项字段和对应的缓存项,至此流表查找结束,转入后续分组处理流程,否则执行步骤(5);(5)依次探测掩码数组中的每个掩码,即将流标识符fid与当前探测的掩码maski进行与运算得到关键字keyi,进而到流表中进行哈希查找。若流表查找成功,即成功匹配某条流表项,则执行其中的动作集,并更新流表项字段,最后将包签名fid_hash、掩码索引值、包到达时间写入对应4个缓存项中最久没有被访问命中的那项;(6)若所有掩码探测完毕仍没有找到一条流表项,则将数据包封装成packet-in消息发送给sdn控制器进行处理。

【方案二】mtf掩码启发策略

在openflow虚拟交换机中,掩码探测过程带来了繁重的流表查找开销,迫切需要加以优化。针对网络数据包流到达后探测访问掩码不均衡的特点,姜腊林等人设计掩码启发策略,将掩码数组调整为掩码链表,进而运用移至最前mtf(move-to-front)启发法,在每次成功探测某个掩码时,将掩码移到掩码链表的最前面,从而加快后续数据包的掩码命中速度。该优化方案的工作原理如图3所示。

当一个数据包到达openflow虚拟交换机时,上述掩码启发策略的工作步骤如下:(1)首先提取关键字段,并计算流标识符fid;(2)依次探测掩码链表中的每个掩码maski,即将流标识符fid与当前掩码maski进行与运算,得到关键字keyi,进而在流表中进行哈希查找;(3)若流表查找成功,即成功匹配某条流表项,则执行其中的动作集,并更新流表项字段,然后将成功探测的掩码移动到掩码链表的链头位置,至此流表查找结束,转入后续分组处理流程;(4)若所有掩码探测完毕仍没有找到一条流表项,则将数据包封装成packet-in消息发送给sdn控制器进行处理。

【方案三】cbf查找过滤方法

布鲁姆过滤器bf(bloomfilter)常用于实现成员从属关系的快速查询,可用于加快openflow虚拟交换机中的包分类速度。mchale等人采用概率型数据结构bloomfilter对网络流量进行预分类,将已知/合法流量从未知/恶意流量中分离出来,显著减少攻击流量的影响。袁东明等人设计了一个带有两次验证哈希表的掩码并行布鲁姆过滤器mpbf,采用掩码向量表示每个字段对应的子布鲁姆过滤器状态,实现了多协议查询的灵活性,降低了mpbf的假阳性错误率。赵锦元等人将数据包的流表查找操作抽象为流标识符和流表的从属关系判定问题,进而应用计数型布鲁姆过滤器cbf(countingbloomfilter)直接判定出流表查找失败结果,从而绕过对应的流表遍历过程。这些方案的工作原理如图4所示。其中,cbf过滤器是m个计数器(初始值为0)组成的向量c,使用k个独立的哈希函数h1,h2,…,hk,对应流表f={f1,f2,…,fn}中的关键字集合。

当一个数据包到达openflow虚拟交换机时,上述查找过滤机制的工作步骤如下:(1)首先提取关键字段,并计算流标识符fid;(2)依次探测掩码链表中的每个掩码maski,即将流标识符fid与当前掩码maski进行与运算,得到关键字keyi;(3)计算关键字keyi的k个哈希值h1(keyi),h2(keyi),…,hk(keyi)索引到计数器数组,进而判断对应的k个计数器c[h1(keyi)],c[h2(keyi)],…,c[hk(keyi)]是否有一个取值为0;(4)若有一个为0,则可确定掩关键字keyi不在流表中,直接转入探测下一个掩码maski+1;(5)若k个计数器均不为0,则需要进一步查找流表。若流表查找成功,即成功匹配某条流表项,则执行其中的动作集,并更新流表项字段,至此流表查找结束,转入后续分组处理流程。若流表查找失败,则同样转入探测下一个掩码maski+1;(6)若所有掩码探测完毕仍没有找到一条流表项,则将数据包封装成packet-in消息发送给sdn控制器进行处理。

但是现有的上述openflow虚拟交换机的流表查找优化方案分别存在如下缺点:

【方案一】缓存连接签名和掩码索引值的映射关系,虽然使得缓存连接中的数据包可以直接找到对应的掩码,而无需逐个探测掩码。然而,该方案每次将未缓存的当前连接直接换入缓存,使得缓存经过一系列访问后装载最近被访问的连接,但不一定是包含大量数据包的活跃连接,从而导致缓存命中率不高。

【方案二】运用移至最前mtf(move-to-front)启发法,虽然在每次成功探测某个掩码时,将掩码移到掩码链表的最前面,以期望减少后续数据包的掩码探测次数。然而,对于那些不活跃的掩码,当对应的流表项有数据包到达时,mtf启发法将使得不活跃掩码直接移到掩码链表的靠前位置,而活跃掩码将会被挤到靠后位置。这将导致活跃掩码对应的后续数据包需要更多的掩码探测次数,流表查找开销大。

【方案三】针对掩码探测过程中流表查找多数会失败的情形,应用计数型布鲁姆过滤器cbf快速判定出流表中没有数据包对应的流表项,以绕过流表查找过程。然而,cbf过滤器可能会出现假阳性错误,即cbf判定流表中有对应的流表项,但事实上没有。在cbf过滤器配置固定的情况下,随着流表项数量的不断增多,cbf假阳性误判率逐步升高,最终导致cbf判定频繁失效,查找开销不降反升。

基于以上,本发明拟提供一种高性能的openflow虚拟流表查找方法。



技术实现要素:

本发明要解决的技术问题是,提供一种高性能的openflow虚拟流表查找方法,以加快数据包的流表查找速度,提升openflow虚拟交换机的分组交换性能。

为了解决上述技术问题,本发明采用以下技术方案:

提供一种高性能的openflow虚拟流表查找方法,具体包括如下步骤:

s1、当一个数据包到达openflow虚拟交换机后,openflow虚拟交换机接收并提取其中的关键字段,进而计算其连接标识符fid,然后采用流表项缓存机制查找缓存;

若命中缓存,则直接找到对应的流表项,更新缓存项的时间字段信息;然后执行其中的动作集,并更新其字段信息;

若查找缓存失败,则进入步骤s2依次探测掩码数组;

s2、对于每次掩码探测,首先通过查找过滤方法判定掩流关键字是否不在流表中:

若判断掩流关键字可能在流表中,则进一步查找流表;若流表查找失败,则继续探测下一个掩码,直到最后一个掩码为止;

如果所有掩码探测完毕后仍未找到对应的流表项,则将数据包封装成packet-in消息发送给sdn控制器;

如果成功找到对应的流表项,则进入步骤s3;

s3、当缓存查找失败且探测掩码成功,即在流表中成功找到某个流表项时,分别判断该掩码和流表项是否进入活跃状态,即判断它们的当前数据包和最近数据包的到达时间间隔是否小于某个阈值:

当前掩码与上次命中该掩码的时间间隔小于某个阈值,则该掩码进入活跃状态,将该掩码在掩码数组中应用选择性前移一位的sma1(selectivemove-ahead-1)启发法调整对应掩码的位置,并更新对应的缓存项,然后执行对应的动作集,并更新其字段信息;

当前流表项与上次命中该流表项的时间间隔小于某个阈值,则该流表项进入活跃状态,则将该流表项加入缓存,并进行缓存查找,具体过程如下:将连接标识符fid通过哈希算法,即经过哈希函数h1得到32位签名值fid_hash,然后将签名值fid_hash平分成四段作为索引值得到4个缓存项位置,找到最近包达到时间最小的缓存项,最后将签名值fid_hash、流表项地址、当前包到达时间写入到该缓存项中。

进一步地,

步骤s1中,利用流表项缓存机制查找缓存的过程如下:

(1)首先将连接标识符fid通过哈希算法,即通过哈希函数h1(通用的哈希函数)得到32位的签名值fid_hash,将签名值fid_hash平分成四段作为索引值得到4个缓存项;

(2)然后,将签名值fid_hash与每个缓存项中的fid_hashi进行对比,若相等,则读取缓存项中的流表项地址,进而得到对应的流表项;

(3)接着,将连接标识符fid与流表项中的掩码进行与运算得到关键字mask_key,并与流表项中的流关键字key进行比较;若相等,则执行流表项中的动作集,并更新其字段信息,否则进行掩码遍历过程。

进一步地,

所述方法的步骤s2中查找过滤采用的是scbf过滤器,所述scbf过滤器是指能通过增加一个为前一个计数器数组成倍长度的新计数器数组来适应流表大小的变化的过滤器。

例如:设初始时第一个计数器数组的最佳容量大小为可计数d个流表项,当流表项数目超过d,则新增一个极限容量大小为2d的计数器数组。在含有n个计数器数组的计数器数组索引链中,若所有的计数器数组都达到了最佳容量,则新增一个最佳容量大小为(2^n)*d的计数器数组。所有的计数器数组通过计数器数组索引链相连,计数器数组索引链的每个结点中存放它所指向的计数器数组的首地址、流表项数目、最佳容量,以及该计数器数组的长度。

scbf过滤器相比传统的计数型布鲁姆过滤器cbf,当过滤器假阳性误判率增长到某个阈值,scbf通过增加一个为前一个计数器数组成倍长度的新计数器数组来适应流表大小的变化,能克服假阳性误判率会随着流表项的增加而不断增加的问题。cbf能实现过滤效果,但是不适合大规模网络的流量的动态变化。

进一步地,

所述scbf过滤器的工作流程如下:

(1)首先将关键字mask_key经过一次哈希运算,即通过哈希函数h1(通用的哈希函数)得到32位的哈希值,即h3_hash;

(2)之后获取计数器数组索引链第一个索引结点的信息,并提取到计数器数组的地址,将k个哈希函数的映射范围调整到当前计数器数组的下标范围,然后将h3_hash经过k个哈希函数计算得到k个哈希值,进而得到k个计数器;若有一个计数器中的计数为0,则继续获取下一个计数器数组的索引结点,直到k个计数器的计数都不为0或者索引链遍历完毕;若k个计数器都不为0,则流表中可能存在可匹配的流项,进行进一步查找,否则流表中一定不存在可匹配的流表项。

进一步地,

所述scbf过滤器的工作流程还包括流表插入一条新流表项时scbf过滤器的更新过程,具体如下:

首先通过哈希运算,即哈希函数h1(通用哈希函数)将下发流表项中的流关键字key转换成32位h3_hash,然后遍历计数器数组索引链,找到流表项数目小于最佳容量的计数器数组;

若找不到流表项数目小于最佳容量的计数器数组,则扩展一个新的计数器数组,并将k个哈希函数的映射范围调整到当前计数器数组的下标范围,并与h3_hash运算,进而得到k个计数器,并将每个计数器的计数加1,将对应的计数器索引结点中记录的流表项数目加1,最后在流表项结构中记录该计数器数组索引节点的地址。

进一步地,

所述scbf过滤器的工作流程还包括流表删除一条流表项时scbf过滤器的更新过程,具体如下:

首先获取流表项结构中计数器数组索引结点的地址,然后通过计数器索引结点得到计数器数组的地址,再将k个h3哈希函数的映射范围调整到当前计数器数组下标范围;

之后,将该流表项中的key经过一次哈希运算得到h3_hash,经过k个h3哈希运算之后得到k个哈希值,进而得到k个计数器;

最后,将各计数器中的计数减1,并将计数器数组索引中记录的流表项数目减1。

h3哈希函数是上述scbf过滤器更新过程的一个重要组成部分。scbf的每一个计数器数组的长度成倍递增,对应h3哈希函数映射范围成倍递增,因而需要调整k个h3哈希函数的映射范围。

为便于本文的理解和叙述,现对以下名词作出说明:

1、openflow:一种网上通信协议,属于数据链路层,能够控制网上交换器或路由器的转发平面(forwardingplane),借此改变网上数据包所走的网上路径。

2、sram:静态随机存取存储器,英文全称staticrandom-accessmemory,简称sram。

3、dram:动态随机存取存储器,英文全称dynamicrandomaccessmemory,简称dram。

4、软件定义网络:sdn(softwaredefinednetworking)是一种数据控制分离、软件可编程的新型网络体系架构,其基本架构分为三层,应用层,控制层和转发层。控制层是由sdn控制器群构成,转发层是由sdn交换机群构成。控制层与转发层之间数据交互遵循的协议为南向协议。著名的南向协议为openflow,因此遵循openflow协议的sdn控制器又称为openflow控制器,遵循openflow协议的sdn交换机又称为openflow交换机。

5、openflow虚拟交换机:简称ovs,ovs主要的定位是一个高质量、多层虚拟交换机。它通过编程扩展支持大规模网络自动化,同时支持标准的管理接口和协议。ovs的架构主要分为:ovsdb-server,ovs的数据库服务器,用来存储ovs的配置信息;ovs-vswitchd,ovs的核心模块;ovskernelmodule:ovs内核模块,处理包交换和隧道,缓存flow。其中每条流规则由一系列字段组成,分为基本字段、条件字段和动作字段三部分。

6、openflow流表:openflow控制器通过部署流表至openflow交换机中用来指导数据平面流量的查询与转发。在openflow1.0版本中,每个openflow交换机找那个只有一张流表,这张流表中存储着许多流表项,每一条流表项都表征了一条网络数据流和其对应的处理方法—动作表。当网络分组进入openflow交换机中,若其符合某条表项的特征,则可以按照对应的动作进行转发。openflow流表项的结构主要为分组头域、计数器和动作表。

7、布鲁姆过滤器:是一种精简的信息表示方案,采用位图数据结构,通过哈希映射存储一个数据集,快速且节约内存,能用于判断一个元素是否不在一个集合中。

8、openflow流表项:openflow流表中包含的项分别对各种流的行为本身进行定义,用来描述openflow交换机如何处理各种数据包。openflow流表项主要由3部分组成,分别是用于数据分组匹配的分组头域(headfield),用于流表匹配情况的计数器(counter),还有匹配表项后需要对数据分组执行的动作表。

9、网络流量特性:sdn作为一种新型网络架构,并没有改变网络用户行为和网络应用特性,从而也不会影响网络流量分布特点。就网络流而言,网络流量局部性有多种表现形式,包括:(a)从流量分布规律来看,大部分流量往往分布在少数流中。因此,网络流可分为长流和短流,长流少但所占的数据量却大,短流多但所占的数据量却小;(b)从时间维度上看,同一流中的许多数据包分布并不均匀,而是呈现出分批集中到达的特点;(c)从短时间范围来看,活跃流通常较少,而静默流往往居多,且长流会在活跃状态和静默状态之间反复切换。

10、散列查找:又称哈希查找。其是实现openflow流表精确查找的一种方式。其借助散列函数,又称为哈希函数。将数据包的匹配字段通过散列函数的散列处理,获得散列值a,将流表项的匹配头域信息也做相同的散列处理,获得散列值b,即可以通过对比散列a、b的值,确定该数据包能否匹配该流表项。

11、启发法:启发法是针对模型求解方法而言的,是一种逐次逼近最优解的方法。这种方法对所求得的解进行反复判断实践修正直至满意为止。启发法的特点是模型简单,需要进行方案组合的个数少,因此便于找出最终答案。此方法虽不能保证得到最优解,但只要处理得当,可获得决策者满意的近似最优解。

12、缓存:缓存就是数据交换的缓冲区(称作cache),当要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从规则集中找。由于缓存的运行速度比直接从规则集中查找快得多,故缓存的主要作用就是用来加快查找速度。

本发明的有益效果:

1、本发明针对openflow虚拟交换机中流表查找开销大的问题,首先通过设计流表项缓存机制,使得大部分数据包直接命中缓存找到对应的流表项,从而绕过掩码探测过程和掩码探测对应的流表查找过程;其次设计sma1掩码启发策略,每次将成功探测的活跃掩码前移一个位置,使得所有活跃掩码经过一系列访问后调整到掩码数组的靠前位置,从而减少数据包的平均掩码探测次数;此外还采用可扩展计数型布鲁姆过滤器scbf快速判定流表查找失败结果,同时保证假阳性错误率始终保持在较低的水平,从而避免掩码探测失败时的流表查找遍历过程。通过上述三个优化方法,能显著降低数据包的平均流表查找开销,大大加快包分类速度,有效提升openflow虚拟交换机的分组交换性能。具体如下:

(1)流表项缓存机制:本发明的流表项缓存机制基于网络数据包流的连接分布局部性设计,能缓存最近活跃连接的签名和对应流表项的地址,使得活跃连接中的数据包直接命中缓存,找到对应的流表项,从而绕过掩码探测过程和每次掩码探测所带来的流表查找过程,显著降低数据包的平均流表查找开销,提升openflow虚拟交换机的包分类性能。

(2)sma1掩码启发策略:本发明采用的sma1掩码启发策略针对缓存失效时掩码探测开销大的问题,本发明基于网络数据包流的掩码访问局部性,设计sma1掩码启发策略,在数据包成功探测某个掩码时,判断该掩码是否处于活跃状态,进而将活跃掩码前移一个位置,使得掩码数组经过一段时间访问后,当前所有的活跃掩码处于靠前位置,从而减少数据包的平均掩码探测次数,提高数据包的平均流表查找速度。

(3)scbf查找过滤:针对掩码探测过程中流表查找经常失败导致流表查找开销大的问题,以及网络并发流动态变化特性,本发明采用可扩展计数型布鲁姆过滤器scbf快速判定流表查找失败结果,同时通过动态增减计数器数组,将假阳性错误率控制在较低水平,从而避免掩码探测失败时的流表查找遍历过程,显著降低数据包的平均流表查找开销。

2、本发明相比现有技术的方案一(掩码缓存),针对方案一存在的缺陷,通过判断未缓存的当前连接是否处于活跃状态,进而只将活跃连接换入缓存,使得缓存始终存放最近活跃的连接,以提高缓存命中率。另外,当数据包命中某条缓存项,读取对应的掩码后,仍需查找流表,产生流表查找开销。对此,本发明通过缓存活跃连接签名和对应的流表项地址,使得大部分数据包匹配缓存后直接获取对应的流表项,而无需查找流表,以减少流表查找开销。

3、本发明相比现有技术的方案二(mtf掩码启发),针对方案二存在的缺陷,本发明在每次成功探测掩码时,判断该掩码是否处于活跃状态,进而只将活跃掩码往前移动一个位置,以减少数据包的平均掩码探测次数,降低流表查找开销。

4、本发明相比现有技术的方案三(cbf查找过滤),针对方案三存在的缺陷,本发明应用可扩展计数型布鲁姆过滤器scbf,根据流表项数量的变化情况,动态增加或减少计数器数组的个数,以将假阳性误判率始终控制在可接受的范围。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为openflow虚拟交换机的流表查找过程示意图;

图2为现有技术掩码缓存机制的工作原理示意图;

图3为现有技术mtf掩码启发策略的工作原理示意图;

图4为现有技术cbf查找过滤机制的工作原理示意图;

图5为本发明openflow虚拟流表高性能查找方案示意图;

图6为本发明openflow虚拟流表查找过程示意图;

图7为本发明的缓存查找流程示意图;

图8为本发明的scbf过滤器结构示意图;

图9为本发明流表查找时scbf过滤器的工作流程示意图;

图10为本发明增加流表项时的scbf过滤器更新流程示意图;

图11为本发明删除流表项时的scbf过滤器更新流程示意图;

图12为本发明实施例矩阵q的示意图。

具体实施方式

下面结合实施例及附图对发明进一步说明,但不用来限制本发明的范围。

实施例1

如图5-12所示,本实施例提供一种高性能的openflow虚拟流表查找方法,具体包括如下步骤:

s1、当一个数据包到达openflow虚拟交换机后,openflow虚拟交换机接收并提取其中的关键字段,进而计算其连接标识符fid,然后采用如下流表项缓存机制查找缓存:

(1)首先将连接标识符fid通过哈希算法,即通过哈希函数h1(通用的哈希函数)得到32位的签名值fid_hash,将签名值fid_hash平分成四段作为索引值得到4个缓存项;

(2)然后,将签名值fid_hash与每个缓存项中的fid_hashi进行对比,若相等,则读取缓存项中的流表项地址,进而得到对应的流表项;

(3)接着,将连接标识符fid与流表项中的掩码进行与运算得到关键字mask_key,并与流表项中的流关键字key进行比较;若相等,则执行流表项中的动作集,并更新其字段信息,否则进行掩码遍历过程。

上述缓存查找过程若命中缓存,若命中缓存,则直接找到对应的流表项,更新缓存项的时间字段信息;然后执行其中的动作集,并更新其字段信息;

若查找缓存失败,则进入步骤s2依次探测掩码数组;

s2、对于每次掩码探测,首先通过查找过滤方法判定掩流关键字是否在流表中:

若判断掩流关键字可能在流表中,则进一步查找流表;若流表查找失败,则继续探测下一个掩码,直到最后一个掩码为止;

如果所有掩码探测完毕后仍未找到对应的流表项,则将数据包封装成packet-in消息发送给sdn控制器;

如果成功找到对应的流表项,则进入步骤s3;

如果成功找到对应的流表项,则应用选择性前移一位的sma1(selectivemove-ahead-1)启发法调整对应掩码的位置,并更新对应的缓存项,然后执行对应的动作集,并更新其字段信息;

s3、当缓存查找失败且探测掩码成功,即在流表中成功找到某个流表项时,分别判断该掩码和流表项是否进入活跃状态,即判断它们的当前数据包和最近数据包的到达时间间隔是否小于某个阈值:

当前掩码与上次命中该掩码的时间间隔小于某个阈值,则该掩码进入活跃状态,将该掩码在掩码数组中应用选择性前移一位的sma1(selectivemove-ahead-1)启发法调整对应掩码的位置,并更新对应的缓存项,然后执行对应的动作集,并更新其字段信息;

当前流表项与上次命中该流表项的时间间隔小于某个阈值,则该流表项进入活跃状态,则将该流表项加入缓存,并进行缓存查找,具体过程如下:将连接标识符fid通过哈希算法,即经过哈希函数h1得到32位签名值fid_hash,然后将签名值fid_hash平分成四段作为索引值得到4个缓存项位置,找到最近包达到时间最小的缓存项,最后将签名值fid_hash、流表项地址、当前包到达时间写入到该缓存项中。

本实施例中,方法的步骤s2中查找过滤采用的是scbf过滤器,scbf过滤器的结构如图8所示,所述scbf过滤器是指能通过增加一个为前一个计数器数组成倍长度的新计数器数组来适应流表大小的变化的过滤器。图8中h1-h4分别表示4个独立的h3哈希函数。

例如:设初始时第一个计数器数组的最佳容量大小为可计数d个流表项,当流表项数目超过d,则新增一个极限容量大小为2d的计数器数组。在含有n个计数器数组的计数器数组索引链中,若所有的计数器数组都达到了最佳容量,则新增一个最佳容量大小为(2^n)*d的计数器数组。所有的计数器数组通过计数器数组索引链相连,计数器数组索引链的每个结点中存放它所指向的计数器数组的首地址、流表项数目、最佳容量,以及该计数器数组的长度。

如图9所示,本实施例中scbf过滤器的工作流程如下:

(1)首先将关键字mask_key经过一次哈希运算,即通过哈希函数h1(通用的哈希函数)得到32位的哈希值,即h3_hash;

(2)之后获取计数器数组索引链第一个索引结点的信息,并提取到计数器数组的地址,将k个哈希函数的映射范围调整到当前计数器数组的下标范围,然后将h3_hash经过k个哈希函数计算得到k个哈希值,进而得到k个计数器;若有一个计数器中的计数为0,则继续获取下一个计数器数组的索引结点,直到k个计数器的计数都不为0或者索引链遍历完毕;若k个计数器都不为0,则流表中可能存在可匹配的流项,进行进一步查找,否则流表中一定不存在可匹配的流表项。

如图10所示,若在scbf过滤器的工作过程中,需要插入一条新流表项时,scbf过滤器的更新过程具体如下:

首先通过哈希函数h1(通用哈希函数)将下发流表项中的流关键字key转换成32位h3_hash,然后遍历计数器数组索引链,找到流表项数目小于最佳容量的计数器数组;

若找不到流表项数目小于最佳容量的计数器数组,则扩展一个新的计数器数组,并将k个哈希函数的映射范围调整到当前计数器数组的下标范围,并与h3_hash运算,进而得到k个计数器,并将每个计数器的计数加1,将对应的计数器索引结点中记录的流表项数目加1,最后在流表项结构中记录该计数器数组索引节点的地址。

如图11所示,若在scbf过滤器的工作过程中,删除一条流表项时,scbf过滤器的更新过程具体如下:

首先获取流表项结构中计数器数组索引结点的地址,然后通过计数器索引结点得到计数器数组的地址,再将k个h3哈希函数的映射范围调整到当前计数器数组下标范围;

之后,将该流表项中的key经过一次哈希运算得到h3_hash,经过k个h3哈希运算之后得到k个哈希值,进而得到k个计数器;

最后,将各计数器中的计数减1,并将计数器数组索引中记录的流表项数目减1。

h3哈希函数是上述scbf过滤器更新过程的一个重要组成部分。scbf过滤器的每一个计数器数组的长度成倍递增,对应h3哈希函数映射范围成倍递增,因而需要调整k个h3哈希函数的映射范围。

h3哈希函数首先随机生成大小为一个r行32列的只含0和1的矩阵q(如图12所示),若第一个计数器数组的长度为2t-1,则在r行的q矩阵中取前t行作为子矩阵z,之后将关键字key经过一次哈希运算,即通过哈希函数h1(通用哈希函数)得到32位的哈希值h3_hash。将h3_hash与矩阵z的每一列的列号进行与运算,选出运算结果不为0的所有列依次进行异或运算,最终得到t行只包含0或者1元素的1列,进而得到一个小于2t的t位的二进制数并作为计数器数组中的索引,进而将索引对应计数器的计数加1。若计数器数组的长度增大1倍,即为2t+1,此时,计数器数组的下标范围为0~2t+1-1,则在矩阵q中取前t+1行来适应计数器数组长度的变化,进而使得h3哈希函数的映射范围变成0~2t+1-1。即通过改变矩阵z的行数来适应计数器数组的长度变化。

本实施例针对openflow虚拟交换机中流表查找开销大的问题,首先通过设计流表项缓存机制,本发明的流表项缓存机制基于网络数据包流的连接分布局部性设计,能缓存最近活跃连接的签名和对应流表项的地址,使得活跃连接中的数据包直接命中缓存,找到对应的流表项,从而绕过掩码探测过程和每次掩码探测所带来的流表查找过程,显著降低数据包的平均流表查找开销,提升openflow虚拟交换机的包分类性能。然后设计sma1掩码启发策略,本发明采用的sma1掩码启发策略针对缓存失效时掩码探测开销大的问题,本发明基于网络数据包流的掩码访问局部性,设计sma1掩码启发策略,在数据包成功探测某个掩码时,判断该掩码是否处于活跃状态,进而将活跃掩码前移一个位置,使得掩码数组经过一段时间访问后,当前所有的活跃掩码处于靠前位置,从而减少数据包的平均掩码探测次数,提高数据包的平均流表查找速度。此外还针对掩码探测过程中流表查找经常失败导致流表查找开销大的问题,以及网络并发流动态变化特性,采用可扩展计数型布鲁姆过滤器scbf快速判定流表查找失败结果,同时通过动态增减计数器数组,将假阳性错误率控制在较低水平,从而避免掩码探测失败时的流表查找遍历过程,显著降低数据包的平均流表查找开销。

以上显示和描述了本发明的基本原理、主要特征和本发明的优点。本行业的技术人员应该了解,本发明不受上述实施例的限制,上述实施例和说明书中描述的只是说明本发明的原理,在不脱离本发明精神和范围的前提下本发明还会有各种变化和改进,这些变化和改进都落入要求保护的本发明范围内。本发明要求保护范围由所附的权利要求书及其等同物界定。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1