基于智能有限自动机的正则表达式匹配方法
技术领域
本发明涉及电子计算机网络技术,具体是一种基于智能有限自动机的正则表达式匹配方法。
背景技术
网络入侵检测与防御系统(Network Intrusion Detection and PreventionSystems,NIDS/NIPS)是网络安全防御的重要手段,即通过实时监测网络流量,检查每个数据包的头部信息和有效载荷(即数据包内容),识别和阻断网络可疑行为。NIDS/NIPS的核心是深度数据包检测(Deep Packet Inspection,DPI),即采用特征匹配算法,将每个数据包内容与一组预定义的特征进行匹配。DPI技术不仅应用于NIDS/NIPS,而且还应用于应用层数据包分类、P2P流量识别、基于内容的流量计费等。
特征匹配算法可分为字符串匹配算法和正则表达式匹配算法。由于正则表达式具有丰富灵活的表达能力,当前的主流NIDS/NIPS,例如Snort[2]、Bro[3]、TippingPoint IPS、Cicso IOS IPS等,已采用正则表达式来描述复杂攻击特征,以及采用正则表达式匹配算法来替代字符串匹配算法。正则表达式匹配算法采用有限自动机来表示一组已知攻击的特征正则表达式。有限自动机分为确定型有限自动机(Deterministic Finite Automata,DFA)和非确定型有限自动机(Nondeterministic Finite Automata,NFA)。DFA具有时间高效等优点,即匹配速度快,但是存在存储空间开销大等缺点;而NFA具有存储空间高效等优点,但是存在匹配速度慢等缺点。如何设计一种时空高效的有限自动机成为正则表达式匹配算法的关键间题。
随着网络带宽和业务流量的迅猛增长,正则表达式匹配算法面临高速海量数据包处理的高性能挑战。一方面,正则表达式匹配算法要求实现10-40Gbps线速数据包处理;另一方面,正则表达式匹配算法要求有限自动机存储在小容量的快速存储器(例如片上SRAM)上,从而进一步提高其吞吐量。DFA采用五元组定义,即D=(Q,∑,δ,q
0,F),其中Q是状态集合,∑是输入字母表集合,δ是状态迁移函数,q
0是起始状态,F是接受状态集合,且
当输入字符a时,对于任意状态q∈Q,根据状态迁移函数δ,D迁移到下一状态q′=δ(q,a)。针对正则表达式的DFA构建,首先采用Thompson构造法将正则表达式转化为NFA,其次采用子集构造法将NFA转化为等价的DFA。图1给出了正则表达式{.*ab.*cd}的单独DFA,其中状态空间为{P,Q,R,S,T},字母表为∑={a,b,c,d}。例如,起始状态为q
0=P,状态迁移函数为δ(P,a)=Q、δ(Q,b)=R等,且接受状态T。
在高速网络环境中,随着特征规则集日益庞大,DPI采用一组单独DFA进行特征匹配,导致处理时间增加、匹配效率降低,因而DPI采用联合DFA来表示一组DFA。但是,联合DFA带来状态空间爆炸问题,即多个单独DFA的状态排列组合来记录部分匹配结果,导致联合DFA难以存储在小容量的快速存储器上执行,增加慢速存储器访问次数,从而降低正则表达式匹配算法的吞吐量。
图2给出了正则表达式{.*ef.*gh}的单独DFA,其中状态空间为{V,W,X,Y,Z},字母表为∑={e,f,g,h}。图3给出了正则表达式{.*ab.*cd}和{.*ef.*gh}的联合DFA。为了清晰起见,图3省略了其他状态到初始状态的迁移边。图1和图2显示,单独DFA分别包含5个状态;而图3显示,联合DFA包含16个状态。联合DFA的状态个数与正则表达式中通配符(例如“*”)的个数密切相关。由于通配符,即星号“*”,表示任意字符,当联合DFA表示正则表达式{.*ab.*cd}和{.*ef.*gh}时,两个单独DFA的状态进行叉积组合,产生指数级增长的额外状态个数,造成DFA状态空间爆炸。
为了消除联合DFA的状态空间爆炸问题,Smith等人提出了扩展有限自动机(XFA),即采用辅助变量替代额外状态来记录部分匹配结果,执行简单操作指令来检查匹配是否成功。如果联合DFA的状态个数小于单独DFA的状态数之和,则每个单独DFA是非歧义的;反之,如果每个单独DFA是非歧义的,则联合DFA也是非歧义的。歧义的联合DFA采用歧义状态来记录部分匹配结果的所有排列组合。针对歧义的联合DFA,XFA是在DFA状态上增加辅助比特变量,消除歧义状态,并在接受状态上执行比较指令,检查辅助比特变量是否设置。XFA匹配过程是:当读入一个字符时,XFA查找当前状态的相应迁移边,迁移到下一状态;执行下一状态的操作指令,检查辅助变量是否设置来判断匹配是否成功。
XFA采用七元组定义,即X=(Q,V,∑,δ,U,(q
0,v
0),F),其中Q是状态集合,V是辅助变量集合,∑是输入字母表,δ:Q×∑→Q是状态迁移函数,U:Q×V→V是每个状态的更新函数,q
0是起始状态,v
0是辅助变量的初始值,
是接受状态集合。DFA是根据当前状态和输入字符来迁移到下一个状态,而XFA是根据当前状态、辅助变量和输入字符来迁移到下一个状态并更新相应的辅助变量。
例如,对于正则表达式{.*ab.*cd}和{.*ef.*gh},图1和图2中的两个单独DFA的状态个数之和为10,而图3中的联合DFA的状态个数为16,因而联合DFA是歧义的。针对正则表达式{.*ab.*cd},XFA采用1个比特辅助变量Bit1来记录部分匹配结果ab;针对正则表达式{.*ef.*gh},XFA采用1个比特辅助变量Bit2来记录部分匹配结果ef。图4给出了正则表达式{.*ab.*cd}和{.*ef.*gh}的联合XFA,即采用9个状态和2个比特辅助变量,与图3中的联合DFA是等价的,且消除了其状态空间爆炸。
XFA虽然消除了DFA状态空间爆炸问题,但是存在冗余迁移边问题,导致存储空间需求大,从而增加存储器访问次数,限制了XFA的性能。为了简明指出冗余迁移边问题,当分别读入字符串为abababcd和abcdabcdabcdefgh,给出图5和图6的XFA示例。
图5给出了正则表达式{.*ab.*cd}的XFA,其中包含5个状态和17条迁移边。当读入字符串abababcd时,XFA的状态迁移序列为P→Q→R→Q→R→Q→R→S→T;当第1次到达状态R时,辅助变量Bit1设置为1,表示等待到达状态S和T,检查指令语句来指出匹配成功;由于XFA未记录到达状态R,即已部分匹配字符串ab,而等待后续字符串cd,XFA的迁移状态中2次出现重复状态Q和R,导致不必要的状态迁移,从而产生额外的存储器访问次数和状态查找等开销。
图6给出了正则表达式{.*abcd.*efgh}的XFA,其中包含9个状态和33条迁移边。当读入字符串abcdabcdabcdefgh时,XFA的状态迁移序列为0→1→2→3→4→1→2→3→4→1→2→3→4→5→6→7→8,其中状态1、2、3和4重复出现3次;当第1次到达状态3时,辅助变量Bit1设置为1,表示已部分匹配字符串abcd,而等待后续字符串efgh;由于XFA未判断辅助变量Bit1是否设置,XFA需要迁移不必要的状态,导致存储器访问次数和状态查找等额外开销。造成不必要的状态迁移的根本原因是XFA存在冗余失效迁移边(见图5和图6中所示的虚线迁移边),并未判断辅助变量是否设置。
发明内容
本发明所要解决的技术问题是,解决XFA的冗余迁移边问题,在XFA基础上,增加辅助变量的判断指令,消除不必要的状态迁移,从而减少XFA的存储空间开销和提高其匹配效率。
为解决上述问题,本发明的技术方案是,基于智能有限自动机的正则表达式匹配方法为:
1)选取合适的正则表达式规则集;
2)构建智能有限自动机(Smart Finite Automaton,SFA);
3)通过智能有限自动机匹配方法对每个读入的测试集分别进行字符串匹配,并对匹配结果进行统计。
所述的正则表达式规则集选取方法为,采用100个规则集,每个规则集包含100条形式为{.*SubStr1.*SubStr2....*SubStrN}的正则表达式,其中子串SubStr1、SubStr2和SubStrN等具有相同的长度,测试集为1MB的字符串集。
智能有限自动机的构建过程是根据所选取的合适正则表达式规则集,通过智能有限自动机构造方法构造有限自动机并同时生成状态集。
智能有限自动机构造过程分为两个步骤:
1)在扩展有限自动机的分支迁移边上增加操作指令来判断是否状态迁移,消除不必要的状态迁移;
2)消除扩展有限自动机中的回退迁移边。
与XFA相比,SFA在迁移边条数上减少了56%,在存储空间开销上减少了44.1%,在存储器访问次数上减少了69.1%,而在匹配时间上减少了11%,提高了正则表达式匹配的时空效率。
附图说明
图1正则表达式{.*ab.*cd}的单独DFA;
图2正则表达式{.*ef.*gh}的单独DFA;
图3正则表达式{.*ab.*cd}和{.*ef.*gh}的联合DFA;
图4正则表达式{.*ab.*cd}和{.*ef.*gh}的的联合XFA;
图5正则表达式{*ab.*cd}的XFA;
图6正则表达式{.*abcd.*efgh}的XFA;
图7正则表达式{.*ab.*cd}的SFA;
图8正则表达式{.*abcd.*efgh}的SFA;
图9SFA和XFA的迁移边条数比较,(a)相同子串长度,不同通配符个数,(b)相同通配符个数,不同子串个数
图10SFA和XFA的指令条数比较,(a)相同子串长度,不同通配符个数,(b)相同通配符个数,不同子串个数;
图11SFA和XFA的存储空间开销比较,(a)相同子串长度,不同通配符个数,(b)相同通配符个数,不同子串个数;
图12SFA和XFA的状态迁移次数比较,(a)相同子串长度,不同通配符个数,(b)相同通配符个数,不同子串个数;
图13SFA和XFA的匹配时间比较,(a)相同子串长度,不同通配符个数,(b)相同通配符个数,不同子串个数。
具体实施方式
为了解决XFA的冗余迁移边问题,本文提出了智能有限自动机(SFA),即在XFA基础上,增加辅助变量的判断指令,消除不必要的状态迁移,从而减少XFA的存储空间开销和提高其匹配效率。SFA的灵感来源是基于对DFA状态迁移的观察:如图1所示,当读入字符串abababcd时,DFA的状态迁移序列为P→Q→R→R→R→R→R→S→T,其中状态R重复出现5次;由于DFA的状态R具有记忆功能,即记录已部分匹配字符串ab,等待后续字符串cd,当读入非cd的字符串,DFA始终迁移到状态R,而不会回退到R之前的状态P或Q。因此,XFA虽然采用辅助变量和操作指令来消除DFA状态空间爆炸问题,但是也删除了状态的记忆功能。基于上述观察,本文的SFA是利用辅助变量,增加XFA迁移边的记忆功能,从而避免不必要的状态迁移。
SFA的构建过程是:1)在XFA的分支迁移边上增加操作指令来判断是否状态迁移,从而消除不必要的状态迁移;2)消除XFA中回退迁移边,从而减少XFA的存储空间开销。在XFA中,迁移边分为向前迁移边(ForwardingTransition)和交叉迁移边(Crossing Transition)。向前迁移边是指从深度为i的节点指向深度为i+1的节点的迁移边;而交叉迁移边是指从深度为i的节点指向深度为j的节点的迁移边,且i<=j。分支迁移边是指从深度为0的节点指向深度为1的节点的向前迁移边。例如,图5中的迁移边a:P→Q和c:P→S是分支迁移边。回退迁移边是指从中间状态i指向中间状态j的交叉迁移边或者从前缀状态指向同一分支的中间状态的交叉迁移边,其i≠j。前缀状态是指设置辅助变量为1的状态,中间状态是除了初始状态、接受状态和前缀状态的其他状态。例如,图5中的状态R是前缀状态、状态Q和S是中间状态,迁移边c:Q→S和a:S→Q是回退迁移边,而迁移边c:R→S不是回退迁移边。因此,在分支迁移边上,增加判断操作指令,即if(Bit)transit表示当辅助变量Bit设置为1时执行状态迁移,或者if(!Bit)transit表示当辅助变量Bit未设置为1时执行状态迁移,从而可判断是否查找指定的状态迁移及下一个状态。当分支迁移边的判断操作指令表示不执行状态迁移时,SFA保持当前状态不变,从而减少迁移边的存储空间访问次数,提高正则表达式匹配的效率。
图7给出了正则表达式{.*ab.*cd}的SFA,其中包含5个状态和13条迁移边。如图7所示,在分支迁移边a:P→Q上增加了判断操作指令if(!Bit1)transit,在分支迁移边c:P→S上增加了判断操作指令if(Bit1)transit,从而过滤掉不必要的状态迁移。与图5中DFA相比,SFA具有相同的状态个数,但是其迁移边条数从17减至13。图8给出了正则表达式{.*abcd.*efgh}的SFA,其中包含9个状态和25条迁移边。如图8所示,在分支迁移边a:0→1和e:0→5上分别增加了相应的判断操作指令。与图6中DFA相比,SFA的迁移边条数从33减至25。实验结果表明,当正则表达式规则数量更多且更复杂时,SFA虽然在少量迁移边上增加了判断操作指令,但是在存储空间等方面显著减少。
当读入字符串abababcd时,图7中SFA的匹配过程是:当读入字符a时,由于辅助变量Bit1设置为0,初始状态P执行判断操作指令,迁移到状态Q;当读入字符b时,状态Q迁移到前缀状态R,并设置辅助变量Bit1为1;当读入字符a时,状态R迁移到初始状态P;当读入字符b、a和b时,由于辅助变量Bit1设置为1,初始状态P执行判处操作指令,不迁移到其他状态,停留在初始状态P;当读入字符c时,由于辅助变量Bit1设置为1,初始状态P执行判处操作指令,迁移到状态S;最后,当读入字符d时,状态S迁移到接受状态T,并检查辅助变量是否设置为1,从而匹配正则表达式{.*ab.*cd}。因而,图7中SFA的状态迁移序列为P→Q→R→P→P→P→P→S→T,其存储器访问次数仅为5次,而少于XFA的8次。类似地,当读入字符串abcdabcdabcdefgh时,图8中SFA的状态迁移序列为0→1→2→3→4→0→0→0→0→0→0→0→0→5→6→7→8,其存储器访问次数仅为9次,而少于XFA的16次。
本发明采用C/C++设计实现了XFA和SFA,并运行在CPU为Intel CeleronCPU 1.3GHZ、内存为512MB的计算机上。在软件模拟实验中,本文在不同通配符(星号*)个数和不同子串长度的条件下评估正则表达式匹配算法的时间效率指标。空间效率指标包括状态个数、迁移边条数、指令条数和存储空间开销等;而时间效率指标包括状态迁移次数和匹配时间等。在评估数据集中,采用100个规则集,且每个规则集包含100条形式为{.*SubStr1.*SubStr2....*SubStrN}的正则表达式,其中子串SubStr1、SubStr2和SubStrN等具有相同的长度,而测试集为1MB的字符串集。
表1给出了XFA和SFA的状态个数。表1(a)和1(b)分别是在不同通配符个数和不同子串长度的条件下XFA和SFA的状态个数。表1显示,SFA和XFA具有相同的状态个数。
表1
SFA和XFA的迁移边条数比较如图9所示,与XFA相比,SFA在迁移边条数上减少了56%;随着星号个数或子串长度的增加,SFA减少的冗余迁移边条数比率也增多,即从33.8%增至56%。
图10给出了SFA和XFA的指令条数比较。SFA和XFA均采用相同的操作指令来执行状态迁移或匹配检查等,由专用嵌入式硬件(例如GPU/SIMD)支持。图10表明,与XFA相比,由于在分支迁移边上增加额外的判断操作指令,SFA的操作指令条数增多;随着星号个数的增加,SFA的指令条数也增加;但是,随着子串长度的增加,SFA的指令条数保持恒定不变。
图11给出了SFA和XFA的存储空间开销比较。存储空间开销是由状态个数、迁移边条数、操作指令条数和辅助变量个数所决定的。在相同的实验条件下,SFA与XFA的状态个数和辅助变量个数是相同的;SFA的迁移边条数少于XFA,而SFA的操作指令条数多于XFA。因而,存储空间开销是SFA空间效率的关键指标。图11表明,与XFA相比,SFA在存储空间开销上减少了44.1%;随着星号个数或子串个数的增加,SFA减少的存储空间开销也增多,即从21%增至44.1%。
图12给出了SFA和XFA的状态迁移次数比较。状态迁移次数主要反映正则表达式匹配算法的存储器访问次数,即存储器带宽需求。由于嵌入式存储器的带宽受限和代价昂贵,减少状态迁移次数有助于减少存储器带宽需求,从而提高正则表达式匹配的性能和硬件开销。图12表明,与XFA相比,SFA在状态迁移次数上减少了46.2%-69.1%。
图13给出了SFA和XFA的匹配时间比较。本文是在相同硬件平台和评估数据集的条件下,统计SFA和XFA的实际匹配时间。由于受通用硬件平台的CPU、I/O总线带宽等限制,基于软件实现的SFA和XFA难以满足实际10Gbps线速数据包处理。但是,本文的匹配时间是在相同条件下的仿真匹配时间,可满足SFA和XFA的性能比较需求。图13表明,与XFA相比,SFA在匹配时间上减少了6.7%-11%。
本发明作为一种基于智能有限自动机的正则表达式匹配方法,具有一定的通用性,并且可以通过应用该方法的思想改进正则表达式匹配方法。可应用于深度数据包检测,网络入侵检测系统以及信息安全等领域之中。
其具体的实施归纳为一个预备步骤和两个实施步骤:
预备步骤:选取合适的正则表达式规则集
采用100个规则集,且每个规则集包含100条形式为{.*SubStr1.*SubStr2....*SubStrN}的正则表达式,其中子串SubStr1、SubStr2和SubStrN等具有相同的长度;而测试集为1MB的字符串集。
步骤1:构建智能有限自动机(SFA)
SFA的构建过程是:根据选取合适的正则表达式规则集,通过SFA构造方法构造有限自动机并同时生成状态集;
智能有限自动机(SFA)构造过程分为两个步骤:
1)在XFA的分支迁移边上增加操作指令来判断是否状态迁移,从而消除不必要的状态迁移;
2)消除XFA中回退迁移边,从而减少XFA的存储空间开销。
步骤2:通过SFA匹配算法对每个读入的测试集分别进行字符串匹配,并对匹配结果进行统计以便于对SFA效率进行评估。