问题1:Hyperscan中c API包括编译和扫描两部分。那么什么是编译,什么是扫描。
答:编译就是Hyperscan根据传入的正则表达式转换对应模式数据库。就是调用,hs_compile()或hs_compile_multi()或hs_compile_ext_multi()函数的部分。而扫描就是传入数据源和回调函数,数据库,和scratch进行匹配的过程。例如块模式下调用hs_scan函数。
问题2:Hyperscan运行模式分为两种,有什么区别?
答:Hyperscan模式分为两种:
一种是块模式,块模式就是调用hs_scan函数。用户每次调用时,将对一段完成的数据块进行匹配。匹配只限于该数据块内,而与上一次的hs_scan()调用无关。
一种是流模式,在真实网络场景下,数据被拆分成多个报文发送,在只接收到部分数据流的情况下使用块模式匹配会导致跨数据流的匹配点被遗漏,可能的方法只有等全部数据流接收完成后在统一进行匹配,此举会增加内存的开销及报文处理的复杂度。
问题3:什么是草稿空间。
答:扫描数据时,Hyperscan需要少量临时内存来存储即时内部数据。hs_alloc_scratch()函数可以为给定模式数据库分配一块足够的空间。
问题4:hyperscan简单实用流程
答: (1)hs_compile_multi 更加正则表达式编译数据库。
(2)hs_alloc_scratch 创建即时数据区
(3)hs_scan 执行对应的扫描任务。
问题5:我曾经遇到过一个难缠的问题
答:当一条流中包含规则1,规则2,规则3.当初测试hyperscan例子的时候会同时匹配上规则1,规则2,规则3.但是当用到项目中时发现匹配中了规则1,就停止了。发现错误码返回值为-3.后来发现是定义的回调函数必须加上return 0; 否则就只能匹配一条规则就终止了。并且返回值为-3.
参考文档:1,https://carecraft.github.io/basictheory/2017/08/hyperscan/
网友评论