hyperscan技术

一、概念

Hyperscan是一个高性能的正则表达式匹配库,设计用于高速、大规模和并发的匹配需求。它最初是由Intel开发的,现在已经是一个开源项目。Hyperscan是许多安全和网络应用中的关键组件,因为它可以非常快速地在大量文本中搜索多个正则表达式模式。

其中使用hyperscan分为四个过程:
①用户需要先调用Hyperscan编译函数来生成一个数据库;

②然后为运行期的匹配分配一个scratch内存;

③以数据库、scratch内存和提供的用户回调函数作为输入触发hs_scan()进行匹配;

④每次在输入数据中发现匹配,Hyperscan都会调用用户定义的回调函数。

hyperscan技术_第1张图片

1.Hyperscan“数据库”(hs_database_t)

是一个核心组件,它包含了预先编译的正则表达式模式。这些模式在被添加到Hyperscan数据库之前,会经过一个特殊的编译过程,以便能够高效地进行匹配。这个过程是通过Hyperscan的编译API完成的,其结果是一个hs_database_t结构,通常被称为“Hyperscan数据库”。

1. 预编译:为了高速匹配,Hyperscan需要先将用户提供的正则表达式模式编译到内部表示形式。这样做可以优化搜索过程,确保模式匹配尽可能快。这个过程是通过Hyperscan的编译API完成的,其结果是一个hs_database_t结构,通常被称为“Hyperscan数据库”。这个预编译过程做了很多优化工作,确保在实际扫描时能够高效地匹配正则表达式模式。这包括重新组织和优化正则表达式模式,可能还包括将某些模式合并为更大的模式以提高匹配速度。

2. 数据库的生命周期:
   - 预编译:用户首先需要使用Hyperscan的API编译他们的正则表达式模式集。这将生成一个hs_database_t对象。
   - 扫描:一旦数据库被编译,它就可以被用来扫描文本并查找匹配的模式。
   - 销毁:当数据库不再需要时,它应该被销毁以释放内存。

3. 序列化和反序列化:Hyperscan允许你将编译后的数据库序列化到磁盘文件,并在以后重新加载。这样,如果你有一个固定的模式集,你就不必每次都重新编译它了。

简而言之,Hyperscan数据库是一个包含预先编译的正则表达式模式的结构,允许快速、高效地在大量数据中进行多模式匹配。

Hyperscan提供了3个API函数将正则表达式规则编译成数据库。

(1)hs_compile():将单个规则编译成数据库。

(2)hs_compile_multi():将一组规则编译成数据库。

(3)hs_compile_ext_multi():将一组规则编译成数据库,并支持扩展参数。

2.scratch内存

运行期扫描数据时,Hyperscan需要少量临时内存来存储匹配中间状态。但是,相对栈来说这个临时内存太大,特别是相对嵌入式应用程序,而动态分配内存开销太大,不适合使用堆分配的内存。因此需要为扫描功能预分配scratch内存。

Hyperscan的API函数hs_alloc_scratch()分配了足够大的scratch内存来支持给定的数据库。即使有多个不同的数据库,也只需要一个scratch内存。但是在这种情况下,需要为每个数据库都调用一次hs_alloc_scratch()(使用相同的scratch指针)来确保scratch内存足够大以支持扫描任何一个给定的数据库。scratch内存是不可重入的,如果想实现递归或者嵌套扫描(在回调函数中扫描),则需要分配额外的scratch内存。在没有递归的情况下,每个扫描线程只需在扫描开始之前分配一个scratch内存即可。如果是一个主线程进行编译,多个工作线程使用主线程编译的数据库进行扫描的场景,可以用更便捷的hs_clone_scratch()为每个工作线程通过复制的方式来分配scratch内存,而不必让每个工作线程都去调用hs_alloc_scratch()。

3.匹配

Hyperscan提供了三种主要的扫描模式来适应不同的应用场景。这三种模式分别是块模式、流模式和向量模式。以下是对这三种模式的详细说明:

1. 块模式
   - 描述:块模式是Hyperscan的基础模式,适用于扫描单个连续的数据块。
   - 应用场景:当你有一个确定大小的数据块并且想在这个数据块上执行正则表达式匹配时,块模式是最适合的。
   - API:使用hs_scan()函数来在一个数据块上执行匹配。

2. 流模式 
   - 描述:流模式允许用户扫描跨多个数据块的数据流。它记住了之前的数据块,并能够识别跨数据块边界的模式。
   - 应用场景:这是为那些需要在持续的数据流(例如网络流量或文件流)上执行正则表达式匹配的场景设计的。
   - API:首先使用hs_open_stream()开始一个新的流,然后使用hs_scan_stream()扫描数据,并最后使用hs_close_stream()关闭流。

3. 向量模式 
   - 描述:向量模式允许用户在多个数据块上进行同时扫描,每个数据块可以有不同的长度。这个模式能够并行地在多个数据块上执行正则表达式匹配。
   - 应用场景:当你有多个数据块并希望一次性扫描它们,例如从多个文档或消息中提取数据时,向量模式是很有用的。
   - API:使用hs_scan_vector()函数来在一系列的数据块上执行匹配。

每种模式都有其特定的用途和优点。选择哪种模式取决于你的应用的需求和数据的特性。例如,对于网络流量分析,流模式可能是最合适的,因为它允许你处理断开的数据包。而对于在一组文档上执行正则表达式匹配,向量模式可能是最有效的。
 

你可能感兴趣的:(算法,安全知识,suricata,网络安全)