基于ac自动机和后缀树的字符串匹配方法

文档序号:7866576阅读:340来源:国知局
专利名称:基于ac自动机和后缀树的字符串匹配方法
技术领域
本发明涉及网络过滤和监控技术领域,特别涉及一种基于AC自动机和后缀树的字符串匹配方法。
背景技术
随着网络安全要求的不断提高,入侵检测、防病毒、内容过滤等功能正越来越多地应用于网络安全设备中。而字符串匹配算法则是支撑这些功能的核心算法,也决定了网络安全设备的性能。目前最广泛应用于网络安全设备的字符串匹配算法是Aho-Corasick(AC)自动机算法,AC算法是一种基于自动机原理的字符串匹配算法,如图1所示,其基本工作原理为首先将特征字符串(如病毒特征库、过滤关键字等)编译成自动机,从状态O开始,逐 字读入待匹配内容,每次读入一个字符(例如a)时,检查当前状态是否有对应字符的跳转箭头,若有,则跳到此跳转对应的下一状态,若没有,则跳回到状态O。有一些状态被标记为匹配状态,如果进入这个状态代表匹配成功。针对特征字符串可能分散于多个数据包的情况,目前业界普遍采用的是缓存数据包和重组数据包之后再进行字符串匹配,从而提升了网络安全设备的内存使用量。然而缓存数据包和重组数据包存在以下缺点首先,缓存数据包会使网络延迟变大;其次,在千兆级以上的高速网络中重组数据包需要大量的内存,容易使网络安全设备出现内存耗尽的情况;再次,在具备高速缓冲存储器的网络安全设备中,在内存中大量读写数据包数据还会使高速缓冲存储器的局部性降低,从而降低网络安全设备的性能。

发明内容
(一)解决的技术问题本发明解决的技术问题是提出一种无需重组数据包就可以检测出跨包内容的字符串匹配方法。(二)技术方案本发明提出了一种基于AC自动机和后缀树的字符串匹配方法,所述方法包括S1、将特征字符串编译成AC自动机;S2、将特征子符串的后缀集合编译成后缀树;S3、每当有一个数据包进入网络安全设备时,根据所述AC自动机对所述数据包进行匹配,并利用所述后缀树保存匹配状态;S4、若匹配成功,则丢弃所述数据包。优选地,当所述数据包按序进入时,则步骤S3具体包括S31、当接收到当前按序数据包时,搜索所述当前按序数据包的前一个数据包的记录是否存在;S32、根据所述当前按序数据包的前一个数据包的记录是否存在判定所述当前按序数据包的状态编号;
S33、根据所述AC自动机,从所述当前按序数据包的状态编号开始对所述当前按序数据包进行匹配。
优选地,步骤S32具体包括
若所述当前按序数据包的前一个数据包的记录存在,则将所述当前按序数据包的前一个数据包的状态编号作为所述当前按序数据包的状态编号;
若所述当前按序数据包的前一个数据包的记录不存在,则所述当前按序数据包的状态编号为O。
优选地,当所述数据包乱序进入时,则步骤S3具体包括
S31’、在接收当前乱序数据包之前,搜索所述当前乱序数据包的后一个数据包的后缀树记录是否存在,并检测所述当前乱序数据包的后一个数据包的头部是否为所述后缀树中的Iv后缀;
S32’、若所述当前乱序数据包的后一个数据包的后缀树记录存在,且检测到所述当前乱序数据包的后一个数据包的头部是所述后缀树中的一个后缀时,则保存所述后缀树在所述后缀上的后缀树编号;
S33’、当接收到所述当前乱序数据包时,对所述后缀树在所述后缀上的后缀树编号上进行回溯;
S34’、将回溯得到的后缀添加到所述当前乱序数据包的尾部,根据所述AC自动机对重组后的所述当前乱序数据包进行匹配。
优选地,所述步骤S31’还包括搜索所述当前乱序数据包的前一个数据包的后缀树记录是否存在
若所述当前乱序数据包的前一个数据包的后缀树记录存在,且所述当前乱序数据包的前一个数据包为所述后缀的一部分,则所述当前乱序数据包的后缀树编号为所述当前乱序数据包的前一个数据包的后缀树编号;
若所述当前乱序数据包的前一个数据包的后缀树记录存在,且所述当前乱序数据包的前一个数据包不是所述后缀的一部分,则所述当前乱序数据包的后缀树编号为所述当前乱序数据包的前一个数据包的后缀树编号。
优选地,所述步骤S32’中所述若所述当前乱序数据包的后一个数据包的后缀树记录存在,且检测所述当前乱序数据包的后一个数据包不是后缀的一部分,则将所述当前乱序数据包的后一个数据包重组到所述当前乱序数据包进行匹配,且重组后的当前乱序数据包的状态编号为所述当前乱序数据包的后一个数据包的状态编号。
(三)有益效果
本发明在对数据包字符串进行匹配时保存状态机的状态编号,使得数据包在顺序到达时能够继续上一次的状态进行匹配,摆脱了缓存造成的延迟加大内存消耗加大、内存消耗加大和高速缓冲存储器局部性降低的缺点,可以降低网络安全设备所需资源,提升其性能。


