论文信息
作者:Pankaj Gupta & Nick McKcown
发表会议:SIGCOMM 1999
发表机构:斯坦福大学,计算机系统实验室
为什么提出该算法?
- 路由器对数据包进行分类,以确定它们属于哪个流,并决定它们应该接收什么服务。
- 一般来说,分类可以基于包头中任意数量的字段,但是对任意数量的字段进行快速分类是很困难的,并且最差情况下的性能很差。
- 本文考虑了一些来自真实网络的分类器,发现分类器包含一些结构和规则冗余可以被分类算法利用。
- 因此本文提出一个简单的多级分类算法RFC(递归流分类),在流水线硬件上每秒可以分类3000万个包,在软件上每秒可以分类100万个数据包。
Part1: 引言:包分类
1. 包分类定义
数据包分类:
按照一定规则对网络上传输的数据包的包头信息进行分类。
IP包分类基本原理图,如下图所示:
- 包头信息P: d元组( p 1 , p 2 , . . . , p d p_1,p_2,...,p_d p1,p2,...,pd)
- 经典五元组 (目的地址,源地址协议,协议,目的端口,源端口)
- d维包分类问题: 在分类器中找到与P匹配的具有最高优先级的规则 R b e s t R_{best} Rbest (最佳匹配)
最佳匹配: 在实际应用中,一个数据包可能会匹配多条规则,因此需要在所有匹配的规则中找到优先级最高的一条规则,最高优先级别的规则称为 R b e s t R_{best} Rbest。
在本文中规则优先级由规则顺序确定
2. 分类器定义
分类器(Classifier,规则集),含有N条规则。每条规则 R [ j ] ( 1 ≤ j ≤ N ) R[j](1 \leq j \leq N) R[j](1≤j≤N)由三部分组成:
R
[
f
i
l
t
e
r
]
:
d
元
组
R[filter]:d元组
R[filter]:d元组
R
[
p
r
i
o
r
i
t
y
]
:
优
先
级
R[priority]:优先级
R[priority]:优先级
R
[
a
c
t
i
o
n
]
:
匹
配
处
理
R[action]:匹配处理
R[action]:匹配处理
3. 包分类算法的评价指标
- 速度
最坏情况:对一个数据包进行分类查找的最长可能时间
平均情况:在随机情况下,对一个包进行分类查找的平均时间
统计情况:在符合某种预先指定的包或过滤规则匹配率的分布下,对一个包进行分类查找的平均时间 - 占用内存
包括规则库以及为高速查找而建立的各种数据结构占用的内存 - 更新代价
完全更新:重新建立全部的查找数据结构
增量更新:在查搜数据结构中增加或删除一条过滤规则
重组或平衡:在适当的时间重组数据结构使其恢复原来的效率 - 可扩展性
① 在分类器的规则个数上具有可扩展性,指分类器的规则个数N可以很大,而不是限定在固定的规则数目上。
② 在分类的维数上具有可扩展性,指可以包含任意多个分类的字段,而不是限定在固定的某几个字段上。
③ 在分类的层次上具有可扩展性,指分类可包含多层次的分类,理想的算法应该是能够容许匹配任意层内的字段包括数据链路层、网络层、传输层,在一些特殊的情况下可能要包括应用层的内容 - 最坏情况下的性能
平均的性能分析有时不能完全真实反映分类的性能。
简单了解包分类算法的类别
- 穷举分类算法
- 基于Trie分割算法
- 几何区域分割算法
- 元组空间分割算法
- 维度分解算法
基于维度分解的多维包分类算法,将关键字的匹配在各个维度上分别执行,有利于并行化实现,提高查找速度,同时降低对维度增加的敏感度,是性能非常好的一类算法。
关于其他的算法如果感兴趣的话,可以自行了解,不做赘述了。
本文是维度分解算法的一种,1999年提出这个算法的时候,将该领域的研究提升到了新的阶段,该算法的查找过程非常迅速,满足高速应用的需求。
Part2: RFC算法
1. RFC算法主要思想
RFC算法主要思想:将规则集域分为若干段,通过计算分段中的等价类和递归操作,实现空间的分布压缩映射。
对一个包分类,可被视为把S位的包头关键字映射成T位的类编号(classID),即把 2 S 2^S 2S个不同的包头关键字映射到 2 T 2^T 2T条不同的规则。(其中T=1ogN,T<<S,N为规则数目)
- 如果映射一步完成,需要很大的内存空间。因此RFC算法的基本思想就是分步完成映射,每步将一个较大的集合映射成较小的集合,达到减小内存需求的目的。
- 每一阶段映射称为一次缩减(reduction),由阶段映射构建的数据结构称为缩减树
2. RFC数据包流
以下图来看,RFC数据包需要执行4个阶段:
- 第一阶段(Phase0):包头中的d个域被分成若干个块(chunks),每一块被用来作为并行查找的索引index
- 在后面的几个阶段,每次查找内存的索引值都是由前几个阶段的查找的结果合并而成
- 最后一个阶段(Phase 3):查找的结果得到一个值,这个值就是该包对应的classID (经过预先计算的)
刚刚提到第一个阶段会进行分块?那么什么是分块呢?
注:分块(chunk)啥意思?
刚刚提到了包头由d个域组成,就是把每个字段都划分成一个域。
下图中的规则集,就是一个四元组,4个域可以分成4块。
这样讲对RFC可能还是不太懂,那么下面举一个完成的RFC例子。
3. 一个简单RFC例子
预处理过程
两阶段 RFC 缩减树的构造过程如下:
(1)Phase0 阶段:将规则集的 3 个域(F1-F3)分别映射到 3 个预处理表(Chunk0-2)中,并为每个预处理表生成相关联的等价类表。
- 预处理表的表项序号表示规则域的一种取值,比如分块0的表项0表示规则中的F1域取值为“000”,表项内容则为一个eqID。
- 等价类表的生成过程:
a. 从预处理表的第一个表项开始,计算每个表项对应的CBM位串。方法是检查对应域的取值与表项序号相同是否一致,如果一致则CBM 位串中与该规则对应的位置为 1(表示与该规则匹配),否则置为 0。
b. 检查等价类表中是否已存在该 CBM 位串, 若存在则将其对应的 eqID 填入预处理表的表项,;否则分配一个新的 eqID,并在等价类表中添加一条记录。
参考下面的图片,举个小例子:
- 预处理表首项chunk0[0]对应域F1的R4规则***
- 因此,将R4规则对应位置致1,那么生成的CBM位串位0001,生成eqID为0,将(0,0001)记录到等价类表eqID
- 记录Chunk[0]=eqID=0
![](https://i-blog.csdnimg.cn/blog_migrate/bb11ea3c4221dc889b9bf15d8db7f077.png)
![](https://i-blog.csdnimg.cn/blog_migrate/47a4cacdb79a5c829857e5590309bf8b.png)
(2)Phase1 阶段:将 Phase0 阶段的各等价类表进行合并生成交叉乘积表,交叉乘积表也有一个关联的等价类表。
-
交叉乘积表:由前一个阶段的等价类表合并生成。
例如,图中交叉乘积表 (Table A)是由等价类表 eqID0-eqID2合并生成的。交叉乘积表的每个表项代表了等价类表的一种组合。 -
等价类表生成:
a. 对于每一个表项,将该表项所代表的 eqID 组合中各 eqID 对应的 CBM 位串做按位与运算,得到一个新的 CBM 位串。
b. 如果该 CBM 位串在等价类表中已出现过,则将其对应的 eqID 填入交叉乘积表的表项;否则分配一个新的 eqID, 并在等价类表中添加一条记录。
举个例子:
- Table A 的表项0代表(eqID0,eqID1,eqID2)的组合(0,0,0),表项内容Table A[0] = 0为等价类表 e q I D 3 eqID_3 eqID3编号0。
- 等价类表组合(0,0,0)的CBM位串与运算,得0001 & 0001 &0011 = 0001,填入等价类表 e q I D 3 [ 0 ] = 0001 eqID_3[0]=0001 eqID3[0]=0001
其他等价类表组合同理进行,生成完整的交叉乘积表和对应等价类表。
因此交叉乘积表的长度应该是各等价类表长度的乘积。
查找过程
RFC算法对于数据包P(010,010,011)的查找过程:
(1) Phase 0 阶段:
用P1=010,P2=010,P3=011分别索引Chunk0-2,得到(eqID0 eqID1 eqID2) = 211。
(2) Phase 1 阶段:
- 按照 Index= eqID0×3×2 + eqID1×2 + eqID2 得到索引15
- 用该索引查找交叉乘积表 A, 得到 eqID3 等于 0,其对应的 CBM 位串为 0001,表示和规则 R4 匹配。
查看规则集,确实是匹配规则R4。
Part3:算法实验
本文的实验是对算法两个阶段进行测试:
1. RFC预处理
影响预处理性能的两个参数:
1)映射阶段P
2)选取合并块的条件:
- 合并相关块
合并两个16bits的源地址块chunk0和chunk1,如图8tree_A、图9tree_A
- 尽可能合并多块
如图8tree_B、图9tree_B
实验结构图:
先说明下面两张图各块代表内容:
![](https://i-blog.csdnimg.cn/blog_migrate/c12a68b9420f7e185daf921e3d35548e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1da226381dbf172de9ec088c893e9899.png)
下面的实验都是基于这两种情况较好的缩减树进行。
占用内存实验:
![](https://i-blog.csdnimg.cn/blog_migrate/abddcc32f20129a5cd140038e4f42e86.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e0260b26f52d8707533c337a3a35522f.png)
从上面的实验分析:
阶段数P增加对减少内存效果明显
时间消耗实验:
从上面的实验分析:
时间消耗没有特别稳定,因此该算法应更适合于规则变化少的应用场景。
2. RFC查找
- 可以在软件或者硬件环境下运行
- RFC预处理只能在软件环境中运行
- 硬件环境
速度:3150万个数据包/秒 - 软件环境
最坏情况:100万个数据包/秒
平均速度:150万个数据包/秒
下表显示了查找10万个数据包所需要的平均时间:
可以看出来RFC在文中给的不超过1734条规则的分类器性能不错,但是在面临更大的分类器时RFC表现还需要继续探讨。
3. 大型分类器的实验结果
这部分实验的分类器来源于连接较小的分类器:
(1)连接来自同一网络的分类器构建,创建了多达3,896条规则的分类器。
P=3和4,RFC的内存消耗结果,如图15所示:
分类器扩展到3896左右条规则的内存仍呈现内存消耗随阶段数P增加而减少的趋势。
(2)创建更大的分类器,将几个(最多十个)不同网络的所有分类器连接起来。
对于P=4,RFC性能如图18中的“Basic RFC”所示:
规则超过6000条的分类器,RFC会遇到存储问题,增加阶段数并没有帮助
这样的存储问题。是因为:
- RFC必须在每个阶段合并至少两个块,并在最后阶段以一个块结束。
- 因为大量规则,RFC各项表也很大,存储就出现了问题。
如何解决这种存储问题,本文给了一种解决方案:
Part4: Adjacency Groups
Adjacency Groups
本文提出了这个方案,简单地说就是组合相邻规则,称作邻接组。
- 等价类表编号会关联邻接组的位图指针,而不是原始规则。
举个例子:
- 规则匹配动作相同
- 除了第i个字段,规则R和S其他字段都相同,那么将规则R和S合并。
- 重复此步骤,直到没有可以合并的规则。
这样随着阶段增加,邻接组合数量和分类器大小会减少。
实验结果
检验减少内存需求
-
P=3时,实验结果如图16:
和图15对比,内存占用从4500KB下降到800KB左右。
-
P=4时,实验结果如图18:
通过构建邻接组,内存占用减少;
可以看到规则数量上限从6000条提升到了15000条。
总结:通过这种优化,RFC现在可以用3.85MB处理15,000条规则的分类器。
但是,这个方案虽然提升了规则数量上限,但是代价就是没有办法找到具体的原始规则。
Part5:总结
最后从两个角度对文章进行总结:
1. RFC算法特点
优点:
- 与其他算法相比,更适用于实际的网络中
- 易于并行运行:
- 处于同一阶段的预处理表或交叉乘积表可被并行地索引
- 处于不同阶段的表也可被并行地索引
- 这些表各自独立,可分布于不同的存储单元中
缺点:
- 不易于进行增量更新,每次修改规则库之后需要重新构造整个缩减树
- 大型分类器的预处理时间和内存占用大
2. RFC改进
算法的空间效率:
(1)Edward W. Spitznagel 提出了一种对RFC 算法构建的缩减树进行压缩的方法。
- 能够将交叉乘积表中连续出现的元素用一个拷贝来表示,该 方法避免了连续元素的重复存储,但是并没有避免独立元素的重复存储。
- Spitznagel Edward W. Compressed data structures for recursive flow classification. Technical Report, WUCSE-2003-65, May 2003.
(2)刘铎 等提出了 Compact RFC 算法,进一步改进了 RFC 缩减树的存储结构,可完全消除缩减树中独立元素的重复存储,最大程度地压缩内存空间,同时保持 RFC 算法的较好分类效率。
- 刘铎, 华蓓, 唐锡南等.Compact RFC: 一种内存优化的 RFC 包分类算法. 小型微型计算系统, 2007,482~487.
- Duo Liu, Bei Hua, Xianghui Hu et al. High-performance packet classification algorithm for many-core and multithreaded network processor, Proceedings of the 2006 international conference on Compilers, architecture and synthesis for embedded systems, Seoul, Korea, October 2006:334~344.
(3)吴层使用压缩规则集和压缩交叉乘积表这两项措施对 RFC 算法进行了改进。
- 将规则集重新组 合,在有相同的处理结果的规则组内,将邻接规则进行合并,压缩规则集的规模。
- 交叉乘积表压缩主要还是采用了以上两个学者提出的比特向量压缩算法。
吴层. 基于 IXP2400 的改进 RFC 算法的研究与设计. 北京:北京交通大学硕士论文, 2008.
算法的时间效率:
(1)申震生对 RFC 的预处理时间做了一些改进。
- 首先减少两个等价类按位与的时间。
- 其次还提出了保存预处理之后的数据结构信息的方法,在网络设备下次启动的时候可以不再做初始化处理。
申震生, 龚向阳, 王文东等. 具有高速过滤算法的 IP 防火墙.计算机应用, 2001, 21(5): 50-52.
(2)潘宇科针对 RFC 的预处理时间的改进主要包括两个方面:
- 一个是在映射阶段对所有匹配域排序,减少遍历规则次数;
- 另一个是在合并阶段加入启发式信息提前确定等价类编号,通过这两个方面,预处理阶段的时间消耗可以减少 90%以上。
Pan Yu-ke, Chen Bing, Xu Tao. A timesaving recursive flow packet classification algorithm[C], NSWCTC 2009, WuHan China, April 2009, 2:442-445.
算法的更新速度:
王华丽实现了支持动态更新的多维高速包分类算法。
- 利用网络处理器的并行处理能力和 RFC算法中等价类的思想,结合哈希水平查找和垂直查找实现动态更新。
王华丽. 高端路由器中数据包分类技术的研究与实现. 西安:西安电子科技大学硕士论文, 2007.
算法的 IPv6 环境应用:
罗蔚将数据包在源地址和目的地址段的检索方法由一 次检索转换成基于地址区间的二分搜索。
- 以时间换空间,算法的时间复杂度由 O(1)变为 O(n), 以此来遏制 IPv6 地址增长所导致的算法空间的急速膨胀,并应用在 IPv6 防火墙的数据包过滤系统中。
罗蔚. 基于 IPv6 的防火墙系统设计与实现. 成都:电子科技大学硕士论文, 2007.
参考资料
[1]GUPTA, PANKAJ, MCKEOWN, NICK. Packet classification on multiple fields[C/OL]//Proceedings of the conference on Applications, technologies, architectures, and protocols for computer communication. New York, NY, USA: Association for Computing Machinery, 1999: 147-160. https://doi.org/10.1145/316188.316217.
[2]BHALERAO A. Packet-Classification-RFC-Algorithm[M/OL]. 2017[2022-04-28]. https://github.com/AmitBhalerao/Packet-Classification-RFC-Algorithm.
[3]Packet classification on Multiple Fields Authors: Pankaj Gupta and Nick McKcown Publisher: ACM 1999 Presenter: 楊皓中 Date: 2013/12/11 - [PPT Powerpoint][EB/OL]//vdocuments.net. [2022-05-01]. https://vdocuments.net/packet-classification-on-multiple-fields-authors-pankaj-gupta-and-nick-mckcown.html.
[4]第十一章 包分类算法研究.ppt[EB/OL]. [2022-05-01]. https://max.book118.com/html/2017/0621/117111959.shtm.
[5]Packet Classification on Multiple Fields - [PPT Powerpoint][EB/OL]//vdocuments.net. [2022-05-03]. https://vdocuments.net/packet-classification-on-multiple-fields-56a6f7977085f.html.
[6]朱胜琼. 一种基于递归流的快速多维包分类算法[J/OL]. 微计算机信息, 2006(12): 191-193[2022-05-04]. https://kns.cnki.net/kcms/detail/detail.aspx?dbcode=CJFD&dbname=CJFD2006&filename=WJSJ200612065&uniplatform=NZKPT&v=dJgMgC5geF8WmPQmuyjE4xCNqFtDH0_Chr4rQd8R_gQSlxrJ9kdR0DweqyIoXjBE.
[7]曹婕. 递归流包分类算法的研究与改进[D/OL]. 南京航空航天大学, 2010[2022-05-04]. https://oversea.cnki.net/kcms/detail/detail.aspx?dbcode=CMFD&dbname=CMFD2012&filename=1011292316.nh&uniplatform=NZKPT&v=s-oiqn7WB7vlRNtpnJQlW71RTnwPUuIUv_-3xw3sIUdoJez5x4ZkrQDiC_-NQSRM.
[8]IP数据包分类经典算法总结 _wolfzone025的博客-CSDN博客_rfc算法[EB/OL]. [2022-05-05]. https://blog.csdn.net/wolfzone025/article/details/6577668.