收到一封邮件,有位朋友认为我误解了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. Delphi的TService的輸入桌面切換(服务程序)(windows登录界面如何截图)(使用了OpenDesktop和GetThreadDesktop等API)

    dfm: object CopyDeskService: TCopyDeskService  OldCreateOrder = False  OnCreate = ServiceCreate  OnD ...

  2. Oracle PL/SQL 非预定义异常、自定义异常处理、RAISE_APPLICATION_ERROR

    抛出异常 Oracle有三种类型的异常错误: 1. 预定义(Predefined)异常 ORACLE预定义的异常情况大约有24个.对这种异常情况的处理,无需在程序中定义,由ORACLE自动将其引发. ...

  3. Swift - 解析XML格式数据(分别使用GDataXML和DDXML)

    在做一些应用的时候经常需要用到XML解析,比如获取Web Service数据,读取RSS新闻或者博客数据源.下面演示了两个非常方便高效的XML库在Swift里的调用方法. 假设需要被解析的XML数据文 ...

  4. Swift - 加速传感器(CoreMotion)的用法,小球加速运动并反弹样例

    1,加速传感器可以监听到x,y,z三个方向的加速度,使用步骤如下: (1)实例化CMMotionManager类 (2)向CMMotionManager的accelerometerUpdateInte ...

  5. python 多线程一(lock)

    ''' Created on Jun 17, 2013 @author: smp ''' #-*- coding:utf-8 -*- import threading import time coun ...

  6. OpenJDK1.8.0 源码解析————HashMap的实现(一)

    HashMap是Java Collection Framework 的重要成员之一.HashMap是基于哈希表的 Map 接口的实现,此实现提供所有可选的映射操作,映射是以键值对的形式映射:key-v ...

  7. jsonp与cors跨域的一些理解(转)

    CORS其实出现时间不短了,它在维基百科上的定义是:跨域资源共享(CORS )是一种网络浏览器的技术规范,它为Web服务器定义了一种方式,允许网页从不同的域访问其资源.而这种访问是被同源策略所禁止的. ...

  8. Infinite scroll has been called autopagerize, unpaginate, endless pages

    http://www.infinite-scroll.com/ Infinite scroll has been called autopagerize, unpaginate, endless pa ...

  9. Java核心技术-高级特性(2)- SoftReference, WeakReference and PhantomReference

    Java.lang.ref 是 Java 类库中比较特殊的一个包,它提供了与 Java 垃圾回收器密切相关的引用类.这些引用类对象可以指向其它对象,但它们不同于一般的引用,因为它们的存在并不防碍 Ja ...

  10. JavaScript学习总结1

    /***我是切割线 的開始***/ //利用prototype属性能够加入公有属性和方法 function myConstructor2(){ this.a='大灰狼'; }; //声明构造函数,能够 ...