HiPAC高性能规则匹配算法之查找过程

收到一封邮件,有位朋友觉得我误解了nf-HiPAC,如此的一个高性能算法怎能被什么传统的hash,tree之类的胁迫。是啊,HiPAC是一个很猛的算法,文档也比较少,这就更加增加了其神秘感,但是这决不意味着它是不可理解的,相反,它的思想很简单。
       HiPAC算法本质上是一种基于优先级的区间匹配算法,怎么理解呢?我们把匹配域定义成一个连续的区间,那么每一条Rule则定义了该区间的一段子区间,如果多条规则覆盖了相同的子区间,那么就涉及到了优先级的问题,这个在防火墙的访问控制列表中很有用,在存在多条Rule的情况下,先定义的那条Rule优先级最高。用一幅图表示上面的陈述会比较好些:




在上图中,定义了5条Rule,其中Rule1的优先级最高,Rule5优先级最低,表示在图上就是从下到上优先级逐次降低。按照上图所示,各个区间的匹配如下:
区间1:匹配Rule5;
区间2:匹配Rule3,Rule5;
区间3:匹配Rule2,Rule3,Rule5;
区间4:匹配Rule2,Rule3,Rule4,Rule5;
区间5:匹配Rule1,Rule2,Rule3,Rule4,Rule5;
区间6:匹配Rule1,Rule3,Rule4,Rule5;
区间7:匹配Rule1,Rule4,Rule5;
区间8:匹配Rule1,Rule4;
区间9:匹配Rule4;
区间10:没有任何Rule匹配!
如果一个match落在了区间5,那么它到底匹配哪个Rule呢?在区间5从下到上贯穿一条线,首先穿透的是Rule1,因为它的优先级最高,所以便匹配Rule1;如果一个match落在了区间2呢,从下到上最先贯穿Rule3,因此它便匹配Rule3;如果一个match落在了区间1,那么由于只贯穿了Rule5,因此就匹配Rule5;如果落在了区间10,很抱歉,没有任何一条Rule被贯穿,说明没有任何规则被匹配!
       基本就是这样的!那么可能你会问,如果有多个match怎么办?比如下面的规则,我当然以我们最熟悉的iptables举例,虽然我要将HiPAC移植到iptables还需要几个周末:
iptables -A FORWARD -s $ip1 -d $ip2 -p udp -j DROP
在这个规则里,我一共展示了3个match,分别是ip1,ip2,udp,因此就需要3个上面的图吗?是的!这就是所谓的多维HiPAC匹配,只是个词汇罢了,我不喜欢引申定义。由于第一张图在某些区间已经排除了若干Rule,因此后面的图中很多的Rule便不用画出来了。
       为了展示一下整理的查找过程,我画了一个相对简单的图,一共3个match,具体的匹配过程都在图里面,就不再用文字细说了:



关于HiPAC算法要说的是优先级匹配是关键,如果还需要继续匹配match,我们说就是延展了一个维度,查找顺着树继续向下,如果不需要继续匹配match了,那么就在当前区间从下向上贯穿一条线,首先碰触到的Rule就是匹配的规则。在上图中有很多的Rule都被画成了虚线,这是因为该条Rule在上一个层次或者说维度已经被排除了,因此画贯穿线时应该忽略掉虚线。
       如果理解了这个过程,就会发现它是超级高效的,无须回溯,无须依赖复杂的hash算法,无须依赖hash散列的程度,和输入数据无关,多少个匹配就有多少层,至于如何来维护这个算法,那就是实现问题了。本质上这还是一个树型数据结构,巧妙点在于其结构。
       本文仅仅给出了一个概览,至于HiPAC算法的插入,删除,查找,背后有很复杂的数学原理,作为工程技术人员,理解这些数学是必要的,虽然关于HiPAC的HOWTO不多,但是相关论文还是不少的。
       就为了回复一封邮件,又写了一篇文章,老婆和丈母娘在看《红高粱》的大结局,小小在玩iPad,我在餐桌上画那个复杂的图,这就是不喝酒的好处,否则此时我估计又在梦里云游了....白天忙了一天,对于论坛以及远方朋友的相求,我还是必应的,就当是学习了。不过,我还是希望晚上到家不再动任何技术问题,起初强制自己晚上不再喝酒不是为了搞网络技术的,也不是为了写代码的,而是想给自己充下电,充实一下自己的,看点历史,洗涤一下心灵,比如还可以学学烹饪,装潢设计之类的。
nf-HiPAC能十分高效的在linux 2.4的netfilter构架下执行包过滤。它一个用户空间工具,称作“nf-HiPAC”,它被设计为完美兼容'iptables -t filter'。 'nf- hipac'和使用相同的钩子钩在linux 2.4核心的网络栈中,'iptables -t filter'也一样做。用户空间的工具能定义每一个规则在一个数组成的分类器中,能随意对某一连接产生作用。最大的优势在于能够兼容iptables, 用户能够充分按iptables的语法进行设置。 你或许会问:“为什么要使用另外一个包过滤器?” 最短最好的回答是:“性能!” iptables,象更多的包过滤,使用一个简单的包分类算法,对线性的穿过一个链中的每一个包在进行匹配(非)一个规则。明显的,这个方法缺乏效率。 nf-HiPAC ,提供一个新颖包分类的架构。当查找每一个包的时候使用一个高级算法来减少内存占用。在一个有特别多的规则和高带宽的网络中nf-HiPAC表现十分完美。 功能: 充分优化以实现适度内存占用和高性能的包分类 完全动态: 当插入或者删除规则时数据结构没有重建,高速更新成为可能。 在规则更新时,只很短暂时间的锁定,包匹配没有锁定。 支持64位体系。 优化核心用户空间协议(netlink),改良列表速度。 libnfhipac: netlink library for kernel-user communication 原始匹配支持: 源/目的 ip in/out 网络界面 协议 (udp, tcp, icmp) 包分段 源/目的 端口 (udp, tcp) icmp 类型 tcp 标记 ttl 连接状态匹配 match negation ("!") iptables 兼容: 语法和语义同iptables十分相似。 nf-HiPAC和iptables二者可以同时使用 安装需要环境: linux 2.6.26.5 内核源代码 iptables 1.4.4 源代码
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值