一种数据包分类方法
【专利摘要】本发明公开了一种数据包分类方法,包括CPU预处理规则集和GPU执行数据包分类两大部分;预处理在数据包分类开始之前执行,预先对规则集进行处理,使得后续包分类操作得以运行。预处理操作在CPU上完成。包分类操作是算法的核心部分,对输入的数据包进行分类,输出数据包匹配的优先级最高的规则编号。数据包分类操作在GPU上完成。本发明充分利用GPU的硬件特点及优势,较常规数据包分类算法有较大性能优势。
【专利说明】
一种数据包分类方法
技术领域
[0001 ]本发明涉及一种数据包分类方法。
【背景技术】
[0002]在现代路由器、交换机和防火墙中,为了实现优先路由或数据包过滤,网络上传输的数据包需要根据包头信息,按照一定的规则进行分类,执行不同的操作。这样的问题被称为数据包分类问题。
[0003]在网络分层模型中,要传输的数据被各层协议的包头依次封装,每层的数据包头都包含若干个域,它们分别表示该层协议的特征数据。一个规则集含有N条规则,每条规则由三部分组成:(1)与域有关的表达式,表达式一般是(1元组(&,&,-_4(1),其中&可能是前缀(数据包中的IP地址需要进行前缀匹配),也可能是范围(端口号需要进行范围匹配),或者是一个精确的值(协议类型需要进行精确匹配);(2)优先级,声明该条规则在规则集中的优先级,当一个数据包和多条规则匹配时,优先级最高的规则生效;(3)处理动作,如果输入的数据包与规则匹配,则根据该动作对数据包处理。
[0004]—个输入的数据包的包头经过解析后得到包头关键字P,P为d元组(Pl,P2,…,Pd),d维包分类问题就是在规则集中找到与P匹配,且具有最高优先级的规则。
[0005]尽管已存在许多改善数据包分类性能的技术,但为了满足日益增加的链路速率和流量大小,同时保持合理的可扩展性(考虑一些新的互联网技术,诸如SDN),数据包分类问题仍然具有挑战性。
[0006]随着GPU计算能力的不断增强,越来越多的系统和应用程序开始使用GPU来加速计算。相对于CPU,GPU的一个重要优势是它能提供相当强大的并行计算能力。如果我们将最新的CPU和最新的GPU进彳丁对比,往往可以发现GPU能提供远超于CPU的每秒钟浮点运算次数FLOPS (Floating-point Operat1ns Per Second)0CUDA(Compute Unified DeviceArchitecture,统一计算架构)是由显卡设计厂商NVIDIA推出的通用并行计算平台。通过这个平台,开发者可以使用C/C++、Fortran等高级语言来编写代码,表达并行机制,在支持CUDA的GPU上以高性能执行并行计算。
[0007]目前基于GPU平台的数据包分类已经取得一定进展。其中,利用GPU的并行计算能力将基本的线性查找算法或者经典的包分类算法移植到GPU上实现,可以大幅提高原系统的吞吐率。但是由于这些算法没有利用GPU的硬件特点,并不适合GPU执行,其运行效率还有较大的提升空间。
[0008]另一种基于GPU平台的包分类器的实现方案是利用CUDA的驱动API,进行程序运行时的动态编译,加载并执行。这种基于GPU的元编程在于最大程度的减少了对于显存的访问需求,使得程序在执行包分类时延迟很小。但是这种方法并不适合大规模的规则集的情况并且不支持规则集动态更新。
【发明内容】
[0009]本发明所要解决的技术问题是,针对现有技术不足,提供一种数据包分类方法。
[0010]为解决上述技术问题,本发明所采用的技术方案是:一种数据包分类方法,包括以下步骤:
1)对每个域分别建立索引表,使得对于所有域,给定任意合法输入I,均能在常数时间内查询到一条长度为规则集的大小的比特串,该比特串中O的位置编号对应合法输入I不匹配的规则编号,I的位置编号对应合法输入I匹配的规则编号;
2)将所有域的比特串传输到GPU的全局存储器上待用,并将需要分类的数据包包头关键字从内存传输到GPU的存储器上;
3)取出数据包包头所有域的值,并将所有域的值转换为十进制,从GPU全局存储器取得比特串;
4)对步骤4)的所有比特串执行与操作,合并所有的比特串,得到一条比特串,在合并后的比特串中,值为I的比特位置编号对应所述数据包匹配的规则编号;
5)检索所有匹配的规则,输出其中优先级最高的规则。
[0011]所述步骤I)中,所述域包括源端口号域、目的端口号域、协议类型域、源IP地址域和目的IP地址域。
[0012]所述步骤I)的具体实现过程包括:
对于源IP地址域,将该域拆成两部分,每部分16个比特,最大范围为[0,65535];首先将该域第一部分共65535条比特串以及第二部分共65535条比特串全部初始化为全O串;对规则集中所有规则做如下处理:对于编号为i的规则,将规则中源IP地址域的匹配条件的前16比特转换为范围,第一部分中,编号在该范围内的所有比特串的第i个位置均置为I;将规则中源IP地址域的匹配条件的后16比特转换为范围,第二部分中,编号在该范围内的所有比特串的第i个位置均置为I;
对于目的IP地址域,将该域拆成两部分,每部分16个比特,最大范围为[0,65535],首先将该域第一部分共65535条比特串以及第二部分共65535条比特串全部初始化为全O串;对规则集中所有规则做如下处理:对于编号为i的规则,将规则中目的IP地址域的匹配条件的前16比特转换为范围,第一部分中,编号在该范围内的所有比特串的第i个位置均置为I;将规则中目的IP地址域的匹配条件的后16比特转换为范围,第二部分中,编号在该范围内的所有比特串的第i个位置均置为I;
对于源端口号域,首先将该域全部共65535条比特串全部初始化为全O串;对规则集中所有规则做如下处理:对于编号为i的规则,将规则中源端口号域的匹配条件转换为范围,编号在该范围内的所有比特串的第i个位置均置为I;
对于目的端口号域,首先将该域全部共65535条比特串全部初始化为全O串;对规则集中所有规则做如下处理:对于编号为i的规则,将规则i中目的端口号域的匹配条件转换为范围,编号在该范围内的所有比特串的第i个位置均置为I;
对于协议类型域,首先将该域全部共255条比特串全部初始化为全O串;对规则集中所有规则做如下处理:对于编号为i的规则,将规则i中协议类型域的匹配条件转换为范围,编号在该范围内的所有比特串的第i个位置均置为I。
[0013]所述步骤4)的具体实现过程为:
取出数据包包头源IP地址域的值,将源IP地址域的值前16比特转换为十进制,该十进制值等于源IP地址域第一部分所求比特串的编号,从GHJ全局存储器取得比特串;将源IP地址域的值后16比特转换为十进制,该十进制等于源IP地址域第二部分所求比特串的编号,从GPU全局存储器取得比特串;
取出数据包包头目的IP地址域的值,将目的IP地址域的值前16比特转换为十进制,该十进制值等于目的IP地址域第一部分所求比特串的编号,从GHJ全局存储器取得比特串;将目的IP地址域的值后16比特转换为十进制,该十进制等于目的IP地址域第二部分所求比特串的编号,从GPU全局存储器取得比特串;
取出数据包包头源端口号域的值,将源端口号域的值转换为十进制,该十进制值等于源端口号域所求比特串的编号,从GPU全局存储器取得比特串;
取出数据包包头目的端口号域的值,将目的端口号域的值转换为十进制,该十进制值等于目的端口号域所求比特串的编号,从GHJ全局存储器取得比特串;
取出数据包包头协议类型域的值,将协议类型域的值转换为十进制,该十进制值等于协议类型域所求比特串的编号,从GPU全局存储器取得比特串。
[0014]与现有技术相比,本发明所具有的有益效果为:本发明针对GPU的硬件特点及优势设计数据结构及算法,并且充分利用CUDA并行计算平台的相关技术,跟常规数据包分类方法相比有较大性能优势,实现了高性能的、灵活、可扩展的数据包分类。
【附图说明】
[0015]图1为本发明方法与HiCuts算法的吞吐率对比。
【具体实施方式】
[0016]本发明方法主要由两部分组成:(I)CPU预处理规则集;(2)GPU执行数据包分类。以常见的5元组包分类(数据包按照源IP地址、目的IP地址、源端口号、目的端口号、协议类型分类)为例,介绍该方法的总体流程。
[0017]一、CPU预处理规则集
概述:算法对于规则集中不同的域分别进行预处理。其目的是对每个域分别建立索引表,使得对于所有域,给定任意合法输入I,均能在常数时间内查询到一条长度为规则集的大小的比特串(由O或I构成的串)。该比特串中O的位置编号对应合法输入I不匹配的规则编号,I的位置编号对应合法输入I匹配的规则编号。
[0018]对每个域的预处理:
(I)源IP地址域有32个比特,最大范围为[0,232-1],受到内存空间限制,无法直接预处理232-1条比特串。将该域拆成两部分,每部分16个比特,最大范围为[0,65535]。首先将该域第一部分共65535条比特串以及第二部分共65535条比特串全部初始化为全O串。对规则集中所有规则做如下处理:对于编号为i的规则,将规则中源IP地址域的匹配条件的前16比特转换为范围,第一部分中,编号在该范围内的所有比特串的第i个位置均置为I;将规则中源IP地址域的匹配条件的后16比特转换为范围,第二部分中,编号在该范围内的所有比特串的第i个位置均置为I。
[0019](2)目的IP地址域有3 2个比特,最大范围为[O,232_1 ],受到内存空间限制,无法直接预处理232-1条比特串。将该域拆成两部分,每部分16个比特,最大范围为[0,65535]。首先将该域第一部分共65535条比特串以及第二部分共65535条比特串全部初始化为全O串。对规则集中所有规则做如下处理:对于编号为i的规则,将规则中目的IP地址域的匹配条件的前16比特转换为范围,第一部分中,编号在该范围内的所有比特串的第i个位置均置为I;将规则中目的IP地址域的匹配条件的后16比特转换为范围,第二部分中,编号在该范围内的所有比特串的第i个位置均置为I;
(3)源端口号域有16个比特,最大范围为[0,65535]。首先将该域全部共65535条比特串全部初始化为全O串。对规则集中所有规则做如下处理:对于编号为i的规则,将规则中源端口号域的匹配条件转换为范围,编号在该范围内的所有比特串的第i个位置均置为I;
(4)目的端口号域有16个比特,最大范围为[0,65535]。首先将该域全部共65535条比特串全部初始化为全O串。对规则集中所有规则做如下处理:对于编号为i的规则,将规则i中目的端口号域的匹配条件转换为范围,编号在该范围内的所有比特串的第i个位置均置为I;
(5)协议类型域有8个比特,最大范围为[O,255]。首先将该域全部共255条比特串全部初始化为全O串。对规则集中所有规则做如下处理:对于编号为i的规则,将规则i中协议类型域的匹配条件转换为范围,编号在该范围内的所有比特串的第i个位置均置为I。
[0020]二、GPU执行数据包分类
在GPU上执行数据包分类之前,需要将预处理完成的5个域共393472(65536*6+256)条比特串传输到GHJ的全局存储器上待用。
[0021 ]数据包分类过程总体上分为三步:
(1)将需要分类的数据包包头关键字从内存传输到GHJ的存储器上;
(2)GPU开启大量线程,所有线程并行执行分类算法(详细见下述GPU执行分类算法);
(3)将GPU的计算结果传输回内存。
[0022]默认情况下,以上三个步骤是顺序执行的,GPU必须等待内存至GPU存储器的拷贝工作全部结束才能开始工作,在拷贝结束之前,GPU计算核心是空闲的。同时,显存至内存的回拷贝也必须等待GHJ的计算全部结束,因而造成设备的利用率不高,程序的效率受到影响。
[0023]通过使用CUDA计算平台中的Streams(多流)技术优化,我们可以使得内存至GPU存储器的拷贝、GPU的计算、显存至内存的回拷贝以流水线的方式执行,从而达到加速的效果。在CUDA中,流(Stream)的定义是指一系列的串行执行的操作组合。在有多条流同时执行时,属于不同流中的操作是并行执行的。
[0024]三、GPU执行分类算法
GPU中每个线程按照以下步骤执行包分类算法:
(1)取出数据包包头源IP地址域的值。将源IP地址域的值前16比特转换为十进制,该十进制值等于源IP地址域第一部分所求比特串的编号,从GHJ全局存储器取得比特串。将源IP地址域的值后16比特转换为十进制,该十进制等于源IP地址域第二部分所求比特串的编号,从GPU全局存储器取得比特串;
(2)取出数据包包头目的IP地址域的值。将目的IP地址域的值前16比特转换为十进制,该十进制值等于目的IP地址域第一部分所求比特串的编号,从GHJ全局存储器取得比特串。将目的IP地址域的值后16比特转换为十进制,该十进制等于目的IP地址域第二部分所求比特串的编号,从GHJ全局存储器取得比特串;
(3)取出数据包包头源端口号域的值。将源端口号域的值转换为十进制,该十进制值等于源端口号域所求比特串的编号,从GPU全局存储器取得比特串;
(4)取出数据包包头目的端口号域的值。将目的端口号域的值转换为十进制,该十进制值等于目的端口号域所求比特串的编号,从GPU全局存储器取得比特串;
(5)取出数据包包头协议类型域的值。将协议类型域的值转换为十进制,该十进制值等于协议类型域所求比特串的编号,从GPU全局存储器取得比特串;
(6)对步骤I至5中求得的共7条比特串执行与操作,合并所有的比特串,得到一条比特串。在合并后的比特串中,值为I的比特位置编号对应该数据包匹配的规则编号;
(7)检索所有匹配的规则,输出其中优先级最高的规则。
[0025]测试实验中,用测试的数据包总数除以实验用时,可以得到单位时间内执行数据包分类的数量。假设数据包大小均为64Byte,则每秒处理14.88*106个数据包相当于1Gbps的吞吐量,以此为依据作单位换算。
[0026]实验中使用的仿真数据(包括规则集和数据包头)通过ClassBench程序生成。我们测试了两种类型的规则集:访问控制列表(ACL),防火墙(FW)。在实验中,每种类型的规则集都有四种不同的规模,从Ik到4k递增。例如,fw_lk表示防火墙类型的规则集,规模大小为lk。我们只考虑5个域的规则:源/目的IP地址、源/目的端口以及协议类型。
[0027]测试主机的CPU为Intel的至强系列E5-2630,GPU为NVIDIA的TeslaK20m,有2496个⑶DA计算核心以及6GB的全局存储。PC1-E 3.0插槽连接GPU和主机,为内存与GPU之间的传输提供16 GB/s的理论带宽。
[0028]本专利中描述的算法分别使用不同的数据集与一种经典的包分类算法HiCuts进行对比测试。由于CUDA的参数配置会对算法的性能产生巨大影响,因而我们以不同的流数量、线程块和线程数组合进行多次测试,使用最优化的参数配置。
[0029]其中每个数据点测试5次,取平均值作为本次测试结果。结果如图1所示,在常规规模数据集的情况下,该算法较HiCuts有着较为明显的优势,其吞吐率较HiCuts提高了70%至400% ο
【主权项】
1.一种数据包分类方法,其特征在于,包括以下步骤: 1)对每个域分别建立索引表,使得对于所有域,给定任意合法输入I,均能在常数时间内查询到一条长度为规则集的大小的比特串,该比特串中O的位置编号对应合法输入I不匹配的规则编号,I的位置编号对应合法输入I匹配的规则编号; 2)将所有域的比特串传输到GPU的全局存储器上待用,并将需要分类的数据包包头关键字从内存传输到GPU的存储器上; 3)取出数据包包头所有域的值,并将所有域的值转换为十进制,从GPU全局存储器取得比特串; 4)对步骤3)的所有比特串执行与操作,合并所有的比特串,得到一条比特串,在合并后的比特串中,值为I的比特位置编号对应所述数据包匹配的规则编号; 5)检索所有匹配的规则,输出其中优先级最高的规则。2.根据权利要求1所述的数据包分类方法,其特征在于,所述步骤I)中,所述域包括源端口号域、目的端口号域、协议类型域、源IP地址域和目的IP地址域。3.根据权利要求2所述的数据包分类方法,其特征在于,所述步骤I)的具体实现过程包括: 对于源IP地址域,将该域拆成两部分,每部分16个比特,最大范围为[0,65535];首先将该域第一部分共65535条比特串以及第二部分共65535条比特串全部初始化为全O串;对规则集中所有规则做如下处理:对于编号为i的规则,将规则中源IP地址域的匹配条件的前16比特转换为范围,第一部分中,编号在该范围内的所有比特串的第i个位置均置为I;将规则中源IP地址域的匹配条件的后16比特转换为范围,第二部分中,编号在该范围内的所有比特串的第i个位置均置为I; 对于目的IP地址域,将该域拆成两部分,每部分16个比特,最大范围为[0,65535],首先将该域第一部分共65535条比特串以及第二部分共65535条比特串全部初始化为全O串;对规则集中所有规则做如下处理:对于编号为i的规则,将规则中目的IP地址域的匹配条件的前16比特转换为范围,第一部分中,编号在该范围内的所有比特串的第i个位置均置为I;将规则中目的IP地址域的匹配条件的后16比特转换为范围,第二部分中,编号在该范围内的所有比特串的第i个位置均置为I; 对于源端口号域,首先将该域全部共65535条比特串全部初始化为全O串;对规则集中所有规则做如下处理:对于编号为i的规则,将规则中源端口号域的匹配条件转换为范围,编号在该范围内的所有比特串的第i个位置均置为I; 对于目的端口号域,首先将该域全部共65535条比特串全部初始化为全O串;对规则集中所有规则做如下处理:对于编号为i的规则,将规则i中目的端口号域的匹配条件转换为范围,编号在该范围内的所有比特串的第i个位置均置为I; 对于协议类型域,首先将该域全部共255条比特串全部初始化为全O串;对规则集中所有规则做如下处理:对于编号为i的规则,将规则i中协议类型域的匹配条件转换为范围,编号在该范围内的所有比特串的第i个位置均置为I。4.根据权利要求3所述的数据包分类方法,其特征在于,所述步骤4)的具体实现过程为: 取出数据包包头源IP地址域的值,将源IP地址域的值前16比特转换为十进制,该十进制值等于源IP地址域第一部分所求比特串的编号,从GHJ全局存储器取得比特串;将源IP地址域的值后16比特转换为十进制,该十进制等于源IP地址域第二部分所求比特串的编号,从GPU全局存储器取得比特串; 取出数据包包头目的IP地址域的值,将目的IP地址域的值前16比特转换为十进制,该十进制值等于目的IP地址域第一部分所求比特串的编号,从GHJ全局存储器取得比特串;将目的IP地址域的值后16比特转换为十进制,该十进制等于目的IP地址域第二部分所求比特串的编号,从GPU全局存储器取得比特串; 取出数据包包头源端口号域的值,将源端口号域的值转换为十进制,该十进制值等于源端口号域所求比特串的编号,从GPU全局存储器取得比特串; 取出数据包包头目的端口号域的值,将目的端口号域的值转换为十进制,该十进制值等于目的端口号域所求比特串的编号,从GHJ全局存储器取得比特串; 取出数据包包头协议类型域的值,将协议类型域的值转换为十进制,该十进制值等于协议类型域所求比特串的编号,从GPU全局存储器取得比特串。
【文档编号】H04L12/741GK105897587SQ201610194030
【公开日】2016年8月24日
【申请日】2016年3月31日
【发明人】张大方, 郑锦涛, 李彦彪, 李果, 何大成
【申请人】湖南大学