600 likes | 898 Views
包分类算法. 主要内容. 包分类问题的产生背景 典型的包分类算法 Bitmap-RFC 算法 TIC 算法. 参考文献. D. E. Taylor. Survey & Taxonomy of Packet Classification Techniques . Technical Report, Department of Computer Science & Engineering, Washington University in Saint Louis, May 2004.
E N D
主要内容 • 包分类问题的产生背景 • 典型的包分类算法 • Bitmap-RFC算法 • TIC算法
参考文献 • D. E. Taylor. Survey & Taxonomy of Packet Classification Techniques. Technical Report, Department of Computer Science & Engineering, Washington University in Saint Louis, May 2004. • D.Liu, B.Hua, X.Hu, X.Tang. High-performance Packet Classification Algorithm for Many-core and Multithreaded Network Processor. In Proceedings of CASES 2006. • H.Cheng, Z.Chen, B.Hua, X.Tang. Scalable Packet Classification Using Interpreting: A Cross-platform Multi-core Solution. In Proceedings of PPoPP 2008.
1. IP分类问题(1) • 术语: • 包头H是有K个域的实体,每个域表示成H[i],每个域为一个比特串。 • 过滤规则F具有K个域,表示为F[i]。 • 与每个F[i]相关联的有一个匹配方式,可以是: • 精确匹配:F[i]用一个值来表示,若H[i]=F[i],称H[i]与F[i]精确匹配。 • 前缀匹配: F[i]通过一个前缀来指定,若H[i]与F[i]表示的前缀匹配,称H[i]与F[i]前缀匹配。 • 范围匹配: F[i]通过一个范围指定,即F[i]=[val1, val2],若满足val1≤ H[i] ≤ val2,称H[i]与F[i]范围匹配。 • 过滤规则F与包头H匹配,当且仅当H的每个域H[i]都与F相应的域F[i]匹配。
IP分类问题(2) • 定义: • 给定一个具有N条过滤规则的规则库Fdat,与每条规则f相联系有一个代价函数,记为cost(f),给定一个包头H,最佳规则匹配问题为在Fdat中查找满足下列条件的过滤规则fbest: • fbest是H的一个匹配过滤规则; • 在Fdat中不存在其它的过滤规则f,f与H匹配且满足cost(f)<cost(fbest)。 • IP分类问题是最佳过滤规则匹配问题的一个实例。 • IP分类问题中与每条规则相联系有一个ACTION,用来表示对满足相应过滤规则的包的处理动作。
IP分类问题(3) • 算法的评价指标: • 速度,这是评价IP分类算法的最重要标准。算法时间复杂度的3种评价标准: • 最坏情况:对一个包进行IP分类查找的最长可能时间。 • 平均情况:在随机情况下,对一个包进行分类查找的平均时间。 • 统计情况:在符合某种预先指定的包或过滤规则匹配率的分布下,对一个包进行分类查找的平均时间。 • 占用内存,包括规则库本身以及为高速查找而建立的各种数据结构占用的内存。 • 更新代价: • 完全更新:重新建立全部的查找数据结构。 • 增量更新:在查收数据结构中增加或删除一条过滤规则。 • 重组或平衡:在适当的时间重组数据结构使其恢复原来的效率。
IP分类问题(4) • 基本的解决思路: • 根据数据流的分布特点以及规则集中规则的分布特点设计分类算法。 • 将高维问题转化为二维乃至一维的问题,降低问题的复杂度。
2. 典型的IP分类算法 • 以Grid-of-Tries为代表的基于Trie树的算法 • 以比特矢量为代表的算法 • 以HiCuts为代表的决策树算法 • 以RFC为代表的算法
2.1 Hierarcical Trie 优点:算法简单、直接、便于硬件实现。 缺点:回溯时间长,对规则维数的扩展性差,不能直接支持范围匹配。
2.2 Set-Pruning Trie 优点:不需要回溯,查找时间短 缺点:空间复杂度高,不易更新。
2.3 Grid-of-Trie 优点:内存空间小 缺点:更新困难,在需要更新时最好重建这棵树。
多维IP分类 • 假定所有过滤规则的协议只取三个值:TCP、UDP和通配符(*),对于取值为通配符的过滤规则,将一条规则重复3次,分别对应TCP、UDP和所有其它情况(OTHER)。 • 根据目的端口和源端口的不同组合建立4个哈希表,分别对应(目的端口,源端口)二元组为(DstPort,*)、(DetPort,SrcPort)、(*,SrcPort)和(*,*)的情况。 • 每个哈希表项为一棵Grid of Tries树,哈希表的索引为相应的端口地址和协议号的某种组合(或函数)。 • 查找时,同时查找4个哈希表,分别用协议号和端口号的某种组合(或函数)作为索引,找到相应的Grid of Tries树;然后再根据Grid of Tries树的查找方法找到最小代价的过滤规则;取所有哈希表中的最好结果即为最佳匹配的规则。
2.4 比特矢量算法 缺点:算法运行时间随N的增大而线性增长,因而可扩展性差。
2.5 HiCuts算法 优点:占用内存空间小,规则集更新容易,直接支持范围匹配。 缺点:预处理时间较长,分类速度比一些快速包分类算法低。
2.6 Recursive Flow Classification(RFC) • S为包头中d个域形成的比特串的长度,若S位比特串的每一种可能取值对应一个等价类(用eqID表示),则分类问题可看成是根据包头中S位比特串确定其对应的eqID的问题。 • 当S很大时,从S位比特串直接映射到eqID需要消耗巨大的内存空间。 • RFC的基本思想是将一次映射转变为多阶段映射,其结果是将一个较大的集合映射成若干个较小的集合,达到减小内存需求的目的。 • 每一阶段映射称为一次缩减(reduction),由阶段映射构建的数据结构称为缩减树。
index eqID eqID CBM 0 0 0 0001 1 1 P 1 1 1101 2 2 2 0011 ... 7 0 index eqID eqID 0 Chunk0 0 0 eqID CBM eqID CBM 0 0 ... 0 0 0001 0 0001 1 0 8 0 1 1001 P 2 1 1001 2 1 9 1 2 0101 2 0111 ... 10 3 0011 0 7 0 11 2 eqID 1 OIndex Chunk1 12 0 eqID CBM 0 0 ... 0 0 0011 1 0 15 0 P 1 1111 3 2 0 16 3 3 17 3 1 eqID 2 cross-producting table ... 7 0 Chunk2 Phase 0 Phase 1 2阶段RFC缩减树 CBM位串标识 比特串:用于指示哪些规则匹配该域 域的可能值 由eqID0-eqID2 的值级联而成 由 eqID0-eqID2指示的CBM位串逐位相与而成
RFC的特点 • RFC是目前除硬件方案之外较快的多维包分类算法。 • 易于并行处理 • 处于同一阶段的预处理表或交叉乘积表可被并行地索引; • 处于不同阶段的表也可被并行地索引。 • 这些表各自独立,可分布于不同的存储单元中。 • RFC构建的交叉乘积表占用内存空间较多,存储空间消耗随规则集规模增大而迅速增大。
Bitmap RFC的数据结构 One entry
Compact table的数据结构设计考虑 • Element array的单元宽度:16比特 • Bitmap string长度:32比特的倍数 • Compact table的表项:由bitmap string和element array组成,长度不超过16个长字。
算法优化实现 • 内存压缩 • 指令选择:POP_COUNT,分支指令 • 数据分配:预处理表及各阶段CCPT表的存放 • 任务划分:multi-processing和context-pipelining • 延迟隐藏
实验设置 • 对IPv4数据包进行四维分类,应用三阶段的RFC和Bitmap-RFC: • 四个域:源IP地址,目的IP地址,源端口,目的端口,其中IP地址分为低16位和高16位两部分。 • 第一个阶段为6个预处理表,第二阶段为2个交叉乘积表,第三阶段为1个交叉乘积表。
实验设置(续) • 三组规则集(根据现有规则集的特征随机生成),每条规则定义4个域,IP地址采用CIDR前缀表示,端口采用数据范围表示: • CL#1: 1000条规则 • CL#2: 2000条规则 • CL#3: 3000条规则 • 测试数据包:使用49字节(20字节TCP头 + 20字节IP头 + 9字节PPP头) 的最小长度数据包作为输入,OC-192线速要求25.5Mpps的分类速度。
内存需求比较 • X, Y, Z: RFC的阶段1 (X, Y)和阶段2 (Z)交叉乘积表 (CPT) • X’,Y’,Z’: Bitmap-RFC的阶段1 (X’,Y’)和阶段2 (Z’)压缩的交叉乘积表 (CCPT)
相对加速比 • 实验使用最坏情况下的最小数据包作为输入,即每个包都要二次访存。 • 使用32个线程可以达到25.65Mpps,满足线速分类的要求。 • 相对加速比接近线性。
支持OC-192线速所需的最少线程数 • 这个实验使用随机生成的最小数据包作为输入
任务划分 • Context-pipelining的两种配置
multi-processing和context-pipelining的分类速度(Mpps)比较multi-processing和context-pipelining的分类速度(Mpps)比较
4. Two-stage Interpreting based Classification(TIC) • 三个观察事实: • 在定义IP分类规则时,地址用前缀表示,端口用范围表示。大多数分类算法只适用于前缀查找,对于范围查找,必须先进行范围-前缀转换,增加了规则数量。 • 前缀查找是访存密集的操作,范围查找是计算密集的操作,将两者分开处理有助于提高查找的效率。 • 对实际分类规则集统计特性的分析表明,在99.9%的情况下,匹配一对给定的<源IP地址,目的IP地址>的规则数不大于5。即在匹配了一对给定的IP地址后,进一步要匹配的范围个数非常有限。
两阶段的基于解释的包分类(TIC)算法 • 算法要点: • 降维:将匹配一对<源IP地址,目的IP地址>的过程与匹配其余3个域的过程分开,前者使用适合前缀查找的算法,后者使用适合范围查找的算法。 • 第二阶段用计算代替查找:在预处理阶段先将匹配一对<源IP地址,目的IP地址>的规则编成代码,第二阶段通过解释执行找到匹配的规则。
TIC的设计 • 第一阶段采用RFC算法,找到匹配一对<源IP地址,目的IP地址>的规则集,实际上得到的是指向对应该规则集的代码块的地址。 • 第二阶段查找由端口号和协议组成的范围表达式列表,范围被编码成一系列的ALU指令以进一步减小内存需求。 • 一个解释器从外部存储器装载代码块到内部存储器(如cache),然后解码并顺序执行指令,以找到一个匹配。
RFC与TIC的访存次数 • RFC需要13次访存,TIC至少需要8次访存。 • 94.9%的情况下,匹配一对地址的候选范围可以编码成一个64字节的代码块,在x86多核结构上TIC只需访存8次。 RFC-TIC 4阶段RFC
指令编码 • ClassBench定义了5种端口范围:WC(Wildcard)、HI(高端)、LO(低端)、AR(任意范围)和EM(精确匹配),以及两种协议范围:WC和EM。 • 采用CISC风格的指令,总共需要约5×5×2=50种操作符。 • 三种指令格式,分别带有1个、3个和5个操作数。
源端口和目的端口的分布 • 12字节的指令非常少见。 • 平均指令长度为1.8个长字。
算法实现平台 • 两种多核体系结构: • Intel Core 2 Duo: • 双核,4MB L2 Cache,64B Cache行大小。 • 用Linux的Pthread库实现TIC。 • Intel IXP2800: • 16个微引擎,每个微引擎8个硬件线程,4个SRAM控制器,3个DRAM控制器,640W本地存储器,没有cache,SRAM平均访问延迟150个时钟周期,DRAM平均访问延迟300个时钟周期。 • 用MicroengineC实现TIC。
基于体系结构的设计 • 空间压缩 • 数据局部性和对齐 • 数据分割 • 延迟隐藏
空间压缩 • 空间压缩的好处: • 压缩后的数据结构可放到较高等级的存储器中,减小访存延迟。 • 压缩可使cache或片上存储器存放更多的数据,减少访存次数。 • 压缩可提高cache或片上存储器的效率(命中率)。 • 减少访存次数和访存延迟可显著提高CPU的利用率。 • 两种压缩技术: • 两阶段包分类,消除了范围-前缀转换,抑制了规则数的增长。 • 采用CISC风格的指令编码进一步压缩范围列表占用的空间。
RFC和TIC的内存需求 • TIC算法最多可比RFC算法节省97%的存储空间。 • TIC的分类数据结构基本上可以放入4MB的L2 cache中。
TIC每个阶段的内存需求 • 第二阶段的代码块大多只有几百KB,完全可以放入L2 cache中。
数据局部性和对齐 • Intel Core 2 Duo(具有两级cache ): • 应将数据尽可能放入L2 cache。 • 为利用空间局部性,代码块长度应等于L2 cache行大小。 • 为避免cache行伪共享和代码块占据两个cache行,代码块首地址必须对齐。 • 本文选择代码块大小为64B。 • IXP2800(没有cache): • 可使用本地存储器存放要执行的代码块。 • 32B是合适的代码块长度; • 取64字节的代码块在很多情况下不必要。 • 每次读64字节使得SRAM通道利用率提高,SRAM read FIFO增大,从而导致SRAM访存延迟增大。
数据分割(IXP2800) • 为避免SRAM控制器成为瓶颈,缩减树和代码块被均匀分布到四个SRAM控制器上。
延迟隐藏 • IXP2800(多线程结构): • 尽可能一次发射多条访存指令,例如第一阶段的phase 0中四个访存操作可以一次发射。 • 重叠访存操作和ALU计算。 • Intel Core 2 Duo(多核结构): • 一个CPU核可用作助手线程填充L2 cache,其它CPU核就可快速地执行。 • 统一的L2 cache可以被用来减少访存延迟。
仿真实验设置 • 两个平台: • Intel Xeon 5160,两个酷睿双核核心封装在一个芯片中,2×2MB L2 cache,3.0GHz主频,1333MHZ总线。 • Intel IXP2800,1.2GHz主频,16个微引擎,4个SRAM控制器,每个SRAM通道64MB。 • 规则集: • 使用ClassBench生成10个规则集,规模为2K和4K。 • 输入包流: • 使用最小长度的包(49字节)作为最坏情况下的输入,OC-192线速要求包的处理速度为25.5Mpps。
加速比实验的结果 • 在Intel Xeon 5160上的实验: • 平均来说,TIC需要3个CPU核达到10Gbps线速及以上。 • TIC和RFC在速度上相当,速度差异在个位数内。 • 如果RFC的内存空间小于L2 cache的大小,则RFC的分类速度高于TIC,否则TIC的分类速度一般高于RFC。 • 在IXP2800上的实验: • 平均来说,TIC需要4个微引擎达到10Gbps线速。 • RFC运行得比TIC快。