图1是AC自动机示意图2是本发明提出的方法流程图3是本发明中特征字符串abcde的后缀树不意图。
具体实施例方式下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述。本发明提出了一种基于AC自动机和后缀树的字符串匹配方法,是对AC算法的改进,通过记录自动机的状态编号来代替缓存整个数据包的内容,该方法同时能够用于AC算法的衍生算法AC-Optimized、Cl-AC等算法中,该方法的流程图如图2所示,所述方法包括S1、将特征字符串编译成AC自动机;S2、将特征子符串的后缀集合编译成后缀树; S3、每当有一个数据包进入网络安全设备时,根据所述AC自动机对所述数据包进行匹配,并利用所述后缀树保存匹配状态;S4、若匹配成功,则丢弃所述数据包。当所述数据包按序进入时,则步骤S3具体包括S31、当接收到当前按序数据包时,搜索所述当前按序数据包的前一个数据包的记录是否存在;S32、根据所述当前按序数据包的前一个数据包的记录是否存在判定所述当前按序数据包的状态编号;S33、根据所述AC自动机,从所述当前按序数据包的状态编号开始对所述当前按序数据包进行匹配。步骤S32具体包括若所述当前按序数据包的前一个数据包的记录存在,则将所述当前按序数据包的前一个数据包的状态编号作为所述当前按序数据包的状态编号;若所述当前按序数据包的前一个数据包的记录不存在,则所述当前按序数据包的状态编号为O。当所述数据包乱序进入时,则步骤S3具体包括S31’、在接收当前乱序数据包之前,搜索所述当前乱序数据包的后一个数据包的后缀树记录是否存在,并检测所述当前乱序数据包的后一个数据包的头部是否为所述后缀树中的Iv后缀;S32’、若所述当前乱序数据包的后一个数据包的后缀树记录存在,且检测到所述当前乱序数据包的后一个数据包的头部是所述后缀树中的一个后缀时,则保存所述后缀树在所述后缀上的后缀树编号;S33’、当接收到所述当前乱序数据包时,对所述后缀树在所述后缀上的后缀树编号上进行回溯;S34’、将回溯得到的后缀添加到所述当前乱序数据包的尾部,根据所述AC自动机对重组后的所述当前乱序数据包进行匹配。所述步骤S31’还包括搜索所述当前乱序数据包的前一个数据包的后缀树记录是否存在
若所述当前乱序数据包的前一个数据包的后缀树记录存在,且所述当前乱序数据包的前一个数据包为所述后缀的一部分,则所述当前乱序数据包的后缀树编号为所述当前乱序数据包的前一个数据包的后缀树编号;
若所述当前乱序数据包的前一个数据包的后缀树记录存在,且所述当前乱序数据包的前一个数据包不是所述后缀的一部分,则所述当前乱序数据包的后缀树编号为所述当前乱序数据包的前一个数据包的后缀树编号。
所述步骤S32’中所述若所述当前乱序数据包的后一个数据包的后缀树记录存在, 且检测所述当前乱序数据包的后一个数据包不是后缀的一部分,则将所述当前乱序数据包的后一个数据包重组到所述当前乱序数据包进行匹配,且重组后的当前乱序数据包的状态编号为所述当前乱序数据包的后一个数据包的状态编号。
本实施例假设特征字符串为abcde,则特征字符串abcde的后缀集合为 {bcde, cde, de, e},特征字符串abcde的后缀树示意图如图3所示。
对于本发明提出的基于AC自动机和后缀树的字符串匹配方法中的数据结构为
其中,AC自动机状态的数据结构为
typedef struct {uint_32 NextStatef ALPHABET—SIZE ];."下一步状态 uint—32 F ailState; //无匹配情况下的下一个状态 AC PATTERN *MatchList; //匹配成功的特征字符串指针}AC NODE;
后缀树状态的数据结构为
typedef struct { uint—32 Next:State[ALPHABET—SIZE ]; //下一步状态 uint 32 PreState;Il此节点的父节点uchar PreChar;Il从父节点到此节点的对应字符} PSTN0DE;
用于保存乱序信息的记录表Buffer中的条目数据结构为
typedef struct _bufStmct{ uint_32 fid //根据五元组生成的流的唯一 ID uint_32 seq; //此数据包在流中的序列号 uint—32 Ien //数据包长度 uint—32 Si; //AC自动机状态编号 uint—32 s2 //后缀树状态编号
uint—32 fact; //表不整个包是一个后缀的一部分 bufStruct* Next; //用于解决Hash碰撞的指针
)
} BUFFER—STRUCT; 本发明提出的基于AC自动机和后缀树的字符串匹配方法的伪代码如下表1:
权利要求
1.一种基于AC自动机和后缀树的字符串匹配方法,其特征在于,所述方法包括 51、将特征字符串编译成AC自动机; 52、将特征子符串的后缀集合编译成后缀树; 53、每当有一个数据包进入网络安全设备时,根据所述AC自动机对所述数据包进行匹配,并利用所述后缀树保存匹配状态; 54、若匹配成功,则丢弃所述数据包。
2.根据权利要求1所述的方法,其特征在于,当所述数据包按序进入时,则步骤S3具体包括 531、当接收到当前按序数据包时,搜索所述当前按序数据包的前一个数据包的记录是否存在; 532、根据所述当前按序数据包的前一个数据包的记录是否存在判定所述当前按序数据包的状态编号; 533、根据所述AC自动机,从所述当前按序数据包的状态编号开始对所述当前按序数据包进行匹配。
3.根据权利要求2所述的方法,其特征在于,步骤S32具体包括 若所述当前按序数据包的前一个数据包的记录存在,则将所述当前按序数据包的前一个数据包的状态编号作为所述当前按序数据包的状态编号; 若所述当前按序数据包的前一个数据包的记录不存在,则所述当前按序数据包的状态编号为O。
4.根据权利要求1所述的方法,其特征在于,当所述数据包乱序进入时,则步骤S3具体包括 S31’、在接收当前乱序数据包之前,搜索所述当前乱序数据包的后一个数据包的后缀树记录是否存在,并检测所述当前乱序数据包的后一个数据包的头部是否为所述后缀树中的一个后缀; S32’、若所述当前乱序数据包的后一个数据包的后缀树记录存在,且检测到所述当前乱序数据包的后一个数据包的头部是所述后缀树中的一个后缀时,则保存所述后缀树在所述后缀上的后缀树编号; S33’、当接收到所述当前乱序数据包时,对所述后缀树在所述后缀上的后缀树编号上进行回溯; S34’、将回溯得到的后缀添加到所述当前乱序数据包的尾部,根据所述AC自动机对重组后的所述当前乱序数据包进行匹配。
5.根据权利要求4所述的方法,其特征在于,所述步骤S31’还包括搜索所述当前乱序数据包的前一个数据包的后缀树记录是否存在 若所述当前乱序数据包的前一个数据包的后缀树记录存在,且所述当前乱序数据包的前一个数据包为所述后缀的一部分,则所述当前乱序数据包的后缀树编号为所述当前乱序数据包的前一个数据包的后缀树编号; 若所述当前乱序数据包的前一个数据包的后缀树记录存在,且所述当前乱序数据包的前一个数据包不是所述后缀的一部分,则所述当前乱序数据包的后缀树编号为所述当前乱序数据包的前一个数据包的后缀树编号。
6.根据权利要求4所述的方法,其特征在于,所述步骤S32’中所述若所述当前乱序数据包的后一个数据包的后缀树记录存在,且检测所述当前乱序数据包的后一个数据包不是后缀的一部分,则将所述当前乱序数据包的后一个数据包重组到所述当前乱序数据包进行匹配,且重组后的当前乱序数据包的状态编号为所述当前乱序数据包的后一个数据包的状态编号。
全文摘要
本发明提供一种基于AC自动机和后缀树的字符串匹配方法,所述方法包括S1.将特征字符串编译成AC自动机;S2.将特征字符串的后缀集合编译成后缀树;S3.每当有一个数据包进入网络安全设备时,根据所述AC自动机对所述数据包进行匹配,并利用所述后缀树保存匹配状态;S4.若匹配成功,则丢弃所述数据包。本发明在对数据包字符串进行匹配时保存AC状态机和后缀树的状态编号,使得数据包即使在乱序到达时也能够继续上一次的状态进行匹配,而不用缓存之前的数据包。摆脱了缓存造成的延迟加大内存消耗加大、内存消耗加大和高速缓冲存储器局部性降低的缺点,可以降低网络安全设备所需资源,提升其性能。
文档编号H04L29/06GK103023883SQ20121048842
公开日2013年4月3日 申请日期2012年11月26日 优先权日2012年11月26日
发明者陈新明, 李军 申请人:清华大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1