我已经完成了一项任务,即构建一个应用程序,该应用程序将对某些网络流量执行基于签名的匹配(在第7层)。匹配将实时执行,并且需要快速,以便系统始终保持响应性。
首先,我考虑将正则表达式用作签名,将pcre用作匹配库。但似乎这太慢了。将有几千个签名进行匹配。
由于我在基于签名的内容匹配方面没有很多经验,所以我要问:
答案 0 :(得分:1)
要构建一个有效的RE匹配器,可以将其编译为具有接受和非接受状态的有限状态机。
如果您有多个RE,您可以轻松地形成它们的析取,并将其编译成具有非接受状态的FSA,以及根据哪个RE接受标记的状态。
因此,使用几千个RE,您可以计算一个巨大的析取并为该集合构建FSA。
大多数标准lexing引擎(例如FLEX)正是这样做的,每个令牌使用一个RE,并告诉你哪个令牌。所以你应该能够使用FLEX作为起点。