包含偏移的AC多模匹配

【背景】 在网络设备中会用到DPI技术对数据包的负载作检测,从而挖掘网络流量中的信息,DPI技术会用到多模式匹配,现有多模匹配的算法和实现只是专一于多模式匹配,都不会关注模式串的偏移信息,然而在对网络中的数据包的负载作检测会有三个特色,一是负载文本短,二是模式串较短,三是模式串出现的偏移固定。另外网络设备对性能很是敏感,不带偏移信息的传统的多模式匹配算法实现必然会出现重复匹配,网络设备须要对每一个匹配结果作偏移比对和去重的处理,这种处理频率最坏的状况下是负载的每一个字节都作一次偏移比对和去重处理,极大的损耗了性能。结合负载的模式串的特色和性能要求,须要一种包含偏移的多模式匹配算法。node

【过程】 a) 模式串解析模块负责解析模式串 输入的模式串必须带有偏移值,该偏移值表示模式串在负载中出现的起始位置,所以在解析的时候模式串的各个字符的偏移等于前一个字符的偏移值加一。好比<0,”abcde”>表示偏移为0的模式串”abcde”,字符’a’是”abcde”的第一个字符,由于这个字符是模式串的第一个字符,所以这个字符的偏移等于整个模式串的起始偏移0,而后’B’的偏移等于1,以此类推。 b) 带偏移的Trie树构造模块 这个模块负责根据模式串列表构造带偏移的Trie树。构造的时候遍历模式串,而后依次取出模式串的每一个字符和偏移构成的二维向量<char,offset>做为输入input,逐层遍历Trie树,若是当前父节点的子节点中存在于该input相等的节点,就说明有相同的前缀,不然就新建一个节点,插入到当前父节点。构造的Trie树以下:算法

Trie_with_offset

c) 肯定性有穷自动机(DFA)构造模块 在Trie树的基础上构造DFA的过程就是计算在使用Trie树匹配失败时须要往哪一个节点回溯,以便匹配下一个输入,Trie树上每一个节点的回溯节点构成一个失败匹配回溯表。构造时首先初始化Trie树的root的子节点的回溯节点为root,而且把每一个子节点加入到节点队列中。若是节点队列不为空就从中取出节点cnode,取cnode的子节点subnode而且记录边input<char,offset>,把subnode加入到节点队列,subnode的回溯节点按照下面步骤求得: 步骤1:取cnode的回溯节点btnode。 步骤2:若是btnode以边input<char,offset>做为输入能到达一个子节点nextnode,那么subnode的回溯节点就等于nextnode,不然令cnode等于btnode,而后重复步骤1。 仍是以以模式串<”abcd”,0>,<”ab”,0>,<”cd”,2>,<”bc”,1>和<”abe”,0>为例构造的DFA以下图(虚线箭头表示匹配失败的跳转方向): 在此输入图片描述网络

e) 搜索模块 搜索模式实现带偏移的多模式匹配过程,设待搜索文本串为Text,从偏移x开始搜索到y结束,则从偏移x开始取得<Text[x],x>做为输入,把当前节点设为DFA的根节点,到达下一个节点以后令当前节点等于下一个节点,判断该节点是否有匹配上的模式串,若是有则输出匹配上的模式串,而后继续往下取偏移为x+1的<Text[x+1],x+1>做为输入往下匹配,直到到达偏移y的位置。性能

Q:引入offset以后首先状态会增长,而后是状态机纬度增长会致使状态机膨胀得厉害,预想是适用于少偏移短串的匹配。队列

相关文章
相关标签/搜索