hyperscan开源了!

官网:https://01.org/zh/hyperscan

1. 新闻背景

当地时间10月19日,intel将它的高速正则表达式匹配引擎hyperscan开源了,版本4.0,基于BSD许可。这个基于自动机(Automata)的引擎经过了多年开发(2008年起),经过不断优化与完善,效率非常之高,虽然没有pcre等对正则语法支持全面,但非常适用于网络设备。用户可以在网络设备数据面(Data Plane)使用hyperscan进行规则匹配,实现高性能DPI/lPS/IDS等应用。之前开源的dpdk,搭配hyperscan,简直是双剑合璧。

从此之后,DPI/IPS/IDS/NGFW开发人员可以把精力更多地放在业务上,而不需要苦于优化报文转发(dpdk之功)和规则匹配(hyperscan之力)的性能。对于DPI来说,从此之后,也许特征/规则才是核心价值,软件本身已经不重要了。而基于dpdk的软件产品,凭借其不输太多的性能、较低的成本、较低的开发门槛和灵活性,也对相同功能的硬件产品发起了挑战。

2. 技术细节

hyperscan的实现基于自动机(automata,  如NFA/DFA)而不是回溯(back-tracking)。这么做有好有坏。好处是可以支持流模式(streaming)和多模正则表达式;坏处是,基于自动机的正则匹配无法很容易地处理某些正则构造 -  backreferences and arbitrary lookaround asserts(好吧,我也不知道这俩到底啥意思)是不支持的两个主要特性。

hyperscan所使用的一些技术包括:

Discovery of literal (fixed string) factors and decomposition of regular expressions into smaller chunks (which we call "engines") separated by these literal factors.
These engines can be of many different types:
Deterministic Finite Automata (DFA)
Bit-parallel Glushkov Non-deterministic Finite Automata (NFA) engines
Custom engines for special cases (such as large bounded repeats).
These engines can take many different roles:
"Prefix" engines that precede our literal factors
"Suffix" engines that follow our literal factors
"Infix" engines that lie between two literal factors
"Outfix" engines that aren’t connected at all with literal factors (when no satisfactory factors can be found in a regular expression)
These engines can often run lazily or not at all to reduce overhead.
We merge smaller DFA/NFA engines into larger ones, where this can be done without performance loss.
SIMD "acceleration" of automata based scanning: where we can substitute relatively simple SIMD tests of our input for complex automata execution, we do it.
We use Intel SIMD instructions to handle larger-scale NFA and literal matching tasks: having 128 or 256 (or more) bits for a bit-parallel automaton is often helpful.
... and many more short-cuts to attempt to avoid doing expensive automata calculations that we ultimately won’t need.

hyperscan设计目标:

  • 高性能,包括正常应用场景和边界条件下
  • 较小的database(正则表达式编译后形成的数据)
  • 运行于流模式时,较小的流状态数据(stream state) 。这种模式下每条流都要维护自己的流状态。

另外,还有一些设计要求或限制:

  • 运行库必须以C实现,因为一些数据面环境不支持C++
  • 不可以在运行时任意请求内存,用到的内存仅包括database、匹配临时数据(scratch)和流状态(在流模式下)。
  • database必须是平面化(flat)的内存布局,以便可以序列化/反序列化,或者可以内存中的一处移动到另一处(这意味着内部不能含有指针)

3. API介绍

hyperscan以C++实现,使用了boost库和C++11特性,但它的API却以简洁的C形式提供。hyperscan API主要分为两个部分:编译与匹配 (compile & scan)。用户提供的多个正则表达式先要经过编译,生成database,然后才可以调用匹配接口,使用此database进行匹配。

编译就是将多个正则表达式编译为hyperscan database,调用编译接口时可以传入一些flags和mode等参数,控制匹配行为和运行模式。hyperscan的运行模式主要有3个:BLOCK、STREAM和VECTORED。BLOCK模式就是对多个数据块分别进行匹配;STREAM模式将特定的一组数据库视为一个STREAM,为每一个STREAM维护状态信息,它可以跨数据块进行匹配;VECTORED模式可以一次匹配多个数据块。使用不同模式参数编译的database在匹配时不能混用。

hyperscan的database可以序列化成文件(当然也可以反序列化),也可以在不同机器间进行传递。

编译的API主要有

hs_compile()
hs_compile_multi()
hs_compile_ext_multi()

匹配就是基于编译好的database,对数据进行匹配,并得到匹配结果。 hyperscan在进行匹配时需要有一个临时数据(scratch),这块数据需要在数据面运行前就分配(不在运行时分配和释放,保证性能),且需要保证同一时刻仅有一个匹配过程在使用同一块临时数据。如果使用流模式,还需要预先为每个流分配流状态数据。

