收到一封邮件,有位朋友认为我误解了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。我在餐桌上画那个复杂的图,这就是不喝酒的优点,否则此时我预计又在梦里云游了....白天忙了一天,对于论坛以及远方朋友的相求,我还是必应的,就当是学习了。

只是,我还是希望晚上到家不再动不论什么技术问题,起初强制自己晚上不再喝酒不是为了搞网络技术的,也不是为了写代码的,而是想给自己充下电。充实一下自己的,看点历史。洗涤一下心灵。比方还能够学学烹饪,装潢设计之类的。

HiPAC高性能规则匹配算法之查找过程的更多相关文章

  1. 命题作文:在一棵IPv4地址树中彻底理解IP路由表的各种查找过程

    这是一篇命题作文.近期一直想写点东西,但一直找不到题目.正好收到一封邮件,有人问我Linux路由表的布局问题以及路由缓存的问题,加之前些日子又帮人做了一个片上路由表,所以认为这是个好题目,索性花了多半 ...

  2. php中include包含文件路径查找过程

    首先,“路径”分为三种: 1.绝对路径,以/开头(unix系统)或c:等盘符开头(windows系统). 2.相对路径,以.开头,有./(当前目录)和../(上级目录). 3.其他路径,不是绝对路径和 ...

  3. 什么是maven,jar包的查找过程?

    1.什么是maven? Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件. 2.什么是项目管理工具? 就是SVN.对于SVN的介绍见我的上一篇博客 ...

  4. Hbase region查找过程

    HBase的table是该region切分的,client操作一个row的时候,如何知道这个row对应的region是在哪台Region server上呢?这里有个region location过程. ...

  5. CQengine高性能内存数据缓存查找框架

    CQengine可实现高性能内存数据缓存查找 CQEngine 需要设置字段对应的属性以方便访问与查询 主要有属性链接 SimpleAttribute(不能为空) SimpleNullableAttr ...

  6. 高性能Java解析器实现过程详解

    如果你没有指定数据或语言标准的或开源的Java解析器, 可能经常要用Java实现你自己的数据或语言解析器.或者,可能有很多解析器可选,但是要么太慢,要么太耗内存,或者没有你需要的特定功能.或者开源解析 ...

  7. hadoop中的一次集群任务执行超时问题查找过程

    问题背景 本次进行一个项目的重构,在某些活动数据量比较大的情况下,会偶尔出现1200s超时的情况,如下: AttemptID:attempt_1410771599055_11709_m_000033_ ...

  8. 通用的规则匹配算法(原创)(java+.net)

    1.java里可以使用Spring的 Spel或者Google的Aviator 如果使用 Aviator 则添加以下依赖 <dependency> <groupId>com.g ...

  9. JVM系列(四):java方法的查找过程实现

    经过前面几章的简单介绍,我们已经大致了解了jvm的启动框架和执行流程了.不过,这些都是些无关痛痒的问题,几行文字描述一下即可. 所以,今天我们从另一个角度来讲解jvm的一些东西,以便可以更多一点认知. ...

随机推荐

  1. win7+Powerpoint2007下设置演讲者视图,两步搞定

    步骤1: 步骤2: 这样,你就可以对着ppt的备注讲解了,且用户看不到你的备注以及你的电脑桌面.cool!

  2. Jexus + Kestrel 部署 asp.net core

    结合Jexus + Kestrel 部署 asp.net core 生产环境 ASP.NET Core 是微软的全新的框架.这一框架的目标 ︰ 跨平台 针对云应用优化 解除 System.Web 的依 ...

  3. Taking Pictures Using FireMonkey Interfaces

    http://docwiki.embarcadero.com/RADStudio/Seattle/en/Taking_Pictures_Using_FireMonkey_Interfaces

  4. VC/MFC 使edit控件不能进行粘贴操作

    这里使用消息拦截的方法 BOOL PersonDlg::PreTranslateMessage(MSG* pMsg) { if (GetDlgItem(IDC_EDIT_USER_ID)->m_ ...

  5. iOS UIScrollView 停止滑动 减速

    1.UIScrollView 减速 可能通过decelerationRate的属性来设置,它的值域是(0.0,1.0),当decelerationRate设置为0.1时,当手指touch up时就会很 ...

  6. python random模块 - 小驹的专栏 - 博客频道 - CSDN.NET

    python random模块 - 小驹的专栏 - 博客频道 - CSDN.NET python random模块 分类: python 2011-11-15 15:31 6037人阅读 评论(2) ...

  7. Java深入解析读书笔记(一)

    1. goto,const为java的两个保留关键字,无任何应用语法.因此从不使用.   goto 使用循环标签:if,break out,here实现goto的功能. 2. 标识符:可由字母数字下划 ...

  8. hdu 4284 Travel(floyd + TSP)

    虽然题中有n<=100个点,但实际上你必须走过的点只有H<=15个.而且经过任意点但不消耗C[i]跟D[i]可以为无限次,所以可以floyd预处理出H个点的最短路,之后剩下的...就成了裸 ...

  9. docker 私有仓库查询

    docker:/etc/init.d# docker ps -a | grep reg c7d5592a3658 registry "docker-registry" 11 min ...

  10. 《sql---教学反馈系统-阶段项目1》

    --修改列 --把 "Address" 栏位改名为 "Addr".这可以用以下的指令达成: --ALTER table customer change Addr ...