【hyperscan】hyperscan开源了!
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开源了!的更多相关文章
- [hyperscan] hyperscan 1到1.5 --!!
[hyperscan][pkg-config] hyperscan 从0到1路线图 接续前文,继续深入理解: 概述: 1. 自动机理论,是hyperscan的理论基础. https://zh.wik ...
- 如何在windows下成功的编译和安装python组件hyperscan
摘要:hyperscan 是英特尔推出的一款高性能正则表达式引擎,一次接口调用可以实现多条规则与多个对象之间的匹配,可以支持多种匹配模式,块模式和流模式,它是以PCRE为原型开发,并以BSD许可证开源 ...
- [hyperscan][pkg-config] hyperscan 从0到1路线图
经过一系列的研究学习,知识储备之后,终于,可以开始研究hyperscan了. [knowledge][模式匹配] 字符匹配/模式匹配 正则表达式 自动机 [knowledge][perl][pcre] ...
- FD.io社区中国行暨未来网络技术沙龙·南京站 会议小结
What is FD.io VPP? FD.io VPP(Fast Data Input/Output Vector Packet Processing)is a new network multi- ...
- [转]awsome c++
原文链接 Awesome C++ A curated list of awesome C++ (or C) frameworks, libraries, resources, and shiny th ...
- Hyperscan与Snort的集成方案
概况 Hyperscan作为一款高性能的正则表达式匹配库,非常适用于部署在诸如DPI/IPS/IDS/NGFW等网络解决方案中.Snort (https://www.snort.org) 是目前应用最 ...
- Hyperscan 介绍与安装【转】
来源:http://blog.sina.com.cn/s/blog_913a533b0102wc38.html Hyperscan 介绍与安装 (2016-01-27 16:22:32) 转载▼ ...
- hyperscan在低版本系统应用问题
编译环境:centos6.3 32位/64位 由于hyperscan使用许多C++11特性,在低版本系统gcc版本不能编译.后来发现在runtime时也就是hs_scan时只需要依赖libhs_run ...
- hyperscan简单学习(2)
对hyperscan官方的前两个example进行编译和运行. 支持单个和多个正则编译.并行匹配规则,性能高. 对块模式和流模式使用: 示例pcapscan: http://www.cnblogs.c ...
随机推荐
- 459. Repeated Substring Pattern
https://leetcode.com/problems/repeated-substring-pattern/#/description Given a non-empty string chec ...
- 34、iOS App图标和启动画面尺寸
注意:iOS所有图标的圆角效果由系统生成,给到的图标本身不能是圆角的. 1. 桌面图标 (app icon) for iPhone6 plus(@3x) : 180 x 180 for iPhone ...
- Servlet WebSocket的简易聊天室
添加依赖 <!-- websocket --> <dependency> <groupId>javax.websocket</groupId> < ...
- 点击文字弹出一个DIV层窗口代码
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...
- Android 全局搜索条写成自定义控件-曹永思
图文: 1.Android 自定义控件的布局文件 2.编写Android 自定义控件的要处理的逻辑代码(曹永思) 3.在调用自定义控件的 Activity的布局文件中调用Android 称之为控件,控 ...
- C#重点内容之:事件(Event)
一.事件的五个组成部分 事件的五个部分: 事件拥有者(对象) 事件成员(Event ,成员) 事件的响应者(对象) 事件处理器(成员,本质是一个回调方法) 事件订阅——把事件处理器与事件关联在一起 二 ...
- 7-12 How Long Does It Take
Given the relations of all the activities of a project, you are supposed to find the earliest comple ...
- 改Android手机定位位置
手机定位方法 1,gps等卫星定位,如美国的gps,欧洲的伽利略,中国的北斗等,通过至少三颗卫星,用三角定位和时间等算法,计算出设备的经纬度,到地图上找到这个经纬度的地名 2,移动运营商基站定位,通过 ...
- java重定向与请求转发的区别
最近工作不算太忙,今天在这里对java中的重定向和请求转发稍作总结,希望能帮助到大家. 请求转发: request.getRequestDispatcher().forward(); 重定向: res ...
- android PendingIntent 使用通知传递多个参数,及不覆盖的问题
Intent updateIntent = new Intent(GetNoticeService.this, DetailGonggaoActivity.class); updateIntent.p ...