匹配结果是通过用户自定义的回调函数获取的。匹配过程中只要发生命中,就会调用此函数。此函数返回0表示继续匹配,非0表示停止匹配。此函数的原型由hyperscan约定,用户通过实参,可以获得命中正则表达式对应的ID、匹配位置等信息。

匹配回调函数的原型:

typedef (* match_event_handler)(unsigned int id,
unsigned long long from,
unsigned long long to,
unsigned int flags,
void *context)

匹配的API主要有

hs_scan()
hs_scan_vector()
hs_scan_stream()

流模式的匹配较为复杂,这里不提及,下文有相关示例解读。

【hyperscan】hyperscan开源了!的更多相关文章

  1. [hyperscan] hyperscan 1到1.5 --!!

    [hyperscan][pkg-config] hyperscan 从0到1路线图 接续前文,继续深入理解: 概述: 1.  自动机理论,是hyperscan的理论基础. https://zh.wik ...

  2. 如何在windows下成功的编译和安装python组件hyperscan

    摘要:hyperscan 是英特尔推出的一款高性能正则表达式引擎,一次接口调用可以实现多条规则与多个对象之间的匹配,可以支持多种匹配模式,块模式和流模式,它是以PCRE为原型开发,并以BSD许可证开源 ...

  3. [hyperscan][pkg-config] hyperscan 从0到1路线图

    经过一系列的研究学习,知识储备之后,终于,可以开始研究hyperscan了. [knowledge][模式匹配] 字符匹配/模式匹配 正则表达式 自动机 [knowledge][perl][pcre] ...

  4. FD.io社区中国行暨未来网络技术沙龙·南京站 会议小结

    What is FD.io VPP? FD.io VPP(Fast Data Input/Output Vector Packet Processing)is a new network multi- ...

  5. [转]awsome c++

    原文链接 Awesome C++ A curated list of awesome C++ (or C) frameworks, libraries, resources, and shiny th ...

  6. Hyperscan与Snort的集成方案

    概况 Hyperscan作为一款高性能的正则表达式匹配库,非常适用于部署在诸如DPI/IPS/IDS/NGFW等网络解决方案中.Snort (https://www.snort.org) 是目前应用最 ...

  7. Hyperscan 介绍与安装【转】

    来源:http://blog.sina.com.cn/s/blog_913a533b0102wc38.html Hyperscan 介绍与安装 (2016-01-27 16:22:32) 转载▼   ...

  8. hyperscan在低版本系统应用问题

    编译环境:centos6.3 32位/64位 由于hyperscan使用许多C++11特性,在低版本系统gcc版本不能编译.后来发现在runtime时也就是hs_scan时只需要依赖libhs_run ...

  9. hyperscan简单学习(2)

    对hyperscan官方的前两个example进行编译和运行. 支持单个和多个正则编译.并行匹配规则,性能高. 对块模式和流模式使用: 示例pcapscan: http://www.cnblogs.c ...

随机推荐

  1. ios 数组和字典

    一.数组.  数组只能存放对象类型的数据  2.数组中的对象是有序的 (index)     (一)可变数组   NSArray:NSObject  不可变数组 作用:容器类 存放的是对象类型的数据, ...

  2. 2018.11.06 NOIP训练 简单的计数问题(计数dp)

    传送门 直接f[i][j]f[i][j]f[i][j]表示已经到第iii个位置已经找到jjj个的方案数. 简单转移一下就行了. 代码

  3. MFC控件Slider Control的使用

    写MFC界面程序时,今天恰好用到Slider控件,做一个小小的记录. 步骤 1.在工具栏中添加Slider Control控件: 2.在控件上右键->添加变量(Add Variable...), ...

  4. Le Chapitre IV

    J'avais ainsi appris une seconde chose très importante: C'est que sa planète d'origine était à peine ...

  5. jquery checkbox反复调用attr('checked', true/false)只有第一次生效 Jquery 中 $('obj').attr('checked',true)失效的几种解决方案

    1.$('obj').prop('checked',true) 2. $(':checkbox').each(function(){ this.checked=true; }) 为什么:attr为失效 ...

  6. vue中的路由嵌套

    1定义组件 const Index = { template:` <div>首页</div> ` } const Order = { template:` <div> ...

  7. 关于DOM级别的一些问题,DOM0,DOM1,DOM2

    之前看书没太注意这个问题,直到我今天看书看到一个DOM0级,于是我就在群里问了下各个级别的意思区别.. 首先我们的确定标准了是没有DOM0级的.在平时阅读的时候可能会读到DOM0级(DOM Level ...

  8. 开源javacsv读取csv文件

    一.下载地址:https://sourceforge.net/projects/javacsv/ 读取示例: public static void main(String[] args) { // 1 ...

  9. ACtiveMQ中间件-发布订阅模式

    前言:ActiveMQ学习心得 1.MQ是什么 MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信, ...

  10. ID、句柄、指针、对象互相转换

    /*************************************************************************************************** ...