CN103226551B - 基于tcam的非确定性有限自动机的匹配方法和装置 - Google Patents
基于tcam的非确定性有限自动机的匹配方法和装置 Download PDFInfo
- Publication number
- CN103226551B CN103226551B CN201210021964.5A CN201210021964A CN103226551B CN 103226551 B CN103226551 B CN 103226551B CN 201210021964 A CN201210021964 A CN 201210021964A CN 103226551 B CN103226551 B CN 103226551B
- Authority
- CN
- China
- Prior art keywords
- state
- tcam
- active
- nfa
- coding
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Landscapes
- Compression, Expansion, Code Conversion, And Decoders (AREA)
Abstract
本发明涉及一种基于TCAM(ternary?content?addressable?memory,三态内容寻址存储器)的NFA(non-deterministic?finite?automaton,非确定性有限自动机)的匹配方法和装置。该方法主要包括:对NFA的状态和同时活跃的状态子集进行编码,将NFA的每个状态转移边用一个TCAM条目表示,将NFA的源活跃状态子集的编码和输入字符的编码的拼接作为搜索关键词,按照所述搜索关键字在NFA的所有TCAM条目中进行搜索,将获取的目的活跃状态子集的编码作为输出结果,所述源活跃状态子集为NFA当前所有同时活跃的状态的集合,所述目的活跃状态子集为在NFA中输入所述输入字符、进行状态转换后,得到的同时活跃的状态的集合。本发明实施例使得NFA的一次状态转换仅需要一次TCAM并行查找就能完成,实现了和基于DFA的正则表达式匹配技术一样的匹配速度,同时利用TCAM的三态存储能力对NFA的TCAM条目进行压缩,减少了NFA所需的TCAM存储空间。
Description
技术领域
本发明涉及计算机应用技术领域,尤其涉及一种基于TCAM(ternarycontentaddressablememory,三态内容寻址存储器)的NFA(non-deterministicfiniteautomaton,非确定性有限自动机)的匹配方法和装置。
背景技术
从最早的grep(globalsearchregularexpressionandprintouttheline,全面搜索正则表达式并把行打印出来),到现在非常流行的PCRE(PerlCompatibleRegularExpressions,perl语言兼容正则表达式),正则表达式因其强大、便捷、高效的文本处理能力,得到了广泛的使用。目前,几乎所有主编程流语言都支持正则表达式;在软件开发和日常数据处理工作中,正则表达式更是人们不可或缺的得力助手。
正则表达式是一种“通用的模式语言”,它由两种字符构成:特殊字符和普通字符。特殊字符称为“元字符”,普通字符称为“文字”。“文字”就像语言中的单词,“元字符”则像文法;把单词按文法组织起来,就有了语义。正如文章由句子段落构成一样,一个完整的正则表达式也是由小的模块单元组成的。虽然模块单元各自都很简单,但它们的组合却千变万化。正是这种简单模块的复杂组合,使得正则表达式具有了强大的表达能力。
例如,正则表达式a+b可以用来描述ab,aab,aaab,......等一系列特征的
字符串。正则表达式匹配技术是一项用于检测给定的输入字符流中是否包含特定的正则表达式所描述的模式的技术,它计算机网络系统的一项核心基础技术,被广泛应用于如入侵检测和防护、签名匹配、蠕虫检测、深度包检测、流量分析、协议识别等等。正则表达式的匹配通过有限自动机实现,即将正则表达式的规则编译成一个等价的有限自动机,包括NFA(non-deterministicfiniteautomaton,非确定性有限自动机)和DFA(deterministicfiniteautomaton,确定性有限自动机)。
基于自动机的正则表达式匹配技术急需解决的两大难题是自动机的存储体积和匹配速度。在这两个关键性能指标上,DFA和NFA各自具有不同的优点和缺点。
DFA的每个状态对于每个输入字符都只转移到一个唯一的目的状态,使得在DFA运行的时刻,都只有一个状态是活跃的,因此DFA实现正则表达式匹配的过程非常简单:一次DFA状态转换即可处理一个输入字符。DFA因此具有确定的匹配速度,但是DFA所需的状态空间可能呈现指数膨胀,在最坏情况下,具有n个状态的DFA,其等价的DFA可能多达2n个状态,在实际的网络应用中,几十个具有“.*”结构(表示匹配任意多数量的任意字符)的正则表达式组合在一起,就会使得编译得到的DFA因为状态空间发生指数膨胀而无法存储。而随着网络应用和流量的快速发展,需要同时检测的正则表达式规则往往成千上万,基于DFA的正则表达式技术往往变得不可行。
NFA的优点在于它的存储体积小,其体积与正则表达式规则集大小(即规则集中字符数)成线性增长关系,即使成千上万条规则,所生成的NFA占用的体积也很小。但NFA的状态转移具有不确定性,对于NFA的每一个状态和每一个字符,它所到达的目的状态的数目是不唯一的,也就是说一个NFA状态可以经过一个字符激活多个NFA状态,而这多个NFA状态被同时激活以后,在处理下一个输入字符时,又可能进一步激活更多的状态。因此在NFA运行的过程中,总是会有一组数目不确定的状态同时活跃。由于同时活跃的状态所组成的集合始终是NFA全体状态集合的一个子集,我们把NFA运行时可能出现的活跃状态组成的集合称之为活跃状态子集,NFA的一次状态转换的过程也就是一个源活跃状态子集经过一个输入字符激活一个目的活跃状态子集的过程。
目前,NFA的上述特征导致其匹配速度变得缓慢和不可预测。实际应用中,通常需要几十次内存访问甚至更多才能完成一次NFA状态转换,远不能满足网络线速。
发明内容
本发明的实施例提供了一种基于三态内容寻址存储器的正则表达式的匹配方法和装置,以提高基于NFA的正则表达式匹配的速度。
为实现上述的发明目的,本发明采用下述的技术方案:
一种基于TCAM的非确定性有穷状态自动机的匹配方法,包括:
对非确定性有穷状态自动机NFA的状态和活跃状态子集进行编码,将所述NFA的每个状态转移边用一个三态内容寻址存储器TCAM条目表示,每个TCAM条目由匹配域和目的域组成,所述匹配域包括:源状态域、输入字符域,所述目的域包括目的状态域或者包括目的状态域和掩码域;
将所述NFA的源活跃状态子集的编码和输入字符的编码的拼接作为搜索关键词,按照所述搜索关键字在所述NFA的所有TCAM条目中进行搜索,将获取的目的活跃状态子集的编码作为输出结果,所述源活跃状态子集为所述NFA当前所有同时活跃的状态的集合,所述目的活跃状态子集为在所述NFA中输入所述输入字符、进行状态转换后,得到的同时活跃的状态的集合。
一种基于TCAM的非确定性有穷状态自动机的匹配装置,包括:
编码处理模块,用于对非确定性有穷状态自动机NFA的状态和活跃状态子集进行编码;
TCAM条目构造模块,用于将所述NFA的每个状态转移边用一个三态内容寻址存储器TCAM条目表示,每个TCAM条目由匹配域和目的域组成,所述匹配域包括:源状态域、输入字符域,所述目的域包括目的状态域或者包括目的状态域和掩码域;
搜索匹配模块,用于将所述NFA的源活跃状态子集的编码和输入字符的编码的拼接作为搜索关键词,按照所述搜索关键字在所述NFA的所有TCAM条目中进行搜索,将获取的目的活跃状态子集的编码作为输出结果,所述源活跃状态子集为所述NFA当前所有同时活跃的状态的集合,所述目的活跃状态子集为在所述NFA中输入所述输入字符、进行状态转换后,得到的同时活跃的状态的集合。
本发明实施例通过将正则表达式等构造的NFA的每个状态用若干TCAM条目表示,使得NFA的一次状态转换仅需要一次TCAM条目并行查找就能完成,从而提高了NFA的匹配速度和效果,实现了和基于DFA的正则表达式匹配技术一样的匹配速度。
附图说明
图1为本发明实施例一提供的一种基于三态内容寻址存储器的NFA的匹配方法的具体处理流程图;
图2为本发明实施例二提供的一种用于匹配正则表达式ab.*cd的和ef.*gh的NFA的示意图;
图3为本发明实施例二提供的对图2所示的NFA中的状态划分得到的“兼容组”的示意图;
图4为本发明实施例二提供的图2所示的NFA中的各状态的“活跃码”的示意图;
图5为当目的域”不包含“掩码域”时,本发明实施例四提供的对“活跃状态子集”{0}和{0,3}产生的状态转移进行编码的TCAM条目的示意图;
图6为当“目的域”包含“掩码域”时,本发明实施例四提供的对“活跃状态子集”{0}和{0,3}产生的状态转移进行编码的TCAM条目的示意图;
图7为本发明实施例五提供的对字符b的所有状态转移进行编码的TCAM条目的示意图;
图8为本发明实施例六提供的对图7中的TCAM条目进行压缩的结果的示意图;
图9为本发明实施例七提供的用于匹配正则表达式ab.*cd的和ef.*gh的TCAM条目的示意图;
图10为本发明实施例八提供的一种基于TCAM的NFA的匹配装置的具体结构图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合附图,以对本发明实施例进行清楚、完整地描述人员。
实施例一
该实施例提供的一种基于三态内容寻址存储器的NFA的匹配方法的具体处理流程如图1所示,包括如下的处理步骤:
步骤S101、将NFA中的状态进行分组,对NFA的每个状态进行编码。
定义“活跃状态子集”,它是NFA运行过程中某一时刻所有同时活跃的状态的集合;
定义“自循环状态”,它是NFA中转移到自身的边超过了一定阈值(128)的状态;
定义“兼容组”,它是由若干NFA状态组成的集合,集合中的状态两两之间都不能同时活跃;
NFA中不含“ε边”,所谓“ε边”是指不消耗任何输入字符转移到新状态的边;
所有的NFA状态被划分为若干个兼容组;
每个自循环状态单独组成一个兼容组,称之为“自循环兼容组”;
兼容组的划分方法如下:假设NFA中有n个状态,从0到n-1编号;维护一个二维布尔数组,记为incompatible,若incompatible[i][j](0≤i,j<n)的值为true表示状态i和j是不兼容的(即可以同时活跃的),
步骤1、确定状态两两之间能否同时活跃:
步骤1.1incompatible中所有的值初始化为false;
步骤1.2维护一个状态对的队列,将所有的incompatible[i][i](0≤i<n)的值置为true,且将所有的状态对(i,i)(0≤i<n)入队;
步骤1.3依次迭代取队首元素(记为(i,j))出队,处理状态对(i,j)如下,直至队列为空:依次处理每一个字符c,将状态i和状态j经过字符c所到达的目的状态的集合记为D,对于D中的任意两个状态(i′,j′),若incompatible[i′][j′]尚未标记为true,则将incompatible[i′][j′]标记为true,并将状态对(i′,j′)入队;
步骤1至多经历n2次迭代即可完成,因为NFA中至多只有n2个状态对,且每个状态对在步骤1中至多只入队一次;凡是最终在incompatible中被标记为true的状态对,一定不会同时出现在任何“活跃状态子集”中,反之,凡是最终在incompatible中被标记为false的状态对,一定会同时出现在某个“活跃状态子集”中;
步骤2每个自循环状态单独组成一个兼容组,然后依次迭代处理每一个NFA状态s,每次迭代过程如下:
步骤2.1如果s是自循环状态,不做处理,退出本次迭代;
步骤2.2逐个检查已有的每一个非自循环兼容组G:检查s与G(中的所有状态)是否是兼容的,也就是检查所有的incompatible[s][t](t∈G)是否都为false,如果是,则将s加入到兼容组G中,退出本次迭代;
步骤2.3若s与所有的非自循环兼容组都不兼容,则创建一个新的兼容组,将s加入这个组中;
步骤2的结果使得NFA的所有状态都被划分为若干个兼容组,在NFA运行的任意时刻,每个兼容组中至多只有一个状态是活跃的;
在每个兼容组内,每个状态被分配一个状态编码,称之为“活跃码”,一个包含m个状态的兼容组需要为其中每个状态分配一个长度统一的(长为比特)各不相同的活跃码,其中全“0”的活跃码不分配给这m个状态,所述兼容组的编码由该兼容组所包括的各个状态的编码进行拼接得到。
步骤S102、对NFA同时活跃的状态的集合进行编码。
NFA的每一个“活跃状态子集”的编码为一个长度统一的“活跃向量”,该活跃向量由所述活跃状态子集中包括的每个状态所归属的兼容组的编码进行组合得到。每个兼容组都在“活跃向量”中依次占据一段编码,若总共有k个兼容组,且第i(1≤i≤k)个兼容组中的状态的编码长度为1i,则第i个兼容组在“活跃向量”中占据长度为1i的第i段编码,“活跃向量”的总长度为
对于一个“活跃状态子集”,它包含的状态都分属于不同的兼容组,遍历其中每一个状态,若此状态属于第i个兼容组,则“活跃向量”中的第i段编码设置为该状态的“活跃码”;对于无任何状态出现在该“活跃状态子集”中的兼容组,它在“活跃向量”中占据的编码设置为全“0”。
步骤S103、在TCAM中对NFA的状态转移进行编码。
TCAM(ternarycontentaddressablememory,三态内容寻址存储器)作为一种高速并行查找引擎,已广泛部署于各种高速网络设备中,用于IP地址查找和基于包头的包分类等网络应用。TCAM存储单元可存储“0”、“1”和“*”三种状态的比特值,其中,比特值“*”表示“不关心状态”,即其代表的值既可以是“0”也可以是“1”。TCAM芯片由一定数目的TCAM条目组成。每个时钟周期内,TCAM并行地将所有条目与搜索关键词进行比较,在所有满足匹配条件的条目中,TCAM返回第一个条目作为输出。TCAM的输出将作为新的搜索关键词的一部分,继续参与下一次匹配。由于TCAM能存储“*”的模糊匹配能力,使得TCAM能有效存储和压缩NFA的存储空间;由于TCAM的并行查找能力,使得TCAM每执行一次NFA状态转换,只需要一次TCAM时钟周期,从而保证了基于NFA方法的正则表达式匹配技术既可以实现像NFA一样的确定的匹配速度,同时又能避免状态膨胀;
本发明实施例将NFA的每个状态转换用一个TCAM条目表示,NFA运行中的一次状态转移的过程是指一个源活跃状态子集经过某个输入字符到达一个新的目的活跃状态子集的过程;
TCAM物理上由一个TCAM存储器和一个附属的SRAM存储器组成,TCAM逻辑上由若干个TCAM条目组成,每个TCAM条目由存储在TCAM存储器中的匹配域和存储在附属的SRAM存储器中的目的域组成,匹配域可存储“0”、“1”和“*”三种比特,其中“*”表示“不关心”(即“0”或“1”均可匹配“*”),目的域存储“0”和“1”两种比特。上述匹配域包括:源状态域、输入字符域,上述“目的域”可以只包括:目的状态域;或者,同时包括目的状态域和掩码域。在实际应用中,上述源状态域、输入字符域可以是由“0”、“1”和“*”组成的字符串,目的域可以是“0”和“1”组成的字符串。
上述NFA可能是由正则表达式规则编译得到,也可能是由字符串规则编译得到,甚至别的任何方式得到。
上述源状态域存储的是所述NFA状态转换的源活跃状态子集的活跃向量,输入字符域存放的是输入字符的ASCII编码;
TCAM条目的“目的域”可分两种方法表示:方法一,“目的域”仅由“目的状态域”组成,“目的状态域”存放的是“目的活跃状态子集”的“活跃向量”;方法二,“目的域”由“目的状态域”和“掩码域”组成,掩码域的长度为自循环兼容组的数目,即为每个自循环兼容组依次分配一个比特;当第i个自循环兼容组的掩码值为“1”,则该兼容组在“目的状态域”中存储该组在“目的活跃状态子集”中的“活跃码”与该组在“源活跃状态子集”中的“活跃码”的异或结果,否则该兼容组在“目的状态域”中直接存储该组在“目的活跃状态子集”中的“活跃码”;
在TCAM中存储NFA中所有的状态转移的方法可分为两种:方法一,枚举NFA中所有的状态转移并按照上述方案在TCAM中存储;方法二,基于“有效集”的方法。上述基于“有效集”存储NFA中所有状态转移的方法二的处理过程包括:
定义字符c的有效集Ec,它是所有自循环状态以及所有对字符c有转移边的NFA状态的集合;
依次为每一个字符各自生成一组TCAM条目,对当前字符c,其处理步骤如下:
步骤1计算Ec与NFA中每一个“活跃状态子集”S的交集,这些交集组成的集合记为Ic,即Ic=∪s(Ec∩S),将Ic中的这些交集按集合大小的非递增顺序进行排序;
步骤2依次处理排过序的Ic中的每一个交集Ec∩S,为之生成一个新的TCAM条目,在TCAM中,后生成的条目放置于先生成的条目之后:
步骤2.1.这个新条目的“输入字符域”存储的是字符c的编码;
步骤2.2.这个新条目的“源状态域”存储的“活跃向量”按如下设置:对Ec∩S中的每一个状态s,设置s所在的兼容组的编码为s的“活跃码”,对每一个自循环状态s′,若s′∈Ec但则设置s′所在的兼容组的编码为“0”,其他的兼容组的编码均设置为全“*”;
步骤2.3.若TCAM条目的“目的域”包含“掩码域”,则对每一个自循环状态s′,若s′对存在一条边经过字符c转移到自身,则在“掩码域”中设置s′所在的兼容组的编码为“1”,否则设置为“0”;
步骤2.4.这个新条目的“目的状态域”存储的“活跃向量”按如下设置:对Ec∩S中的所有状态,计算它们经过字符c所转移到的目的状态的集合,记为D,在新条目的“目的状态域”中存储D的“活跃向量”;
步骤2.5.若TCAM条目的“目的域”包含“掩码域”,则对每一个自循环状态s′,若s′所在的兼容组在“掩码域”中的值为“1”,则该兼容组在“目的状态域”中改为存储该组在“目的状态域”中的编码与该组在“源状态域”中的编码的异或结果。
步骤S104、对TCAM存储空间进行压缩。
定义一个TCAM条目Ti“匹配”另一个TCAM条目Tj,是指对于Ti和Tj的“匹配域”中的没一位比特,Ti在该比特位的值等于Tj在该比特位的值,或者Tj在该比特位的值为“*”;
定义两个TCAM条目的“冲突”关系,TCAM条目Ti与TCAM条目Tj冲突,当且仅当:条目Ti和条目Tj的“目的域”不相同并且NFA中存在一个“活跃状态子集”,使得由这个“活跃状态子集”的“活跃向量”拼接上某个输入字符的编码所组成的搜索关键词能够同时匹配条目Ti和条目Tj;
定义将一个TCAM条目Ti“合并到”另一个TCAM条目Tj的过程,即生成一个新条目T′j,T′j初始化为Tj,然后在T′j的“匹配域”,将Ti和Tj之间相异的比特位的值置为“*”,然后在TCAM中用T′j代替Tj,并删除条目Ti;
判断两个TCAM条目Ti和Tj能否合并的步骤如下:
步骤3如果Ti和Tj的“目的状态域”的值相同,则继续往下检查确保Ti和Tj的合并不会改变TCAM的语义;否则不能合并,返回检查结果,退出;
步骤4检查Ti和Tj之间的每一个条目,如果它们都不与Ti冲突,则可进入下述步骤继续检查Ti是否可以“合并到”Tj;如果它们都不与Tj冲突,则可进入下述步骤继续检查Tj是否可以“合并到”Ti;如果Ti和Tj之间存在一个条目Tk,它与Ti和Tj都冲突,则Ti和Tj不能合并,返回检查结果,退出;
步骤5假定检查Ti是否可以“合并到”Tj,然后不妨假定Ti可以“合并到”Tj,即生成一个新条目T′j代替Tj,若Ti和Tj的“匹配域”相差共m位比特,在T′j中,这m位比特全部都置“*”,可表示2m种不同的比特“0”和“1”的组合,依次对每一种组合,将T′j的这m位比特替换为这种组合,可得到一个新的条目T″j,下面检查T″j是否会改变TCAM语义:
步骤5.1.如果T″j不能被任何由一个“活跃状态子集”的“活跃向量”和输入字符的编码拼接而成的搜索关键词所匹配,则T″j不会改变TCAM语义,跳过下面两个步骤;
步骤5.2.如果T″j匹配条目Tj或者Tj以上的任意条目,则T″j不会改变TCAM语义,跳过下一个步骤;
步骤5.3.找到T″j下方第一个满足如下条件的条目T1:T″j匹配T1,且T″j和T1的“目的状态域”的值相同,再找到T″j下方第一个满足如下条件的条目T2:T″j和T2冲突,如果T2在T1上方(包括T2存在但T1不存在的情形),则T″j会改变TCAM语义,返回检查结果,退出;否则T″j不会改变TCAM语义;
如果以上检查发现所有的2m种不同的T″j都不会改变TCAM语义,则Ti确实可以“合并到”Tj,返回检查结果,退出;否则,交换Ti和Tj的角色,继续执行一次步骤3检查Tj是否可以“合并到”Ti;
在TCAM中迭代判断是否存在两个条目能够合并,如果能够合并则将其中一个条目“合并到”另一个条目,迭代过程直至TCAM中再无任意两个条目能够合并时终止;
若TCAM条目的“目的域”包含“掩码域”,则编码同一个字符的所有TCAM条目的“掩码域”的值都相同,故只需为每一个字符存储一份“掩码域”的值。
步骤S105、利用TCAM实现NFA匹配的方法,一次NFA状态转换只需要一次TCAM并行查找。
在本发明实施例中,一次NFA状态转换只需要一次TCAM并行查找。
将NFA的源活跃状态子集的编码和输入字符编码拼接作为TCAM的搜索关键词,对于TCAM返回的匹配结果,若TCAM条目的目的域仅由目的状态域组成,则返回的结果即为目的活跃状态子集的编码;否则,TCAM条目的目的域由目的状态域和掩码域组成,对匹配结果中掩码值为“1”的每一个自循环兼容组,将其编码与该组在搜索关键词中的编码做异或,异或的结果覆盖该组在匹配结果中的编码,最终得到的结果即为目的活跃状态子集的编码;
一次TCAM查找得到的目的活跃状态子集的编码,继续与下一个输入字符的编码拼接,作为新的搜索关键词,进入下一次状态转移。
实施例二
以下实施例均以正则表达式ab.*cd的和ef.*gh所生成的NFA进行说明,正则表达式ab.*cd用于识别如下特征的字符串:首先匹配ab,接下来是任意字符出现任意多次,接下来是cd;正则表达式ef.*gh用于识别如下特征的字符串:首先匹配ef,接下来是任意字符出现任意多次,接下来是gh。这两个正则表达式匹配的字符串均可以出现在输入文本中的任意位置。
将正则表达式编译为一个不含“ε边”(即不消耗任何输入字符转移到新状态的边)的NFA,将所有状态划分为若干个“兼容组”,在每个“兼容组”内部为每一个状态分配一个状态编码。
图2所示是用于匹配正则表达式ab.*cd的和ef.*gh的NFA,图中圆圈为NFA状态,箭头为NFA的状态转移边。状态0是起始状态,接收状态用双圈表示,状态7和状态8是接收状态,其中状态7接收规则ab.*cd,状态8接收规则ef.*gh。
●定义“活跃状态子集”,它是NFA运行过程中某一时刻所有同时活跃的状态的集合;
在图2中,NFA开始运行的时候,同时活跃的状态只有起始状态0,随着状态转移的不断进行,“活跃状态子集”不断发生变化,若输入为abc,则依次处理a,b,c后得到的“活跃状态子集”为{0,1},{0,3},{0,3,5};并不是任意一个NFA状态集合的子集都是“活跃状态子集”,如{0,6},因为NFA运行过程中不会出现仅有状态0和6活跃的情形,“活跃状态子集”的数目是有限的,可通过从“活跃状态子集”{0}出发遍历每一个已有的“活跃状态子集”和每一个字符以得到所有的“活跃状态子集”;
●定义“自循环状态”,它是NFA中转移到自身的边超过了一定阈值(128)的状态;
图2的自循环状态为状态0、3、4;
●定义“兼容组”,它是由若干NFA状态组成的集合,集合中的状态两两之间都不能同时活跃;
如图2中的状态0和1,由于它们同时出现在“活跃状态子集”{0,1}中,故状态0和1不能放在同一个兼容组中;
●每个自循环状态单独组成一个兼容组,称之为“自循环兼容组”;非自循环状态所组成的兼容组称之为“非自循环兼容组”;
●兼容组的划分方法如下:假设NFA中有n个状态,从0到n-1编号;维护一个二维布尔数组,记为incompatible,若incompatible[i][j](0≤i,j<n)的值为true表示状态i和j是不兼容的(即可以同时活跃的),
步骤1确定状态两两之间能否同时活跃:
步骤1.1incompatible中所有的值初始化为false;
步骤1.2维护一个状态对的队列,将所有的incompatible[i][i](0≤i<n)的值置为true,且将所有的状态对(i,i)(0≤i<n)入队;
步骤1.3依次迭代取队首元素(记为(i,j))出队,处理状态对(i,j)如下,直至队列为空:依次处理每一个字符c,将状态i和状态j经过字符c所到达的目的状态的集合记为D,对于D中的任意两个状态(i′,j′),若incompatible[i′][j′]尚未标记为true,则将incompatible[i′][j′]标记为true,并将状态对(i′,j′)入队;
步骤2每个自循环状态单独组成一个兼容组,然后依次迭代处理每一个NFA状态s,每次迭代过程如下:
步骤2.1如果s是自循环状态,不做处理,退出本次迭代;
步骤2.2逐个检查已有的每一个非自循环兼容组G:检查s与G(中的所有状态)是否是兼容的,也就是检查所有的incompatible[s][t](t∈G)是否都为false,如果是,则将s加入到兼容组G中,退出本次迭代;
步骤2.3若s与所有的非自循环兼容组都不兼容,则创建一个新的兼容组,将s加入这个组中;
图2中的NFA状态经过兼容组划分算法后,最终得到的四个兼容组如图3所示,其中,{0},{3},{4}是三个自循环兼容组,{1,2,5,6,7,8}是一个非自循环兼容组;
●在每个兼容组内,每个状态被分配一个状态编码,称之为“活跃码”,一个包含m个状态的兼容组需要为其中每个状态分配一个长度统一的(长为比特)各不相同的活跃码,其中全“0”的活跃码不分配给这m个状态;
图4所示的是每个NFA状态的“活跃码”,其中自循环状态0、3、4在各自的兼容组中的“活跃码”均为“1”,非自循环状态1、2、5、6、7、8在它们的兼容组中的“活跃码”分别为“001”、“010”、“011”、“100”、“101”、“110”。在此处以及下文中,为表达清晰,状态或状态的集合的编码均以下划线标注。
实施例三
该实施例提供了一种对NFA同时活跃的状态的集合进行编码的方法,具体处理过程如下:
NFA的每一个“活跃状态子集”的编码为一个长度统一的“活跃向量”,它由各个兼容组的编码组成,每个兼容组都在“活跃向量”中依次占据一段编码,若总共有k个兼容组,且第i(1≤i≤k)个兼容组中的状态的编码长度为1i,则第i个兼容组在“活跃向量”中占据长度为1i的第i段编码,“活跃向量”的总长度为
在实施例一中,已经为每个状态分配了兼容组以及“活跃码”,兼容组{0}、{3}、{4}和{1,2,5,6,7,8}依次在“活跃向量”中占据长度为1、1、1和3的一段编码,“活跃向量”的长度为各个兼容组编码的长度之和,即6;
对于一个“活跃状态子集”,它包含的状态都分属于不同的兼容组,遍历其中每一个状态,若此状态属于第i个兼容组,则“活跃向量”中的第i段编码设置为该状态的“活跃码”;对于无任何状态出现在该“活跃状态子集”中的兼容组,它在“活跃向量”中占据的编码设置为全“0”;
如“活跃状态子集”{0,1,3}的“活跃向量”为“110001”,兼容组{4}中没有状态在此“活跃向量”中出现,故其在“活跃向量”中的第3段编码用全“0”表示。
实施例四
该实施例提供了在TCAM中对NFA的状态转移进行编码的方法,具体处理过程如下:
为了方便说明,在下文的文字说明和图示中,字符域的值直接用字符本身表示,但字符域实际存储的是由“0”、“1”或“*”组成的编码。
图5、图6均为对“活跃状态子集”{0}和{0,3}产生的状态转移进行编码的TCAM条目,但在TCAM条目的表示上有差异。
其特征如下:
●NFA运行中的一次状态转移的过程是指一个“源活跃状态子集”经过某个输入字符到达一个新的“目的活跃状态子集”的过程;
“源活跃状态子集”{0}会产生如下状态转移:经过字符a转移到“目的活跃状态子集”{0,1};经过字符e转移到“目的活跃状态子集”{0,2};经过除a和e以外的字符均转移到“目的活跃状态子集”{0};
“源活跃状态子集”{0,3}会产生如下状态转移:经过字符a转移到“目的活跃状态子集”{0,3,1};经过字符c转移到“目的活跃状态子集”{0,3,5};经过字符e转移到“目的活跃状态子集”{0,3,2};经过除a、c和e以外的字符均转移到“目的活跃状态子集”{0,3};
●TCAM物理上由一个TCAM存储器和一个附属的SRAM存储器组成,TCAM逻辑上由若干个“TCAM条目”组成,每个TCAM条目由存储在TCAM存储器中的“匹配域”和存储在附属的SRAM存储器中的“目的域”组成,“匹配域”可存储“0”、“1”和“*”三种比特,其中“*”表示“不关心”(即“0”或“1”均可匹配“*”),“目的域”存储“0”和“1”两种比特;
●NFA的一次状态转移存储在一个“TCAM条目”中;
如图5、图6所示,左边的TCAM存储器中存储的是TCAM条目的“匹配域”,右边的SRAM存储器中存储的是TCAM条目的“目的域”;
●TCAM条目的“匹配域”由“源状态域”和“输入字符域”组成,“源状态域”存放的是“源活跃状态子集”的“活跃向量”,“输入字符域”存放的是输入字符的ASCII编码;
如图5、图6所示,前三个条目编码“源活跃状态子集”{0}的状态转移,{0}的活跃向量为“100000”,故这三个条目的“源状态域”的值均为“100000”,实际上每个“源活跃状态子集”对应256个输入字符应有256个状态转移,因为空间限制,此处将除字符a和e以外的条目合并表示成一个条目表示,其“输入字符域”用全“*”表示,表示可以匹配任意字符;类似地,后四个条目编码“源活跃状态子集”{0,3}的状态转移,{0,3}的活跃向量为“110000”,故这四个条目的“源状态域”的值均为“110000”;
●TCAM条目的“目的域”可分两种方法表示:
方法一,“目的域”仅由“目的状态域”组成,“目的状态域”存放的是“目的活跃状态子集”的“活跃向量”;
图6所示,第一个条目表示“源活跃状态子集”{0}经过输入字符a,到达的目的状态为{0,1},对应存储在“目的状态域”的“活跃向量”为“100001”;
●方法二,成之为“异或编码”的方法,“目的域”由“目的状态域”和“掩码域”组成,掩码域的长度为自循环兼容组的数目,即为每个自循环兼容组依次分配一个比特;当第i个自循环兼容组的掩码值为“1”,则该兼容组在“目的状态域”中存储该组在“目的活跃状态子集”中的“活跃码”与该组在“源活跃状态子集”中的“活跃码”的异或结果,否则该兼容组在“目的状态域”中直接存储该组在“目的活跃状态子集”中的“活跃码”;采用此方法可使得对于某些原本“目的域”的值不相同的TCAM条目,经过“异或编码”以后,它们的“目的域”变得相同;
图6所示的是对“活跃状态子集”{0}和{0,3}产生的状态转移进行编码的TCAM条目,其中“目的域”由“目的状态域”和“掩码域”组成;图6中所有的条目的“掩码域”的值均为全“1”,表示对所有的自循环状态在“目的状态域”中均存储“目的活跃状态子集”中的“活跃码”与该组在“源活跃状态子集”中的“活跃码”的异或结果,如图6中的第一个条目,表示“源活跃状态子集”{0}(编码为“100000”)经过输入字符a,到达的目的状态为{0,1}(编码为“100001”),对所有的自循环状态做异或操作,得到最终存储在“目的状态域”的编码为“000001”;类似地,图5中的第四个条目表示“源活跃状态子集”{0,3}(编码为“110000”)经过输入字符a,到达的目的状态为{0,3,1}(编码为“110001”),经过“异或编码”以后,“目的状态域”实际存储的编码为“000001”;由此可以看出,原本图5中“目的域”不相同的第一和第四个TCAM条目,采用“异或编码”以后,它们的“目的域”变得相同了,均为“000001111”(后三位比特表示“掩码域”的值);后面的实例都采用“异或编码”的方法;
●在TCAM中存储NFA中所有的状态转移的方法可分为两种:
方法一,枚举NFA中所有的状态转移并按照上述方案在TCAM中存储;通过遍历NFA并记录所有可能出现的“活跃状态子集”,然后将每个“活跃状态子集”和每一个字符分别生成一个TCAM条目。
实施例五
该实施例提供的一种基于有效集存储NFA中所有状态转移的方法的处理过程主要包括:
为每一个字符各自生成一组TCAM条目,本实施例以字符b为例进行说明,图7所示的为编码输入字符为b的所有状态转移的TCAM条目;
●定义字符b的有效集Eb,它是所有自循环状态以及所有对字符b有转移边的NFA状态的集合;
对于字符b,Eb={0,3,4,1};
●对当前字符b,其步骤如下;
步骤1计算Eb与NFA中每一个“活跃状态子集”S的交集,这些交集组成的集合记为Ib,即Ib=∪s(Eb∩S),将Ib中的这些交集按集合大小的非递增顺序进行排序;
从起始的“活跃状态子集”{0}出发遍历NFA即可找到所有的“活跃状态子集”,将它们与“有效集”一一取交集,即构成了集合Ib,Ib={{0,3,4,1},{0,3,1},{0,4,1},{0,3,4},{0,1},{0,3},{0,4},{0}},其中各交集按非递增顺序排序;
步骤2依次处理排过序的Ib中的每一个交集Eb∩S,为之生成一个新的TCAM条目,在TCAM中,后生成的条目放置于先生成的条目之后:
如图6所示,依次为Ib中的每一个交集生成一个TCAM条目;
步骤2.1.这个新条目的“输入字符域”存储的是字符b的编码;
步骤2.2.这个新条目的“源状态域”存储的“活跃向量”按如下设置:对Eb∩S中的每一个状态s,设置s所在的兼容组的编码为s的“活跃码”,对每一个自循环状态s′,若s′∈Eb但则设置s′所在的兼容组的编码为“0”,其他的兼容组的编码均设置为全“*”;
这样,对于任何一个对当前输入字符有出边的自循环状态,它在“源状态域”中的编码总是为“0”或“1”,不会为“*”,如此设置是为了实现在“目的域”的异或编码;
步骤2.3.若TCAM条目的“目的域”包含“掩码域”,则对每一个自循环状态s′,若s′对存在一条边经过字符b转移到自身,则在“掩码域”中设置s′所在的兼容组的编码为“1”,否则设置为“0”;在步骤2.2中,保证了对字符b有出边的自循环状态的编码都是“0”或“1”,对这样的自循环状态所对应的掩码,标记为“1”;
步骤2.4.这个新条目的“目的状态域”存储的“活跃向量”按如下设置:对Eb∩S中的所有状态,计算它们经过字符b所转移到的目的状态的集合,记为D,在新条目的“目的状态域”中存储D的“活跃向量”;
步骤2.5.若TCAM条目的“目的域”包含“掩码域”,则对每一个自循环状态s′,若s′所在的兼容组在“掩码域”中的值为“1”,则该兼容组在“目的状态域”中改为存储该组在“目的状态域”中的编码与该组在“源状态域”中的编码的异或结果。
最终,图7所示就是对NFA中所有对字符b状态转移的编码,其“目的域”包含“掩码域”。
以上对状态转移的编码方案保证对NFA中的每一个“活跃状态子集”,其在TCAM中都会得到正确的匹配结果。对于任意字符c,以及任意“活跃状态子集”S,一方面,S和c的编码所组成的搜索关键词必然会匹配为Ec∩S所生成的条目(记为T),并且根据“有效集”的含义可知,集合Ec∩S对应的目的状态子集正好就是S对应的目的状态子集,因此T的“目的域”正确存储了S经过字符c所到达的目的状态子集的编码;另一方面,S和c的编码所组成的搜索关键词不会匹配任何存储在T之前的条目,假设该搜索关键词匹配到了T之前的条目T′(不妨设T′是编码Ec∩S′的条目,S′也是一个“活跃状态子集”),则根据上述编码算法按交集的大小非递增顺序逐个编码可知,必有|Ec∩S′|≥|Ec∩S|,这就意味着存在一个状态s′∈Ec,且s′∈S′但则s′在T′中被设置s′的“活跃码”,但在由S和c的编码所组成的搜索关键词中,s′会被设置为全“0”,所以,该搜索关键词无法匹配T′。由此证明了任意“活跃状态子集”和任意字符都会在上述编码方法中实现正确匹配。
实施例六
该实施例提供的一种对TCAM存储空间(TCAM条目数)进行压缩的方法的处理过程主要包括:
以图7为例说明条目压缩的算法,图8为压缩后的结果。
●定义一个TCAM条目Ti“匹配”另一个TCAM条目Tj,是指对于Ti和Tj的“匹配域”中的没一位比特,Ti在该比特位的值等于Tj在该比特位的值,或者Tj在该比特位的值为“*”;
如图7中的第一个条目可以“匹配”第四个条目;
●定义两个TCAM条目的“冲突”关系,TCAM条目Ti与TCAM条目Tj冲突,当且仅当:条目Ti和条目Tj的“目的域”不相同并且NFA中存在一个“活跃状态子集”,使得由这个“活跃状态子集”的“活跃向量”拼接上某个输入字符的编码所组成的搜索关键词能够同时匹配条目Ti和条目Tj;
如图7中第三个条目和第七个条目是“冲突”的,因为存在一个“活跃状态子集”{0,4,1},其“活跃向量”为“101001”,在输入字符为b的条件下,搜索关键词“101001b”能同时匹配这两个条目,且这两个条目的“目的域”不相同,若交换或者合并这两个条目,就可能造成TCAM语义改变,使得某些搜索关键词返回错误的“目的域”;
●定义将一个TCAM条目Ti“合并到”另一个TCAM条目Tj的过程,即生成一个新条目T′j,T′j初始化为Tj,然后在T′j的“匹配域”,将Ti和Tj之间相异的比特位的值置为“*”,然后在TCAM中用T′j代替Tj,并删除条目Ti;
如图7,若将第一个条目“合并到”第三个条目,则第三个条目的“匹配域”修改为“1*1001”,即将它们相差的第二位比特的值置为“*”,然后删除第一个条目;
●判断两个TCAM条目Ti和Tj能否合并的步骤如下:
步骤1如果Ti和Tj的“目的状态域”的值相同,则继续往下检查确保Ti和Tj的合并不会改变TCAM的语义;否则不能合并,返回检查结果,退出;
步骤2检查Ti和Tj之间的每一个条目,如果它们都不与Ti冲突,则可进入下述步骤继续检查Ti是否可以“合并到”Tj;如果它们都不与Tj冲突,则可进入下述步骤继续检查Tj是否可以“合并到”Tj;如果Ti和Tj之间存在一个条目Tk,它与Ti和Tj都冲突,则Ti和Tj不能合并,返回检查结果,退出;
图7中判断第四个条目能否与第八个条目合并时,这两个条目之间的条目,故可以继续进入下面的步骤检查第四个条目能否“合并到”第八个条目;但反过来此步骤已可以判断第八个条目不能“合并到”第四个条目,因为第八个条目与第五个条目冲突;
步骤3假定检查Ti是否可以“合并到”Tj,然后不妨假定Ti可以“合并到”Tj,即生成一个新条目T′j代替Tj,若Ti和Tj的“匹配域”相差共m位比特,在T′j中,这m位比特全部都置“*”,可表示2m种不同的比特“0”和“1”的组合,依次对每一种组合,将T′j的这m位比特替换为这种组合,可得到一个新的条目T″j,下面检查T″j是否会改变TCAM语义:
步骤3.1.如果T″j不能被任何由一个“活跃状态子集”的“活跃向量”和输入字符的编码拼接而成的搜索关键词所匹配,则T″j不会改变TCAM语义,跳过下面两个步骤;
步骤3.2.如果T″j匹配条目Tj或者Tj以上的任意条目,则T″j不会改变TCAM语义,跳过下一个步骤;
步骤3.3.找到T″j下方第一个满足如下条件的条目T1:T″j匹配T1,且T″j和T1的“目的状态域”的值相同,再找到T″j下方第一个满足如下条件的条目T2:T″j和T2冲突,如果T2在T1上方(包括T2存在但T1不存在的情形),则T″j会改变TCAM语义,返回检查结果,退出;否则T″j不会改变TCAM语义;
如果以上检查发现所有的2m种不同的T″j都不会改变TCAM语义,则Ti确实可以“合并到”Tj,返回检查结果,退出;否则,交换Ti和Tj的角色,继续执行一次步骤3检查Tj是否可以“合并到”Ti;
●在TCAM中迭代判断是否存在两个条目能够合并,如果能够合并则将其中一个条目“合并到”另一个条目,迭代过程直至TCAM中再无任意两个条目能够合并时终止;
图8为图7最后的压缩结果;
●若TCAM条目的“目的域”包含“掩码域”,则编码同一个字符的所有TCAM条目的“掩码域”的值都相同,故只需为每一个字符存储一份“掩码域”的值。
实施例七
该实施例提供的一种利用TCAM实现正则表达式匹配的方法的处理过程主要包括:
一次NFA状态转换只需要一次TCAM并行查找;
将NFA的“源活跃状态子集”的编码和输入字符编码拼接作为TCAM的搜索关键词,对于TCAM返回的匹配结果,若TCAM条目的“目的域”仅由“目的状态域”组成,则返回的结果即为“目的活跃状态子集”的编码;否则,TCAM条目的“目的域”由“目的状态域”和“掩码域”组成,对匹配结果中掩码值为“1”的每一个“自循环兼容组”,将其编码与该组在搜索关键词中的编码做异或,异或的结果覆盖该组在匹配结果中的编码,最终得到的结果即为“目的活跃状态子集”的编码;
一次TCAM查找得到的“目的活跃状态子集”的编码,继续与下一个输入字符的编码拼接,作为新的搜索关键词,进入下一次状态转移。
图9为使用本发明的编码方法和压缩方法,最终得到的用于匹配正则表达式ab.*cd的和ef.*gh的TCAM,对应的NFA(如图2)共9个NFA状态,而TCAM仅需9个条目存储这个NFA,在存储空间上,没有发生任何以往DFA方法所遇到的体积膨胀。下面结合输入字符流为ab对用TCAM实现正则表达式匹配的过程予以说明,NFA开始运行的时候,“活跃状态子集”为{0},其编码(即“活跃向量”)为“100000”,与输入字符a的ASCII编码组合成搜索关键词,在图9的TCAM中,“100000a”将会匹配第一个和最后一个条目,TCAM返回第一个条目,得到对应的“目的状态域”的值为“000001”和“掩码域”为“111”,对“目的状态域”中的所有“自循环兼容组”的编码做异或,得到真实的“目的状态子集”编码为“100001”(即{0,1}的“活跃向量”);接下来处理下一个字符,编码“100001”与下一个输入字符为b的ASCII编码组合成搜索关键词,在图9的TCAM中进行查询,TCAM返回第二个条目的“目的状态域”的值为“010000”和“掩码域”为“111”,经过对自循环兼容组做异或,得到真实的“目的状态子集”编码为“110000”(即{0,3}的“活跃向量”)。
本例说明了一次NFA状态转换消化一个输入字符,仅需要一次TCAM查询。
实施例八
该实施例提供了一种基于TCAM的NFA的匹配装置,其具体结构如图10所示,包括如下的模块:
编码处理模块101,用于对非确定性有穷状态自动机NFA的状态和活跃状态子集进行编码;
TCAM条目构造模块102,用于将所述NFA的每个状态转移边用一个三态内容寻址存储器TCAM条目表示,每个TCAM条目由匹配域和目的域组成,所述匹配域包括:源状态域、输入字符域,所述目的域包括目的状态域或者包括目的状态域和掩码域;
搜索匹配模块103,用于将所述NFA的源活跃状态子集的编码和输入字符的编码的拼接作为搜索关键词,按照所述搜索关键字在所述NFA的所有TCAM条目中进行搜索,将获取的目的活跃状态子集的编码作为输出结果,所述源活跃状态子集为所述NFA当前所有同时活跃的状态的集合,所述目的活跃状态子集为在所述NFA中输入所述输入字符、进行状态转换后,得到的同时活跃的状态的集合。
具体的,所述的编码处理模块101,还用于将所述活跃状态子集编码为一个活跃向量,该活跃向量由所述活跃状态子集中包括的每个状态所归属的兼容组中的活跃码进行拼接得到,所述兼容组是由若干NFA状态组成的集合,该集合中的状态两两之间都不能同时活跃,每个自循环状态单独组成一个自循环兼容组,所述自循环状态是NFA中转移到自身的边超过了一定阈值的状态,所述活跃码为所述兼容组为组内每个状态各自分配的一个唯一的非全0的编码。
具体的,所述的TCAM条目构造模块102,还用于将所述TCAM条目的目的域分两种方法表示:方法一,所述目的域仅由目的状态域组成,所述目的状态域存放的是目的活跃状态子集的活跃向量;方法二,所述目的域由目的状态域和掩码域组成,所述掩码域的长度为自循环兼容组的数目,即为每个自循环兼容组依次分配一个比特;若所述自循环兼容组在所述掩码域中的掩码值为“1”,则在目的状态域中存储所述自循环兼容组在目的活跃状态子集中的活跃码与所述自循环兼容组在源活跃状态子集中的活跃码的异或结果,否则直接存储所述自循环兼容组在目的活跃状态子集中的活跃码;
所述编码NFA中所有的状态转移的方法为:
枚举所述NFA中所有的状态转移,将每一个状态转移所对应的源状态域、输入字符域和目的域存储在一个TCAM条目中,所述源状态域中存储源状态的编码,所述输入字符域中存储输入字符的编码,所述目的域中的目的状态域中存储目的状态的编码;
或者;
获取所述NFA中的每个输入字符c的有效集Ec,该Ec是所有自循环状态以及所有对所述输入字符有转移边的NFA状态的集合,针对每个输入字符计算Ec与所述NFA中每一个活跃状态子集S的交集,这些交集组成的集合记为Ic,即Ic=∪s(Ec∩S),将Ic中的各个交集按集合大小的非递增顺序进行排序;
依次处理排过序的所述Ic中的每一个交集Ec∩S,为每一个交集Ec∩S生成一个新的TCAM条目,在所述新的TCAM条目的输入字符域中存储输入字符的编码;
所述Ec∩S的活跃向量按如下方式生成,对Ec∩S中的每一个状态s,设置s所在的兼容组的编码为s的活跃码,对每一个自循环状态s′,若s′∈Ec但则设置s′所在的兼容组的编码为“0”,其他的兼容组的编码均设置为全“*”,将所有兼容组的编码组合成活跃向量,在所述新的TCAM条目的源状态域中存储所述活跃向量;
对Ec∩S中的所有状态,计算它们经过所述输入字符所转移到的目的状态的集合记为D,在所述新的TCAM条目的目的状态域中存储所述D的活跃向量;
当所述目的域中包含掩码域时,则对Ec∩S中的每一个自循环状态s′,在掩码域中为s′分配一个比特,判断s′是否存在一条边经过所述输入字符转移到自身,如果是,则在s′的掩码域中设置s′所在的兼容组的编码为1;否则,在s′的掩码域中设置s′所在的兼容组的编码为0;
当所述目的域包含掩码域时,则对Ec∩S中的每一个自循环状态s′,若s′所在的兼容组在掩码域中的值为1,则s′的目的状态域中存储s′在目的状态域中的编码与s′在源状态域中的编码的异或结果。
进一步地,所述的装置还包括:
TCAM条目缩减模块104,用于当所述NFA的一个TCAM条目Ti和另一个TCAM条目Tj的目的状态域相同、匹配域相差共m位比特,生成一个新TCAM条目T′k,T′k初始化为Tj,在T′k的匹配域中将Ti和Tj之间相异的比特位的值置为“*”,若在TCAM中用T′k代替Tj,并删除Ti后不影响TCAM的语义正确性,则在TCAM中用T′k代替Tj,并删除Ti。
具体的,所述的搜索匹配模块103,还用于按照所述搜索关键字在所述NFA的所有TCAM条目中进行并行搜索,一次NFA状态转换只需要一次TCAM并行搜索,当TCAM条目的目的域仅由目的状态域组成时,则搜索得到的所有目的状态域的编码的组合即为目的活跃状态子集的编码;
当TCAM条目的目的域由目的状态域和掩码域组成时,对于源状态域中的每一个自循环兼容组,当所述自循环兼容组在搜索得到的掩码域中的值为1时,将搜索得到的目的状态域的编码与所述自循环兼容组的编码做异或,将异或的结果作为最终搜索得到的目的状态域的编码,将最终搜索得到的所有目的状态域的编码的组合作为目的活跃状态子集的编码;
将上一次TCAM并行搜索得到的目的活跃状态子集的编码,继续与下一个输入字符的编码拼接,作为新的搜索关键词,进入下一次TCAM并行搜索。
应用本发明实施例的装置进行NFA匹配的具体处理过程与前述方法实施例类似,此处不再赘述。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-OnlyMemory,ROM)或随机存储记忆体(RandomAccessMemory,RAM)等。
综上所述,本发明实施例通过在TCAM中对NFA状态和NFA的同时活跃的状态子集进行合适的编码,将NFA的每个状态转换用一个TCAM条目表示,使得NFA的一次状态转换仅需要一次TCAM并行查找就能完成,从而提高了NFA的匹配速度和效果,实现了和基于DFA的正则表达式匹配技术一样的匹配速度。
本发明实施例利用TCAM的三态存储能力,提出一种压缩TCAM条目数的方法,使得NFA所需的TCAM存储空间较小。本发明实施例实现了同时兼顾了正则表达式匹配技术的两大关键性能指标--匹配速度和存储空间。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。
Claims (10)
1.一种基于TCAM的非确定性有穷状态自动机的匹配方法,其特征在于,包括:
对NFA的状态和活跃状态子集进行编码,将所述NFA的每个状态转移边用一个三态内容寻址存储器TCAM条目表示,每个TCAM条目由匹配域和目的域组成,所述匹配域包括:源状态域、输入字符域,所述目的域包括目的状态域或者包括目的状态域和掩码域;
将所述NFA的源活跃状态子集的编码和输入字符的编码的拼接作为搜索关键词,按照所述搜索关键字在所述NFA的所有TCAM条目的匹配域中进行搜索,将获取的目的活跃状态子集的编码作为输出结果,所述源活跃状态子集为所述NFA当前所有同时活跃的状态的集合,所述目的活跃状态子集为在所述NFA中输入所述输入字符、进行状态转换后,得到的同时活跃的状态的集合。
2.根据权利要求1所述的基于TCAM的非确定性有穷状态自动机的匹配方法,其特征在于,对所述NFA的状态和活跃状态子集进行编码,包括:
将所述活跃状态子集编码为一个活跃向量,该活跃向量由所述活跃状态子集中包括的每个状态所归属的兼容组中的活跃码进行拼接得到,所述兼容组是由若干NFA状态组成的集合,该集合中的状态两两之间都不能同时活跃,每个自循环状态单独组成一个自循环兼容组,所述自循环状态是NFA中转移到自身的边超过了一定阈值的状态,所述活跃码为所述兼容组为组内每个状态各自分配的一个唯一的非全0的编码。
3.根据权利要求1所述的基于TCAM的非确定性有穷状态自动机的匹配方法,其特征在于,所述的将NFA的每个状态转移边用一个三态内容寻址存储器TCAM条目表示,每个TCAM条目由匹配域和目的域组成,包括:将所述TCAM条目的目的域分两种方法表示:方法一,所述目的域仅由目的状态域组成,所述目的状态域存放的是目的活跃状态子集的活跃向量;方法二,所述目的域由目的状态域和掩码域组成,所述掩码域的长度为自循环兼容组的数目,即为每个自循环兼容组依次分配一个比特;若所述自循环兼容组在所述掩码域中的掩码值为“1”,则在目的状态域中存储所述自循环兼容组在目的活跃状态子集中的活跃码与所述自循环兼容组在源活跃状态子集中的活跃码的异或结果,否则直接存储所述自循环兼容组在目的活跃状态子集中的活跃码;
所述编码NFA中所有的状态转移的方法为:
枚举所述NFA中所有的状态转移,将每一个状态转移所对应的源状态域、输入字符域和目的域存储在一个TCAM条目中,所述源状态域中存储源状态的编码,所述输入字符域中存储输入字符的编码,所述目的域中的目的状态域中存储目的状态的编码;
或者;
获取所述NFA中的每个输入字符c的有效集Ec,该Ec是所有自循环状态以及所有对所述输入字符有转移边的NFA状态的集合,针对每个输入字符计算Ec与所述NFA中每一个活跃状态子集S的交集,这些交集组成的集合记为Ic,即Ic=∪S(Ec∩S),将Ic中的各个交集按集合大小的非递增顺序进行排序;
依次处理排过序的所述Ic中的每一个交集Ec∩S,为每一个交集Ec∩S生成一个新的TCAM条目,在所述新的TCAM条目的输入字符域中存储输入字符的编码;
所述Ec∩S的活跃向量按如下方式生成,对Ec∩S中的每一个状态s,设置s所在的兼容组的编码为s的活跃码,对每一个自循环状态s',若s′∈Ec但则设置s′'所在的兼容组的编码为“0”,其他的兼容组的编码均设置为全“*”,将所有兼容组的编码组合成活跃向量,在所述新的TCAM条目的源状态域中存储所述活跃向量;
对Ec∩S中的所有状态,计算它们经过所述输入字符所转移到的目的状态的集合记为D,在所述新的TCAM条目的目的状态域中存储所述D的活跃向量;
当所述目的域中包含掩码域时,则对Ec∩S中的每一个自循环状态s',在掩码域中为s'分配一个比特,判断s'是否存在一条边经过所述输入字符转移到自身,如果是,则在s'的掩码域中设置s'所在的兼容组的编码为1;否则,在s'的掩码域中设置s'所在的兼容组的编码为0;
当所述目的域包含掩码域时,则对Ec∩S中的每一个自循环状态s',若s'所在的兼容组在掩码域中的值为1,则s'的目的状态域中存储s'在目的状态域中的编码与s'在源状态域中的编码的异或结果。
4.根据权利要求1所述的基于TCAM的非确定性有穷状态自动机的匹配方法,其特征在于,所述的方法还包括:
当所述NFA的一个TCAM条目Ti和另一个TCAM条目Tj的目的状态域相同、匹配域相差共m位比特,生成一个新TCAM条目T'k,T'k初始化为Tj,在T'k的匹配域中将Ti和Tj之间相异的比特位的值置为“*”,若在TCAM中用T'k代替Tj,并删除Ti后不影响TCAM的语义正确性,则在TCAM中用T'k代替Tj,并删除Ti。
5.根据权利要求1或2或3或4所述的基于TCAM的非确定性有穷状态自动机的匹配方法,其特征在于,所述的将所述NFA的源活跃状态子集的编码和输入字符的编码的拼接作为搜索关键词,按照所述搜索关键字在所述NFA的所有TCAM条目中进行搜索,将获取的目的活跃状态子集的编码作为输出结果,包括:
按照所述搜索关键字在所述NFA的所有TCAM条目中进行并行搜索,一次NFA状态转换只需要一次TCAM并行搜索,当TCAM条目的目的域仅由目的状态域组成时,则搜索得到的所有目的状态域的编码的组合即为目的活跃状态子集的编码;
当TCAM条目的目的域由目的状态域和掩码域组成时,对于源状态域中的每一个自循环兼容组,当所述自循环兼容组在搜索得到的掩码域中的值为1时,将搜索得到的目的状态域的编码与所述自循环兼容组的编码做异或,将异或的结果作为最终搜索得到的目的状态域的编码,将最终搜索得到的所有目的状态域的编码的组合作为目的活跃状态子集的编码;
将上一次TCAM并行搜索得到的目的活跃状态子集的编码,继续与下一个输入字符的编码拼接,作为新的搜索关键词,进入下一次TCAM并行搜索。
6.一种基于TCAM的非确定性有穷状态自动机的匹配装置,其特征在于,包括:
编码处理模块,用于对NFA的状态和活跃状态子集进行编码;
TCAM条目构造模块,用于将所述NFA的每个状态转移边用一个三态内容寻址存储器TCAM条目表示,每个TCAM条目由匹配域和目的域组成,所述匹配域包括:源状态域、输入字符域,所述目的域包括目的状态域或者包括目的状态域和掩码域;
搜索匹配模块,用于将所述NFA的源活跃状态子集的编码和输入字符的编码的拼接作为搜索关键词,按照所述搜索关键字在所述NFA的所有TCAM条目中进行搜索,将获取的目的活跃状态子集的编码作为输出结果,所述源活跃状态子集为所述NFA当前所有同时活跃的状态的集合,所述目的活跃状态子集为在所述NFA中输入所述输入字符、进行状态转换后,得到的同时活跃的状态的集合。
7.根据权利要求6所述的基于TCAM的非确定性有穷状态自动机的匹配装置,其特征在于:
所述的编码处理模块,还用于将所述活跃状态子集编码为一个活跃向量,该活跃向量由所述活跃状态子集中包括的每个状态所归属的兼容组中的活跃码进行拼接得到,所述兼容组是由若干NFA状态组成的集合,该集合中的状态两两之间都不能同时活跃,每个自循环状态单独组成一个自循环兼容组,所述自循环状态是NFA中转移到自身的边超过了一定阈值的状态,所述活跃码为所述兼容组为组内每个状态各自分配的一个唯一的非全0的编码。
8.根据权利要求6所述的基于TCAM的非确定性有穷状态自动机的匹配装置,其特征在于:
所述的TCAM条目构造模块,还用于将所述TCAM条目的目的域分两种方法表示:方法一,所述目的域仅由目的状态域组成,所述目的状态域存放的是目的活跃状态子集的活跃向量;方法二,所述目的域由目的状态域和掩码域组成,所述掩码域的长度为自循环兼容组的数目,即为每个自循环兼容组依次分配一个比特;若所述自循环兼容组在所述掩码域中的掩码值为“1”,则在目的状态域中存储所述自循环兼容组在目的活跃状态子集中的活跃码与所述自循环兼容组在源活跃状态子集中的活跃码的异或结果,否则直接存储所述自循环兼容组在目的活跃状态子集中的活跃码;
所述编码NFA中所有的状态转移的方法为:
枚举所述NFA中所有的状态转移,将每一个状态转移所对应的源状态域、输入字符域和目的域存储在一个TCAM条目中,所述源状态域中存储源状态的编码,所述输入字符域中存储输入字符的编码,所述目的域中的目的状态域中存储目的状态的编码;
或者;
获取所述NFA中的每个输入字符c的有效集Ec,该Ec是所有自循环状态以及所有对所述输入字符有转移边的NFA状态的集合,针对每个输入字符计算Ec与所述NFA中每一个活跃状态子集S的交集,这些交集组成的集合记为Ic,即Ic=∪S(Ec∩S),将Ic中的各个交集按集合大小的非递增顺序进行排序;
依次处理排过序的所述Ic中的每一个交集Ec∩S,为每一个交集Ec∩S生成一个新的TCAM条目,在所述新的TCAM条目的输入字符域中存储输入字符的编码;
所述Ec∩S的活跃向量按如下方式生成,对Ec∩S中的每一个状态s,设置s所在的兼容组的编码为s的活跃码,对每一个自循环状态s',若s′∈Ec但则设置s′'所在的兼容组的编码为“0”,其他的兼容组的编码均设置为全“*”,将所有兼容组的编码组合成活跃向量,在所述新的TCAM条目的源状态域中存储所述活跃向量;
对Ec∩S中的所有状态,计算它们经过所述输入字符所转移到的目的状态的集合记为D,在所述新的TCAM条目的目的状态域中存储所述D的活跃向量;
当所述目的域中包含掩码域时,则对Ec∩S中的每一个自循环状态s',在掩码域中为s'分配一个比特,判断s'是否存在一条边经过所述输入字符转移到自身,如果是,则在s'的掩码域中设置s'所在的兼容组的编码为1;否则,在s'的掩码域中设置s'所在的兼容组的编码为0;
当所述目的域包含掩码域时,则对Ec∩S中的每一个自循环状态s',若s'所在的兼容组在掩码域中的值为1,则s'的目的状态域中存储s'在目的状态域中的编码与s'在源状态域中的编码的异或结果。
9.根据权利要求6所述的基于TCAM的非确定性有穷状态自动机的匹配装置,其特征在于,所述的装置还包括:
TCAM条目缩减模块,用于当所述NFA的一个TCAM条目Ti和另一个TCAM条目Tj的目的状态域相同、匹配域相差共m位比特,生成一个新TCAM条目T'k,T'k初始化为Tj,在T'k的匹配域中将Ti和Tj之间相异的比特位的值置为“*”,若在TCAM中用T'k代替Tj,并删除Ti后不影响TCAM的语义正确性,则在TCAM中用T'k代替Tj,并删除Ti。
10.根据权利要求6至9任一项所述的基于TCAM的非确定性有穷状态自动机的匹配装置,其特征在于:
所述的搜索匹配模块,还用于按照所述搜索关键字在所述NFA的所有TCAM条目中进行并行搜索,一次NFA状态转换只需要一次TCAM并行搜索,当TCAM条目的目的域仅由目的状态域组成时,则搜索得到的所有目的状态域的编码的组合即为目的活跃状态子集的编码;
当TCAM条目的目的域由目的状态域和掩码域组成时,对于源状态域中的每一个自循环兼容组,当所述自循环兼容组在搜索得到的掩码域中的值为1时,将搜索得到的目的状态域的编码与所述自循环兼容组的编码做异或,将异或的结果作为最终搜索得到的目的状态域的编码,将最终搜索得到的所有目的状态域的编码的组合作为目的活跃状态子集的编码;
将上一次TCAM并行搜索得到的目的活跃状态子集的编码,继续与下一个输入字符的编码拼接,作为新的搜索关键词,进入下一次TCAM并行搜索。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210021964.5A CN103226551B (zh) | 2012-01-31 | 2012-01-31 | 基于tcam的非确定性有限自动机的匹配方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210021964.5A CN103226551B (zh) | 2012-01-31 | 2012-01-31 | 基于tcam的非确定性有限自动机的匹配方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103226551A CN103226551A (zh) | 2013-07-31 |
CN103226551B true CN103226551B (zh) | 2016-05-25 |
Family
ID=48837005
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210021964.5A Expired - Fee Related CN103226551B (zh) | 2012-01-31 | 2012-01-31 | 基于tcam的非确定性有限自动机的匹配方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103226551B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104348729B (zh) * | 2014-10-11 | 2018-08-21 | 北京中创腾锐技术有限公司 | 一种软硬件结合的互联网流分类方法 |
CN106708532B (zh) * | 2016-12-30 | 2020-12-04 | 中国人民解放军国防科学技术大学 | 基于tcam的多层次正则表达式匹配方法 |
CN109765838B (zh) * | 2019-03-04 | 2020-12-15 | 杭州电子科技大学 | 可编程逻辑控制器组态文件的生成方法及装置 |
CN111988231B (zh) * | 2020-08-20 | 2022-07-22 | 国家计算机网络与信息安全管理中心 | 一种掩码五元组规则匹配的方法及装置 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1492359A (zh) * | 2002-04-10 | 2004-04-28 | 深圳市中兴通讯股份有限公司 | 一种多关键字自动状态机查找匹配方法 |
WO2007120165A2 (en) * | 2005-06-30 | 2007-10-25 | Intel Corporation | Stateful packet content matching mechanisms |
-
2012
- 2012-01-31 CN CN201210021964.5A patent/CN103226551B/zh not_active Expired - Fee Related
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1492359A (zh) * | 2002-04-10 | 2004-04-28 | 深圳市中兴通讯股份有限公司 | 一种多关键字自动状态机查找匹配方法 |
WO2007120165A2 (en) * | 2005-06-30 | 2007-10-25 | Intel Corporation | Stateful packet content matching mechanisms |
Also Published As
Publication number | Publication date |
---|---|
CN103226551A (zh) | 2013-07-31 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Pittel | Asymptotical growth of a class of random trees | |
CN103226551B (zh) | 基于tcam的非确定性有限自动机的匹配方法和装置 | |
AU2014315619B2 (en) | Methods and systems of four-valued simulation | |
CN106797446A (zh) | 基于存储器的历史搜索 | |
CN101154228A (zh) | 一种分段模式匹配方法及其装置 | |
CN103559016A (zh) | 一种基于图形处理器并行计算的频繁子图挖掘方法 | |
Hung | Embedding two edge-disjoint Hamiltonian cycles into locally twisted cubes | |
Krithivasan et al. | On string languages generated by spiking neural P systems with anti-spikes | |
Zhang et al. | SUMMA: subgraph matching in massive graphs | |
CN102521356A (zh) | 基于确定有限状态自动机的正则表达式匹配设备和方法 | |
Chen et al. | Graph indexing for efficient evaluation of label-constrained reachability queries | |
Bhamre et al. | Parallelization of Multipattern Matching on GPU | |
Capra et al. | Modular rewritable Petri nets: An efficient model for dynamic distributed systems | |
Porreca et al. | P systems simulating oracle computations | |
CN103294735B (zh) | 基于tcam的确定性有穷状态自动机dfa的匹配方法和装置 | |
de Visme | Event structures for mixed choice | |
Aizikowitz et al. | LR (0) conjunctive grammars and deterministic synchronized alternating pushdown automata | |
HÄGGKVIST¹ et al. | Oriented Hamilton cycles in oriented graphs | |
Dassow et al. | Grammars controlled by petri nets | |
CN113159791A (zh) | 一种基于区块链的分层式交易并行执行方法及系统 | |
Kapoutsis | Algorithms and lower bounds in finite automata size complexity | |
CN103294734B (zh) | 基于tcam的确定性有穷状态自动机dfa的匹配方法和装置 | |
Ling et al. | Link Prediction on Textual Edge Graphs | |
Flammini et al. | On devising boolean routing schemes | |
Ferlez et al. | Bisimulation in behavioral dynamical systems and generalized synchronization trees |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20160525 Termination date: 20220131 |
|
CF01 | Termination of patent right due to non-payment of annual fee |