Hyperscan的调用分为两个阶段:编译期和运行期。在使用前,用户需要提前为运行期选择一个合适的运行模式,并在编译期就将此参数传入Hyperscan。该运行模式的选择取决于用户的使用场景,最常用的两种分别为块模式与流模式。
本篇将对这两种模式做具体的介绍。
1、块模式(Block Mode)
块模式是Hyperscan中基础的模式,调用函数为hs_scan()。用户每次调用时,将对一段完整的数据块进行匹配。匹配只限于该数据块内,而与上一次的hs_scan() 调用无关。在通常情况下块模式是所有模式中最高效的。
使用场景:
- 用户只有一段完整的数据需要扫描,而没有更多关联的上下文时,推荐使用块模式。如对本地的数据库文本进行扫描;
-
若用户的数据为多个独立的数据包,并希望在各个数据包内寻找匹配时,更适合使用块模式;此时Hyperscan会返回相对于每个数据包头的匹配位置。
2、流模式(Streaming Mode)
在真实网络场景下,数据被拆分成多个报文发送,在只接收到部分数据流的情况下使用块模式匹配会导致跨数据流的匹配点被遗漏,可行的方法只有等全部数据流接收完成后再统一进行匹配,此举会增加内存的开销及报文处理的复杂度。
由此,在Hyperscan中我们引入流模式。通过额外的流内存对流匹配信息进行记录,保证在丢弃了过去所有流数据的情况下匹配过程仍然能够正确执行。
流内存(Stream State):
流内存是一段与Hyperscan数据库关联的缓存,它的长度在编译时确定。对于一个编译出的数据库,与它关联的所有流内存都需要各自分配独立的空间。流内存里存储着所有与流的边界相关的状态信息。

本文详细介绍了Hyperscan的块模式和流模式,分别适用于完整数据块扫描和流数据处理场景。讨论了两者性能对比、选择建议,以及在不同技术应用场景中的优化实践。

1657

被折叠的 条评论
为什么被折叠?



