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

收到一封邮件,有位朋友认为我误解了nf-HiPAC。如此的一个高性能算法怎能被什么传统的hash,tree之类的胁迫。是啊。HiPAC是一个非常猛的算法。文档也比較少,这就更加添加了其神奇感,可是这决不意味着它是不可理解的。相反。它的思想非常easy。


       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算法的插入,删除,查找。背后有非常复杂的数学原理,作为project技术人员,理解这些数学是必要的,尽管关于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 源代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值