简单实现包分类算法概要包分类是VPNs、下一代路由器、防火墙等设备的关键技术。
包分类算法研究具有十分重要的意义,是目前的热点之一。
本文介绍了常用的包分类算法,分析了它们的优缺点,并简单实现线性、Hicuts 和Hypercut三种基本算法,对这三种算法进行性能对比。
一、包分类算法背景路由器的主要功能是将一个网络的IP数据报(包)Packet转发到另一个网络。
传统路由器仅根据数据包的目的地址对数据包进行转发,提供未加区分的尽力服务(Best Effort Service),这是一维报文分类的典型形式:对所有的用户报文一视同仁的处理。
但是,随着因特网规模的不断扩大和应用技术的进步,越来越多的业务需要对数据包进行快速有效的分类以便区别处理提供不同级别的服务,因此路由器还需要对数据包进行进一步的处理。
最常见的是根据安全性需要,对包进行过滤,阻止有安全隐患的数据包通过。
因此,研究高速包分类算法具有十分重要的意义。
因特网是由许许多多的主机及连接这些主机的网络组成,主机间通过TCP /IP协议交换数据包。
数据包从一个主机穿过网络到达另一个主机,其中就需要路由器提供数据包转发服务。
近年来,因特网己经从主要连接教育机构的低速网络迅速成为重要的商业基础设施。
现在,因特网正呈现两方面的新变化:一方面,因特网上的用户正在呈现爆炸性增长,Web站点正在迅速增加,需要宽带网络的多媒体应用正在日益普及,因特网的通信量也正在呈现爆炸性增长,因特网正日益变得拥挤:另一方面,因特网上的用户正呈现许多不同的种类,从以浏览和下载资料为主的普通家庭用户到经营电子商务的大型企业等等,这些用户从安全、性能、可靠性方面对因特网的期望是不同的。
人们希望路由器能够具有诸如数据包过滤、区分服务、QoS、多播、流量计费等额外功能。
所有这些处理都需要路由器按某些规则将数据包进行分类,分类后的数据构成许多“流’’,再对每一个流分别进行处理。
对于网络流量的不断增长问题,由于光纤技术和DWDM 技术的发展使得链路的速率不再成为瓶颈,已经满足了大流量传输的需求,这就使得路由器的处理速度成为网络整体速度的一个瓶颈。
这主要由于路由器需要对每个输入包执行许多操作,包括十分复杂的分类操作。
例如,它们需要对每个输入包执行最长前缀匹配以发现其下一跳地址:需要对每个输入包执行多维包分类以便在执行缓冲器管理、QoS调度、防火墙、网络地址翻译、多播服务、虚拟专用网、速率限制、流量计费等任务时区别对待不同的包。
因此,为了满足服务快速性和服务多样性这两方面的需要,就必须研究相应的快速包分类算法应用到实际路由中。
二、包分类原理包分类是QoS的基础,只有区分了不同的报文业务,才能进行分别处理及保障相关业务的服务质量。
分类是定义传输类别并判断报文所属传输类别的过程。
TCP/IP报文有两种基本的分类模式,行为聚合(BA)或多字段(MF)。
BA类是区分服务编码点(DSCP)处理的基础,具有较好的扩展性,适用于核心网络。
MF类基于TCP/IP报头一个或多个域(字段),原则上讲所有的字段都可以用于分类。
比如经典的五元组形式(源端口,目的端口,源地址,目的地址,协议类型)。
MF类一般在网络边界实现,是一种广泛使用的灵活的报文分类方法。
高性能的路由器应该支持灵活的分类策略,实现高效的分类算法。
动作通常数据包分类就是根据网络上传输的数据包的包头信息,将数据包按照一定规则进行分类。
在网络分层模型中,要传输的数据被各层协议的包头依次封装,每层的包头都包含若干个域(字段),它们分别表示该层协议的特征数据。
一个分类器又称规则库f,含有n条过滤规则,记为< R1,R2,...,Rn>。
R为其中任意一条规则,由匹配条件filter、优先级priority和匹配处理action三部分构成,记为R[filter],R[priority] 和R [action] :R[filter]:d元组(R[F1],R[F2],...,R[Fd]),指示数据包匹配该规则的条件。
Fi表示规则R的第i个匹配域,是该条规则对数据包头的第i个字段的约束条件。
R[priority]:规则的优先级,优先级越高,代价越小。
取值范围是[1,+∞),即R[priority]∈[1,+∞)。
默认情况下规则编号表示优先级,编号较小的规则具有较高的优先级。
R[action]:对满足相应过滤规则的数据包的处理动作,其取值范围是{a1,a2,a3,...,ak},即R[action]∈{a1, a2, a3,...,ak}。
一般来说k域报文分类匹配分类器设计到的技术也称k维报文分类问题。
k维报文分类问题是通用报文分类问题。
一个数据包的包头经过解析以后得到一个关键字P,P为d元(p1,p2,…,p d),d维包分类问题就是在规则集中寻找和P匹配的具有最高优先级的的规则R best(最佳匹配)。
三、三种包分类算法包分类问题巨大的需求,众多的算法和体系结构已被提出,基本上可以划分为5种类型的算法:穷举分类算法、基于Trie分割的分类算法、几何区域分割的分类算法、元组空间分割分类算法、维度分解分类算法,本文要实现的三种包分类算法:线性包分类算法、Hucuts和Hypercut算法分别属于穷举分类算法和几何区域划分算法。
下文将就着两种类型的算法展开。
穷举分类算法是查找问题最基本而简单的解决方法将待分类的数据包依次和分类规则库内的所有规则进行比较。
讨论这种方法的意义在于,假设规则集已被分成许多子集,每个子集的独立查找往往可以选择该方法。
穷尽查找法中具体两个最常见的算法是线性查找和大规模并行查找。
二者恰好代表穷尽查找法的两种极端,线性查找对规则集不进行分割,其性能最低,而TCAM将规则集划分成每个子集只有一条规则,其性能最高。
线性查找算法按照按优先级降序排列分类规则链表,一个数据包顺序地与每个规则进行比较直到找到第一个匹配的规则。
由于规则已经事先按照优先级降序排列,所以第一个匹配的规则即为最佳匹配规则。
包分类阶段的空间复杂度为O(N),时间复杂度为O(N)。
包分类的时间随着规则数目的增加呈线性增加,适用于规则数目比较少的情况。
几何区域划分算法,主要思想根据规则代表的区域,对规则集进行分割储存查找时,判断数据包代表的点落入的子空间范围,逐步收拢得到最佳匹配规则。
典型算法有:智能层次切割(Hierarchical IntelligentCuttings,Hicuts) 算法和多决策树HyperCuts算法。
HiCuts(Hierarchical Intelligent Cuttings)算法由学者Gupta和Mckeown提出,切割(Cutting)的概念来源于从几何学角度观察包分类问题。
该算法适于范围类型的规则,将其它字段统一转化成范围。
HiCuts采用了一棵决策树作为快速查找的数据结构,其内部结点包含适当的分类导向信息,但不存储任何规则,其叶结点(或外部结点)存储一个小型的规则子集。
算法结合了决策树搜索和线性查找两种分类方式,采用多级空间分解,每级分解在一个维度上进行,把规则库分为各个叶子结点内的小规则集。
当一个IP包进来时,沿着树的某一分支遍历到树的叶子,将该IP包和叶子结点中少量的规则线性匹配。
Hicuts算法的优点是占用内存空间小,规则集更新容易,直接支持范围匹配,缺点是预处理时间较长,分类速度比一些快速包分类算法低。
HyperCuts算法由Singh、Baboescu、Varghese和Wang等学者提出。
HyperCut 以HiCuts算法为基础上,做了一些改进,通过多重切割多维空间,最小化决策树的高度,同样也限制叶结点上规则最大数目。
由于等分切割,HypcrCuts对子空间的编码简单而有效,译码简单,这使得多重切割没有大幅增加数据结构所占用内存。
HyperCuts算法对Hicuts算法的改进,包括:HyperCuts通过增加一个参数,使决策树中间结点可以同时基于多维进行分割。
Hicuts形成的决策树叶子结点上重复的规则较多,HyperCuts通过把一些通用规则(比如通配规则,前缀较短的规则)从分类规则库中独立出来,存放在根结点中。
HyperCuts在叶结点所存储规则列表中仍进行线性查找。
理论上,该算法时间和空间复杂度与HiCuts算法属于同一个数量级。
HyperCuts决策树比HiCuts决策树更低,然而内部结点信息更多,需要位数也更多,这可能增加一个内部结点访问内存的次数,故一次多重切割的维数和份数受存储器位宽限制。
HyperCuts算法也支持增量更新,支持以中等速度进行随机更新,最坏情况下,需要重构决策树.四、算法描述这里只做算法的描述,具体代码见附件包分类根据IP数据的包头字段分类,IP数据包为网络层信息传输的载体,拥有固定长度20字节的首部。
同时IP数据报还封装了上一层的TCP/UDP报文段得的首部,包括源端口、目的端口等信息。
规则库f中的每条规则规则Rule由分类器(filter)、优先级(priority)、动作(action)组成。
分类器可以用经典的五元组表示(目的地址,源地址,协议,目的端口,源端口)即(DA,SA,PR,DP,SP)。
当一条IP数据报进入路由器要经过路由器转发时,数据报会解析出一个关键字P,若P也是由5个字段组成P(d1,d2,d3,d4,d5),那么数据包与规则的匹配问题就是P 的五元组每个分量d跟filter的分量匹配寻找路由器处理动作action的过程。
typedef struct{unsi gned long DA ;unsi gned long SA ;int PR ;unsi gned DP ;unsi gned SP ;}filter , *Filter;线性包分类算法:规则库中的规则用一条单链表的形式组织,按照优先级Rule.priority将单链表非升序排列。
包头解析关键字P在链表中从头结点开始顺序匹配,第一个与之匹配的规则就是最佳匹配。
typedef struct rule{fliter fliters;int priority ;int action ;struct rule *next ;} Rule ;Hicuts算法Hicuts算法结合了决策树搜索和线性查找两种分类方式,采用多级空间分解,每级分解在一个维度上进行,把规则库分为各个叶子结点内的小规则集。
Hicuts 算法构建了一颗决策树,其内部结点包含适当的分类导向信息,但是不包含任何规则,规则都是存储在叶子结点中。
概括地描述d维HiCuts算法如下。
每个内部结点v,代表几何查找空间的一个分区。
例如根结点代表完整的d维空间,根据其中一维可将v个结点空间分割成更小子空间,每个子空间为v结点的每个子结点所表示。