专利名称:模式检测的装置与方法
技术领域:
本发明涉及用于检测数据流中的模式的装置与方法。
在许多计算环境中,使用了对数据流中特定模式的检测。例如,在诸如病毒检测的领域中,将需要对计算机所接收的数据流监视病毒的存在。病毒检查器将能够识别特定的病毒以及一般类型的病毒。病毒检查器将存取包括大量不同模式,或许在数量上超过1000的数据结构。模式可以包括诸如“password(口令)”的简单的字符序列(串),也可以按更灵活的方式被指定,例如,使用可以包括对字符类的一般参照,以及某字符和字符序列的出现次数的正则(regular)表达。
需要加以分析的、计算机所接收的数据流,将由一系列字节形成,并且按诸如TCP/IP(用于因特网通信)的公共协议,将以数据信息包的形式接收这些字节。当接收流时,针对所存储模式的存在,扫描形成数据流的这些数据信息包。可以通过软件执行这一扫描,或者在某些环境中,可以使用FPGA的专用的ASIC来执行模式匹配。如果检测到模式,则生成输出信号,然后依据具体的应用,执行诸如从数据信息包中删除该模式的动作。
所有已知的模式匹配系统都具有一或多个弱点。这些弱点包括对数据结构的大的存储需求、处理资源的高消费、对流动的数据实时模式匹配的困难、以及当要把针对新病毒的新模式添加于数据结构时更新存储模式的数据结构上的困难。
在A.V.Aho和M.J.Corasick的“Efficient string matchingAn aid tobibliographic search(高效串匹配文献搜索的助手)”,Communication of theACM,第18卷,第6期,第333~340页,1975年中,描述了一种通过构造传统的状态转变(transition)图而执行模式匹配的算法。该算法由根据关键字构造有限状态模式匹配机,以及使用该机器按单遍处理文本串组成。该方案把Knuth-Morris-Pratt算法的概念与有限状态机的概念相组合。然而,这一方法的存储效率、模式匹配性能以及更新性能受到相当大的限制。
因此,本发明的一个目的是对已知的技术进行改进。根据本发明的一个第一方面,提供了用于检测数据流中的模式的装置,一种用于检测数据流(12)中的模式的装置,该装置包括用于接收该数据流的模式匹配设备,该模式匹配设备包括一或多个规则引擎,所述或每一个规则引擎依据对多个模式进行编码的多个状态转变规则操作,第一状态转变规则包括通配符状态成分和通配符输入成分,第二状态转变规则包括通配符状态成分和指定的输入成分,以及第三状态转变规则包括指定的状态成分和指定的输入成分,该第一、第二以及第三规则具有不同的优先级,以及至少一个状态转变规则包括指示模式匹配的输出成分,该装置配置来把该数据流传送于所述或每一个规则引擎,并且进一步配置来当状态转变规则指示模式匹配时,输出指示模式匹配的信号。
根据本发明的第二方面,提供了一种用于检测数据流中的模式的方法,该方法包括接收该数据流、运行一或多个规则引擎,所述或每一个规则引擎依据对多个模式进行编码的多个状态转变规则操作,第一状态转变规则包括通配符状态成分和通配符输入成分,第二状态转变规则包括通配符状态成分和指定的输入成分,以及第三状态转变规则包括指定的状态成分和指定的输入成分,该第一、第二以及第三规则具有不同的优先级,以及至少一个状态转变规则包括指示模式匹配的输出成分,把该数据流传送于所述或每一个规则引擎,并且当状态转变规则指示模式匹配时,输出指示模式匹配的信号。
根据本发明的第三方面,提供了一种计算机可读媒体上的计算机程序产品,用于控制用于检测数据流中的模式的装置,该计算机程序产品包括用于接收所述数据流、运行一或多个规则引擎的指令,所述或每一个规则引擎依据对多个模式进行编码的多个状态转变规则操作,第一状态转变规则包括通配符状态成分和通配符输入成分,第二状态转变规则包括通配符状态成分和指定的输入成分,以及第三状态转变规则包括指定的状态成分和指定的输入成分,该第一、第二以及第三规则具有不同的优先级,以及至少一个状态转变规则包括指示模式匹配的输出成分,把该数据流传送于所述或每一个规则引擎,并且当状态转变规则指示模式匹配时,输出指示模式匹配的信号。
归功于本发明,可以提供一种改进的模式匹配方法。基于包括优先级的状态转变规则,使用规则引擎,以根据状态转变规则执行模式匹配,有助于系统在接收数据流时,可以针对数据流实时地进行操作,并且实现了对计算与存储器资源的有效的使用。可以按一种简单而及时的方式更新存储模式的数据结构。
有利的做法是,所述装置还包括模式分布设备,配置来接收模式、跨越多个模式集合分布模式、以及把每一模式集合转换成多个状态转变规则。模式分布设备执行把模式划分成一系列模式集合的算法,模式集合的数目等于规则引擎的数目。优选地,把模式分布设备配置为基本均匀地跨越多个模式集合分布模式。通过跨越这些集合均匀地划分模式,实现了对处理资源的最有效的使用,因为每一规则引擎将处置类似数目的模式。
理想的情况是,把模式分布设备配置成当跨越多个模式集合分布模式时,根据模式之间的共性和冲突分布模式。模式之间的共性可能为例如公共前缀,模式之间的冲突可能为例如一个模式的子串(不包括第一个字母)为另一个模式的前缀。通过跨越多个集合分布模式使得那些具有共性的模式处于同样的集合中,而那些具有冲突的模式处于不同的集合中,减少了每一规则引擎的状态转变规则的数目,在理想的情况下,甚至最小化了这一数目,因此减少了存储和处理资源的消耗。
优选地,所述装置还包括用于接收来自所述或每一个规则引擎的输出的结果处理器,该结果处理器配置来确定模式匹配是否发生。可以在简单的设置中使用结果处理器,以核对从规则引擎所接收的信号,或者在更复杂的配置,可将其用于判断是否发生了模式匹配。如果原始模式相对复杂,则这可能发生,令单个规则引擎确定模式匹配,在计算上并不高效。取而代之,可以使用多个引擎检测模式的不同的部分,而结果处理器则将根据各模式部分的匹配结果判断是否匹配原始模式。结果处理器能够检查诸如下述事情,如在它们的输出中指定附加条件的转变规则,这可能涉及数据流中模式的位置,以及应加以检测的多个模式的次序和数据流中多个模式之间的距离。
理想的情况是,状态转变规则至少之一包括字符类别成分。字符类别可以定义具体的字符组,例如数字和字母数字值。通过支持对字符类列的使用,可以把复杂的模式相对简单变换成可由规则引擎简单处理的状态转变规则。
有利的做法是,模式匹配设备包括多个规则引擎。在模式匹配设备的几乎所有实际应用中,将使用多个规则引擎,每一个规则引擎并行地处理所输入的数据流。由于已经把原始模式分割成分离放置冲突模式的模式集合,于是,规则引擎的数目越大,每一模式集合中模式之间冲突的减少就越大。模式匹配设备所使用的规则引擎的实际数目是一种设计选择,然而,对于许多应用,适合的值将为8或16个规则引擎。所使用的引擎的数目越大,总的存储器需求将越小。这是因为,模式之间冲突的减少,减少了对这些模式进行编码的状态转变规则的数目,因此,减少了存储状态转变规则的存储器的数量。
较佳的做法是,把规则引擎配置成一或多个规则引擎对儿,其中,所述或每一个规则引擎(16)对儿处理数据流的交替的部分,并且把结果处理器配置为把规则引擎中的所述或每一个规则引擎对儿的输出加以组合。按各种并行与串行组合,对规则引擎进行多种不同的配置是可能的。可以根据设计选择决定这些配置,以提高模式匹配的速度,这取决于可用的资源。
模式匹配装置具有下列功能特征。其支持多种模式类型,包括字符串和正则表达式。其支持可以针对每一模式单独指定的多种模式条件大小写敏感性、在输入流中应该检测到模式的位置(通常使用偏移/深度参数来指定)。模式匹配装置将检测输入流中的所有模式,包括多次出现和重叠的模式。其可放缩地支持至少数以万计的模式。除了存储器容量之外,不存在对最大模式长度的基本限制。其支持涉及具有相互依赖条件的多个模式的规则,例如,应该检测到规则中所涉及的模式的次序,以及应该检测到模式的输入流中的位置之间的距离。其支持动态递增更新(可通过修改存储器内容加以编程)。所述装置适合于ASIC和FPGA实现。
所述装置的性能特征包括实时(on-the-fly)(单遍)操作,涉及每个时钟周期至少一个字符的判断处理率,可以通过不同类型的并行化,将其增加至每个时钟周期多个字符。通过一种新型压缩技术,更加存储高效,例如包括全部25K个字符的、从一种商业侵入检测规则集合所抽取的1500个固定的匹配模式,适合于大约100KB。该装置具有较好的更新性能使用当前技术水平处理器上按软件执行的更新功能,一次模式更新(插入/删除)约需1ms~2ms。所述装置提供了在远小于1ms的时间内激活规则的能力。
现在,将仅以举例的方式,参照附图描述本发明的实施例,其中
图1为用于检测数据流中模式的装置的示意图, 图2为状态转变图, 图3为图1的装置的规则引擎的示意图, 图4为状态转变规则的示意图, 图5为第二状态转变图; 图6为图1的装置的进一步的部分的示意图, 图7为图1的装置的增强的规则引擎的示意图, 图8为第二状态转变规则的示意图, 图9为第三状态转变图, 图10为一种模式分布算法的流程图,以及 图11为用于把模式收集转换成一系列状态转变规则的算法的流程图。
图1示意性地示出了用于检测数据流12中的模式的装置10。装置10可以为特定用途集成电路(ASIC),或者可以为场可编程门阵列(FPGA),或者可以为在软件的控制下的通用处理器(例如Intel Pentium)。装置10拥有许多应用,包括诸如侵入检测等。在计算领域中,所希望的是,在任何从外部世界接收数据,例如经由因特网接收数据的系统中,对病毒和其它恶意软件部件进行检测以及禁止。
装置10包括用于接收数据流12和执行模式匹配的模式匹配设备14。模式匹配设备14包括多个规则引擎16a、16b。以下,更详细地描述规则引擎的操作。在图1中,把规则引擎示出为分组成两个功能部件,即规则引擎的基本模式匹配组16a和规则引擎的正则表达式匹配组16b。装置10还包括结果处理器18和控制设备20。
装置10所接收的数据流12包括一系列字节,它们可以为连续的流,也可以呈数据信息包的形式(如在因特网通信中普遍的那样)。装置10针对特定模式的存在而扫描数据流12。每个规则引擎16a、16b依据多个状态转变规则操作,所述状态转变规则对多个模式编码。把装置10配置为把数据流12传送于每一规则引擎16,并且将其进一步配置为在状态转变规则指示模式匹配时输出指示模式匹配的信号。
为了解释模式和状态转变规则之间的关系,图2描述了用于检测模式“testing”的状态转变图。对这一图进行编码的状态转变规则如下 规则是由算法自动生成的,以下参照图11,更详细地讨论了这一点。每一个规则根据输入通过第一状态移至第二状态而统治规则引擎的操作,具有因状态改变所触发的可能输出。规则一和二中的通配(wildcard)字符*指任何状态或输入。第一状态转变规则R1包括通配符状态成分(component)和通配符输入成分,第二状态转变规则R2包括通配符状态成分和指定的输入成分,以及第三状态转变规则R3包括指定的状态成分和指定的输入成分。第一、第二以及第三规则具有不同的优先级。
由于通配符的存在,可能对于给定的状态和输入多个规则可匹配。为了解决这一情形,为状态转变规则赋予优先级。在多个匹配规则的情况下,当决定改变状态时,规则引擎将按具有最高优先级的规则行动。规则R8包括指示模式匹配的输出成分,在针对该规则的输出栏中,其为数字1。规则的这一集合将针对在任何较长的串中串“testing”的每一和每个存在返回输出1,而在任何错误的情况下,不返回输出1。
图3更详细地描述了规则引擎16(图1的部件16a“基本模式匹配”可以包含多个规则引擎)的逻辑运行情况。规则引擎具有3个主要功能部件,为转变规则存储器22,其存储诸如以上表中的规则的规则;规则选择器24,其确定使用哪一规则;以及状态寄存器26,其跟踪规则引擎16的当前状态。根据规则的输出成分,生成输出28。例如,如果数据流12的一部分为“testesting”(其仅包括与模式“testing”的单一的匹配),则根据以上表的规则进行操作的规则引擎16将运作如下 启动状态S0(规则引擎16将总默认于这一状态), 第一个字母“t”,运用规则2,并且移至状态S1(规则2比规则1具有更高的优先级,因此占先,不运用规则5因为当前状态不是S3)。
第二个字母“e”,运用规则3,并且移至状态S2, 第三个字母“s”,运用规则4,并且移至状态S3, 第四个字母“t”,运用规则5,并且移至状态S4, 第五个字母“e”,运用规则9,并且移至状态S2, 第六个字母“s”,运用规则4,并且移至状态S3, 第七个字母“t”,运用规则5,并且移至状态S4, 第八个字母“i”,运用规则6,并且移至状态S5, 第九个字母“n”,运用规则7,并且移至状态S6, 第十个字母“g”,运用规则8,并且移至状态S0,但返回输出1,指示在通过规则引擎16的数据流12中已检测到模式“testing”。
图4描述了状态转变规则30的一般化的形式,其具有当前状态32、输入字符34、条件36、下一个状态38的成分以及输出成分40。按照把规则存储在转变规则存储器22(图3)中的方式,反映状态转变规则的优先级成分。对于所有基本模式,呈这样格式的转变规则是足够的,所有这样的模式可以简化成一系列这样的状态转变规则30。如上所示,输出成分40可以返回简单的值,例如数字1,也可以返回此后由结果处理器18加以处理的其它值。
在图2的简单的例子中,规则引擎16检测到单一的模式“testing”。在大多数实际的应用中,由于模式匹配设备14将监视上千的模式,所以每个规则引擎16将监视多个模式,或许在50~2000个范围内。随着规则引擎所监视的模式数目增加,代表检测过程的状态图将变得更为复杂,作为必然的结果,对所述图进行编码的状态转变规则的数目将增加。
为了说明这一概念,图5描述了将检测模式“testing”和“testcase”两者的规则引擎的状态转变图。为了易于理解,通过省略向规则R1所编码的S0的返回,简化了这一图。对这一状态图进行编码的规则如下 这些规则对两个模式“testing”和“testcase”的模式检测进行编码,如果检测到前者,返回输出1,如果检测到后者,返回输出2。将希望,当存在需要由规则引擎加以匹配进一步的模式时,则把进一步的规则用于对每一和所有模式进行编码。
某些模式内部含有大小写灵敏(case sensitive)部件。可以按两种方式对这一情况加以支持,可以把这两种方式加以组合。首先,可以通过分配所选择的规则引擎来执行大小写敏感匹配,解决模式级所指定的大小写敏感性,其余的规则引擎执行大小写不敏感匹配。其次,可以由既执行大小写敏感匹配也执行大小写不敏感匹配的每一规则引擎处置字符级所指定的大小写敏感性。
字符级的大小写敏感性的一个例子将为这样的一种模式[aA]B[cC],其与“aBc”、“ABc”、“aBC”、“ABC”相匹配。可以在规则引擎中通过使用状态转变规则30的条件成分36来指定当接收到特定的大小写敏感输入字符时具体规则才操作来检测这一匹配,。规则选择部件24(图3)将通过考虑大小写敏感/不敏感条件标志选择匹配规则。
把每个转变规则作为转变规则向量存储在转变规则存储器22中。规则选择器24在一个循环(cycle)中搜索与当前状态相匹配和输入字符匹配的最高优先级转变规则。
可以把状态转变规则集合存储作为有效的数据结构,连同规则选择器的处理逻辑。实现这一点的一种方式是,把存储和逻辑编译成B-FSM引擎,B-FSM引擎基于特殊的杂凑函数(hash-function),以有效地搜寻状态转变规则。例如,在J.van Luntheren、A.P.J.Engbersen、J.Bostian、B.carey以及C.Larsson的“XML accelerator engine”First International Workshop on HighPerformance XML Processing,暨第13次国际World Wide Web会议(WWW2004),美国,纽约州,纽约,2004年5月中描述了这一技术。
B-FSM引擎的关键的特性是,与通常具有状态和输入向量宽度以及存储器大小之间的指数关系的现有技术可编程状态机相比,其具有转变的数目与存储器大小之间的近似线性的关系。因此,B-FSM引擎可以支持较大数目的状态以及较宽的输入和输出向量,而较少受到存储器大小的限制。几种优化,包括把状态转变图编码和分割成分别存储在独立的杂凑表中的多个状态簇(cluster),允许B-FSM引擎支持较大的状态图(例如,10K~100K个状态)。
B-FSM引擎提供了较高的性能,具有每循环一个状态转变的最大速率(对于当前工艺状态ASCI技术的GHz范围内的频率)。由于把数据结构包含在传统的存储器(例如,SRAM)中,B-FSM引擎支持涉及状态与转变的递增添加与去除的状态转变图的动态更新,这是通过对转变规则存储器中的数据结构的递增修改实现的。可以同时支持多个状态图,并且通过存储器中相应数据结构的开始地址对它们加以选择。
图6描述了装置10的一个设计实例,其具有并行放置的多个规则引擎16。每一个规则引擎接收作为输入的数据流12,并且把输出传送于结果处理器18。这是最简单的实施例,其中,每一个规则引擎16执行针对离散数目模式的独立的模式匹配,其中,每一个引擎16运作于未被其它引擎16所覆盖的模式上。
然而,也可以按规则引擎对儿16配置规则引擎16,其中,每一规则引擎对儿16处理数据流12的交替的部分。所述对儿的一个成员可运作在数据流12的偶数字节上,而该引擎对儿16的另一个成员运作在奇数字节上。从而,把结果处理器18配置为组合每一规则引擎对儿16的输出。通过在交替的字节上运作,加快了数据流12的处理,从而增加了执行模式匹配的引擎16的复杂度。通过对输入流的编码(根据关于该流的统计信息),也可以提高平均处理速率。规则引擎16的其它配置也是可能的,包括令引擎16串行地运作,其中,由不同的规则引擎执行模式匹配的不同的方面。当检测较复杂的模式时,这样做是特别有利的。
结果处理器18可以提供对涉及多个模式的规则的支持,例如检查多个模式的出现、次序以及偏移/距离等。(多个)规则引擎的输出包括已经在输入流中检测到的模式标识符,结合以与那些在其处已经检测到模式标识符的偏移。于是,结果处理器部件将能够(根据存储在局部存储器——未在图中加以显示——中的数据结构)检查指出关于应该在其处检测模式的位置(例如,精确的位置、某一部分、或者在整个输入流中)的附加条件,以及关于应该检测到多个模式的次序和它们之间(即,偏移之间)的距离。
为了测试数据流中的正则表达式的存在,使用了更复杂的状态转变规则和更复杂的规则引擎。高级状态转变规则的特性在于,指定字符类代替字符的普通具体输入的能力。例如,在以上的规则R2中,输入为字母“t”。然而,图7中所示的高级规则引擎包括字符分类器42,字符分类器42将刻画输入流12中的字节的特征,规则选择器24所使用的状态转变规则可以测试字符类,而不是实际的输入字符。字符类集合的例子包括 \d数字(“阿拉伯数字”) \D非数字 \w字母数字 \W非字母数字 \s空白(空格、回车、跳格(tab)、新行、换页) \S非空白 可以在状态转变规则,而不是在规则R1的通配符或者在其它规则的具体的输入中指定这些运算符(operator)。
图7的规则引擎16还包括计数器阵列44的功能部件。计数器阵列用于特定情形,其中正在被检测的特定模式沿着行包括表达式“下100个字符中无\s(空白)”。为了检测这种类型的表达式,图8的高级状态转变规则22包括计数器控制部件46,计数器控制部件46可以指定任何计数的长度以及附接于该计数的条件。一旦规则选择器选择了包括活跃计数器控制部件46的规则,则规则引擎16中的计数器阵列44将执行计数功能,并且就是否存在与特定模式的匹配,控制规则引擎16的适当输出。
图9说明了对正则表达式进行编码的规则集合的状态转变图。由这一图所代表的正则表达式为 “\sCREATE\s{” 这将在如下面所输入的数据流12中检测到这样的串 “CREATE{”,以及 “<新行>create<跳格>{” 为了易于理解,与图5一样,通过省略向规则R1编码的S0的返回,简化了这一图。对该状态图编码的规则如下 这一状态转变图和上述规则将检测包括以上所列的串的类型的与以上的正则表达式相匹配的那些模式,并且当检测到模式匹配时,将返回输出1。
装置10还包括模式分布设备(其可以形成控制20的一部分),尽管较为普遍的是由软部件执行模式分布。把这一设备配置为接收将由装置10检测的模式。把模式分布设备配置为能够跨越多个模式集合分布模式,并且能够把每一个模式集合转换成多个状态转变规则。根据两个单独的算法的动作执行这一两个部分的处理,即跨越多个模式集合均匀地分割模式的第一部分和把每一个集合转换成一系列状态转变规则的第二部分。把模式分布设备配置成当跨越多个模式集合分布模式时,根据模式之间的共性(commonality)和冲突(conflict)分布模式。
模式编译器操作总结如下 步骤1模式分布算法在N个模式集合上分布模式,其中,N相应于B-FSM引擎的个数。
步骤2转变规则生成器算法把每一个模式集合转换成增强的状态转变图,该增强的状态转变图包括涉及通配符和优先级的状态转变规则(包括模式间/内冲突的解决、大小写敏感性)。
步骤3B-FSM编译器算法把N个增强的状态转变图中的每个转换成针对N个B-FSM引擎中的每个的存储高效(storage-efficient)的B-FSM数据结构(包括状态群集、状态编码、BaRT压缩)。
所有这些步骤均支持递增的更新。
图10详细描述了把一列模式分隔成独立的模式集合的算法的示例。就一般意义而言,模式的分布是在N个模式集合上进行的。
模式分布算法的描述,包括术语“公共前缀”和“模式冲突”,它们定义如下公共前缀如果两个模式的前k个字符相同,则称这两个模式具有长度为k的公共前缀。例如模式“testing”和“testcase”具有4个字符长度的公共前缀“test”。模式冲突如果不包括其第一个字符的一个模式的子串为另一个模式的前缀,则两个模式之间存在冲突。例如,模式“testing”和“pattern”之间存在两个冲突(1)由“pattern”的第三个字符构成的单个字符的串,即“t”,为“test”的前缀,以及(2)由“pattern”的第四和第五个字符形成的串,即“te”,也为“test”的前缀。
模式分布算法的目的是,在N个模式集合上分布模式,以致(1)增加每一集合中为公共前缀的部分的字符的数目,在理想的情况下,甚至最大化,(2)减少每一集合中模式之间存在的冲突的数目,在理想的情况下,甚至最小化,以及(3)在各种集合上分布模式,以致对于所有集合,所累加的模式长度相类似(各集合上模式集合的均匀分布)。
由于这3个条件不相关,甚至可能冲突,所以可以向它们中的每一个赋予权重,以表示它们的相对重要性。在许多模式匹配应用中,将按某一给定的次序添加模式。例如,在侵入检测应用中,按已经标识了新病毒或蠕虫并且为检测这些创建了适当规则的次序添加模式。
根据这一属性,模式分布算法的第一实施例包括下列步骤,针对每一模式,按将其添加于将由N个规则引擎检测的N个模式集合之一的次序,重复这些步骤 步骤1确定包含已经被分布的模式的N个模式集合中的每个中的任何一个模式与待添加的新模式之间的最长公共前缀。集合i的最长公共前缀将由pi表示,其中1≤i≤N。
步骤2确定N个模式集合中的每个中的任何一个模式与待添加的新模式之间的冲突的总数目,由此统计与为公共前缀的一部分的模式的部分的冲突仅一次。与集合i中模式冲突的总数目将由ci加以表示,其中1≤i≤N。每一集合中的字符的总数目(即,积累的模式长度)将由mi加以表示,其中1≤i≤N。
步骤3使用3个权重w1、w2以及w3,按下列方式,为每一模式集合确定3个参数的加权和 Si=(w1*pi)-(w2*ci)-(w3*mi)。
步骤4把模式添加于具有最大值Si的集合i。
图10的流程图中描述了以上的4个步骤。这仅仅是跨越模式集合散布模式的算法的一个例子。改变这一过程的其它的可能性包括 (1)使用更少或者更多的参数,确定应该把模式添加于哪个集合。
(2)使用函数,而不是固定的值作为权重。例如,上述4个步骤中的权重w3可以为函数,该函数依赖于给定集合中的模式/字符的数目,并且结合以某一上限(例如,基于将用于存储这一模式集合的包括在规则引擎中的实际的存储器)。这将允许实现其中仅当模式的数目接近所述上限(存储器的实际大小),则通过增加这一情况中的权重,才考虑填充率的算法的实现。
(3)不同的插入次序,例如,首先根据长度对模式进行排序。
(4)允许有效确定最长公共前缀和模式冲突的搜寻结构的实现,例如,用于确定最长匹配前缀的树结构和杂凑表结构。
模式分布算法的第二实施例将包括“强力(brute force)”方案,其中,通过使用转变规则生成器算法和B-FSM算法,为每一新的模式和模式集合确定实际的存储器需求,然后选择对于其实际存储器需求较低,或者甚至很小,并且处于作为相应规则引擎的一部分的存储器的实际存储容量的极限内的集合。尽管与先前所描述的第一实施例相比,这一方案对于插入模式的给定的次序而言,将获得减少的存储器需求,但在选择把新模式添加于其的模式集合方面,这一方案将耗费较多的时间,因而导致了较慢的更新性能。
一旦已经把所有模式都添加于模式集合,则把每一个模式集合转换成一系列状态转变图。以下描述了用于生成状态转变规则的两个方案。图11的流程图中描述了第一个方案。
方案1把模式转换为状态列表,并且根据与每一状态相关的模式前缀生成转变规则。
创建状态列表步骤1~2。
步骤1把每一个由N个字符构成的模式转换成N个状态的列表,以致于可以模式的不同的前缀与每一个状态相关联,具有分别等于1,2,...,N的大小。注意将把最后一个状态与原始模式相关联(前缀大小=模式大小(N))。
步骤2去除重复的状态,即那些与完全相同的模式前缀相关联的状态。
生成转变规则步骤3~5 步骤3针对状态S0,创建默认的转变规则,涉及既针对当前状态,也针对输入的通配条件,并且具有优先级0。
步骤4针对那些与由某单个字符构成的前缀相关联的状态,搜寻状态列表。为这些状态中的每一状态创建转变规则,涉及针对当前状态的通配符、作为输入值的单个字符的前缀,并且具有优先级1。
步骤5针对状态对儿(Si,Sj),搜寻状态列表,该状态对儿(Si,Sj)具有这样的特性与状态Si相关联的前缀,或者该前缀的最后部分,等于在去除了其最后字符之后的与状态Sj相关联的前缀。为这些对儿中的每一个创建从状态Si到Sj的转变规则,涉及与状态Sj相关联的前缀的最后一个字符作为输入值,并且具有优先级2。
现在,将使用实例说明所描述的方案,该实例涉及对3个可以出现在输入流中任何地方的模式“testing”、“testcase”以及“pattern”的所有出现的检测。
步骤1创建关于相关联前缀的状态列表。这导致了针对这3个模式的下列状态与前缀 状态=S1模式=“t” 状态=S2模式=“te” 状态=S3模式=“tes” 状态=S4模式=“test” 状态=S5模式=“testi” 状态=S6模式=“testin” 状态=S7模式=“testing” 状态=S8模式=“t” 状态=S9模式=“te” 状态=S10模式=“tes” 状态=S11模式=“test” 状态=S12模式=“testc” 状态=S13模式=“testca” 状态=S14模式=“testcas” 状态=S15模式=“testcase” 状态=S16模式=“p” 状态=S17模式=“pa” 状态=S18模式=“pat” 状态=S19模式=“patt” 状态=S20模式=“patte” 状态=S21模式=“patter” 状态=S22模式=“pattern” 状态2去除重复的状态。
去除状态S8、S9、S10以及S11,因为它们分别等于状态S1、S2、S3以及S4。在步骤2之后,现在状态列表读为 状态=S1模式=“t” 状态=S2模式=“te” 状态=S3模式=“tes” 状态=S4模式=“test” 状态=S5模式=“testi” 状态=S6模式=“testin” 状态=S7模式=“testing” 状态=S12模式=“testc” 状态=S13模式=“testca” 状态=S14模式=“testcas” 状态=S15模式=“testcase” 状态=S16模式=“p” 状态=S17模式=“pa” 状态=S18模式=“pat” 状态=S19模式=“patt” 状态=S20模式=“patte” 状态=S21模式=“patter” 状态=S22模式=“pattern” 状态3创建默认的规则。
步骤3之后的转变规则列表 步骤4搜寻那些与单个字符前缀相关联的状态,并且创建针对这些状态中的每一状态的转变规则,其具有通配当前状态和优先级1。存在着两个具有单个字符前缀的状态S1和S16。在创建了针对这些状态中的每一状态的转变规则之后,转变规则列表等于 步骤5搜寻具有这样特性的状态对儿(Si,Sj)与状态Si相关联的前缀,或者该前缀的最后部分,等于在去除了其最后字符之后与状态Sj相关联的前缀。针对这些对儿中的每一个对儿创建一个转变规则。
状态S1和状态S2形成一对儿具有这样特性的状态与状态S1(“t”)相关的前缀,等于在去除了其最后一个字符(“t”)之后的与状态S2相关联的前缀。因此,将创建从状态S1到S2的转变规则,涉及与状态S2相关联的前缀的最后一个字符(“e”)作为输入,并且具有优先级2 状态S20和状态S3也形成一对儿具有上述特性的状态与状态S20相关的前缀(“patte”)的最后部分,等于在去除了其最后字符之后与状态S3相关联的前缀(“te”)。因此,将创建从状态S20到S3的转变规则,涉及与状态S3相关的前缀的最后一个字符(“s”)作为输入,并且具有优先级2 在已经发现具有上述特性的所有状态对儿,并且已经创建了相应的转变规则之后,转变规则列表等于 在如以上所述已经生成了状态转变规则之后,把输出成分赋予相应于已经转换了的模式的最后字符的状态转变规则。在以上的例子中,将把相应于相应模式“testing”、“testcase”以及“pattern”的输出成分赋予状态转变规则9、13以及19。
第二个方案是把模式转换成转变规则,并且通过对转变规则的直接处理,解决碰撞(collision)问题。
步骤1针对状态S0,创建默认的转变规则,涉及既针对当前状态也针对输入的通配符条件,并且具有优先级0。
把步骤2~3施用于每一模式 步骤2使用已经创建的转变规则,分析将加以转换的每下一个模式,(换句话说把下一个模式用作“输入流”,而且使用现存的转变规则处理其)直到进行向状态S0的转变(默认的转变规则)。按这一方式,确定与已经被转换的、任何其它模式的最长公共前缀对于包括这一公共前缀的字符而言,转变规则已经存在。
步骤3接下来针对不是步骤2中所确定的公共模式的一部分的模式中的每一字符,创建转变规则,其具有新的唯一的下一个状态。相应于模式的第一个字符的转变规则(如果不存在公共模式),将包括针对当前状态的通配符,并且具有优先级1。针对其它字符的转变规则将具有等于相应于模式中的前一个字符的转变规则的下一个状态的当前状态,并且具有优先级2。
步骤4按下列方式解决模式碰撞问题。对于每一“优先级1”的转变规则(通配符当前状态),检查是否存在涉及相同输入字符的“优先级2”的转变规则(非通配符当前状态)。此时,假设某一给定“优先级1”的转变规则涉及向下一个状态n1的转变,并且发现了具有相同输入字符的、涉及向下一个状态n2的转变的“优先级2”的转变规则。此时,将针对所有存在的、当前状态等于n1的转变规则,涉及当前状态n2创建这些规则的新的拷贝。如果已经存在涉及与新拷贝的转变规则之一相同的当前状态(n2)和输入值的转变规则,则在这两个“碰撞的”规则的下一个状态上迭代相同的操作,同时将去除所拷贝的规则。重复这一操作,直至不再发现任何碰撞。
现在,将使用一个实例说明所描述的方案,该实例涉及对3个可以出现在输入流中任何地方的模式“testing”、“testcase”以及“pattern”的所有出现的检测。
步骤1创建默认规则。
步骤1之后的转变规则列表 转换模式“testing” 步骤2使用现存的规则分析“testing”。
仅存在针对S0的默认的规则,因此无公共前缀。
步骤3针对每一不为公共前缀一部分的字符,创建转变规则规则1~8。转换了“testing”之后的转变规则列表 转换模式“testcase” 步骤2使用现存的规则分析“testcase”。
由转变规则2、3、4以及5(按这一次序)分析“testcase”的前4个字符,而第5个字符将导致向状态S0的转变。因此,公共前缀“test”存在。
步骤3针对不为公共前缀的一部分的每一字符,创建转变规则规则9~12。转换了模式的其余部分,即“case”之后的转变规则列表 转换模式“pattern” 步骤2使用现存的规则分析“pattern”。
“pattern”的第一个字符将导致向状态S0的转变。因此,公共前缀不存在。
步骤3针对不为公共前缀的一部分的每一字符,创建转变规则规则13~19。转换了模式的其余部分,即“case”之后的转变规则列表 步骤4解决模式碰撞问题。
转变规则2(优先级1)和转变规则5(优先级2)碰撞。规则2涉及向状态S1的转变。规则5涉及向状态S4的转变。存在着从状态S1的转变,即规则3。此时,创建规则3的拷贝,具有由S4所替换的当前状态。
转变规则2(优先级1)和转变规则15(优先级2)碰撞。规则2涉及向状态S1的转变。规则15涉及向状态S14的转变。存在着从状态S1的转变即规则3。此时,创建规则3的拷贝,具有由S14所替换的当前状态。
转变规则2(优先级1)和转变规则16(优先级2)碰撞。规则2涉及向状态S1的转变。规则15涉及向状态S15的转变。存在着从状态S1的转变即规则3。此时,创建规则3的拷贝,具有由S15所替换的当前状态。
然而,已经存在具有相同的当前状态和输入的转变规则,即规则17。所拷贝的规则涉及向状态S2的转变。规则17涉及向状态S16的转变。存在着从状态S2的转变即规则4。此时,创建规则4的拷贝,具有由S17所替换的当前状态。
未再发现其它碰撞。解决了所有碰撞问题之后的转变规则列表
权利要求
1.一种用于检测数据流(12)中的模式的装置,该装置包括用于接收该数据流(12)的模式匹配设备(14),该模式匹配设备(14)包括一或多个规则引擎(16),所述或每一个规则引擎(16)依据对多个模式进行编码的多个状态转变规则(30)操作,第一状态转变规则(R1)包括通配符状态成分和通配符输入成分,第二状态转变规则(R2)包括通配符状态成分和指定的输入成分,以及第三状态转变规则(R3)包括指定的状态成分和指定的输入成分,该第一、第二以及第三规则具有不同的优先级,以及至少一个状态转变规则包括指示模式匹配的输出成分,该装置(10)配置来把该数据流(12)传送于所述或每一个规则引擎(16),并且进一步配置来当状态转变规则指示模式匹配时,输出指示模式匹配的信号。
2.根据权利要求1的装置,还包括模式分布设备(20),配置来接收模式、跨越多个模式集合分布模式、以及把每一模式集合转换成多个状态转变规则。
3.根据权利要求2的装置,其中,所述模式分布设备(20)配置来基本均匀地跨越所述多个模式集合分布模式。
4.根据权利要求2或3的装置,其中,所述模式分布设备(20)配置来当跨越所述多个模式集合分布模式时,根据模式之间的共性和冲突分布模式。
5.根据任何一个前述权利要求的装置,还包括用于接收来自所述或每一个规则引擎(16)的输出的结果处理器(18),该结果处理器(18)配置来确定模式匹配是否发生。
6.根据任何一个前述权利要求的装置,其中,所述状态转变规则的至少之一包括字符类别成分。
7.根据任何一个前述权利要求的装置,其中,所述模式匹配设备(14)包括多个规则引擎(16)。
8.根据权利要求7所述的装置,其中,所述规则引擎(16)被配置成一或多个规则引擎对儿(16),其中,所述或每个规则引擎(16)对儿处理所述数据流(12)的交替部分。
9.根据附属于权利要求5的权利要求8所述的装置,其中,所述结果处理器(18)配置来组合所述或每一个规则引擎(16)对儿的输出。
10.一种用于检测数据流(12)中的模式的方法,该方法包括接收该数据流(12)、运行一或多个规则引擎(16),所述或每一个规则引擎(16)依据对多个模式进行编码的多个状态转变规则(30)操作,第一状态转变规则(R1)包括通配符状态成分和通配符输入成分,第二状态转变规则(R2)包括通配符状态成分和指定的输入成分,以及第三状态转变规则(R3)包括指定的状态成分和指定的输入成分,该第一、第二以及第三规则具有不同的优先级,以及至少一个状态转变规则包括指示模式匹配的输出成分,把该数据流(12)传送于所述或每一个规则引擎(16),并且当状态转变规则指示模式匹配时,输出指示模式匹配的信号。
11.根据权利要求10的方法,还包括接收模式、跨越多个模式集合分布模式、以及把每一模式集合转换成多个状态转变规则。
12.根据权利要求11的方法,其中,所述跨越多个模式集合分布模式的步骤基本均匀地跨越所述多个模式集合分布模式。
13.根据权利要求11或12的方法,其中,由根据模式之间的共性和冲突分布模式的算法执行所述跨越多个模式集合分布模式的步骤。
14.根据权利要求10~13中的任何一项的方法,还包括处理来自所述或每一个规则引擎(16)的输出以确定模式匹配是否发生。
15.根据权利要求10~14中的任何一项的方法,其中,所述状态转变规则的至少之一包括字符类别成分。
16.根据权利要求中10~15的任何一项的方法,包括运行多个规则引擎(16)。
17.根据权利要求16的方法,其中,所述规则引擎(16)被配置成一或多个规则引擎对儿(16),其中,所述或每一个规则引擎(16)对儿处理所述数据流(12)的交替部分。
18.根据附属于权利要求14的权利要求17的方法,其中,所述对规则引擎(16)的输出的处理包括组合所述或每一个规则引擎(16)对儿的输出。
19.一种计算机可读媒体上的计算机程序产品,用于控制用于检测数据流(12)中的模式的装置,该计算机程序产品包括用于接收所述数据流(12)、运行一或多个规则引擎(16)的指令,所述或每一个规则引擎(16)依据对多个模式进行编码的多个状态转变规则(30)操作,第一状态转变规则(R1)包括通配符状态成分和通配符输入成分,第二状态转变规则(R2)包括通配符状态成分和指定的输入成分,以及第三状态转变规则(R3)包括指定的状态成分和指定的输入成分,该第一、第二以及第三规则具有不同的优先级,以及至少一个状态转变规则包括指示模式匹配的输出成分,把该数据流(12)传送于所述或每一个规则引擎(16),并且当状态转变规则指示模式匹配时,输出指示模式匹配的信号。
20.根据权利要求19的计算机程序产品,还包括用于接收模式、跨越多个模式集合分布模式、以及把每一模式集合转换成多个状态转变规则的指令。
21.根据权利要求20的计算机程序产品,其中,所述跨越多个模式集合分布模式的步骤基本均匀地跨越所述多个模式集合分布模式。
22.根据权利要求20或21的计算机程序产品,其中,由根据模式之间的共性和冲突分布模式的算法执行所述跨越多个模式集合分布模式的步骤。
23.根据权利要求19~22中的任何一项的计算机程序产品,还包括处理来自所述或每一个规则引擎(16)的输出以确定模式匹配是否发生的指令。
24.根据权利要求19~23中的任何一项的计算机程序产品,其中,所述状态转变规则的至少之一包括字符类别成分。
25.根据权利要求中19~24的任何一项的计算机程序产品,包括用于运行多个规则引擎(16)的指令。
26.根据权利要求25的计算机程序产品,其中,所述规则引擎(16)被配置成一或多个规则引擎对儿(16),其中,所述或每一个规则引擎(16)对儿处理所述数据流(12)的交替部分。
27.根据附属于权利要求23的权利要求26的计算机程序产品,其中,对规则引擎(16)的输出的处理组合所述或每一个规则引擎(16)对儿的输出。
全文摘要
用于检测数据流中的模式的装置,该装置包括用于接收数据流的模式匹配设备。该模式匹配设备包括一或多个规则引擎,每一个规则引擎依据对多个模式进行编码的多个状态转变规则操作,第一状态转变规则包括通配符状态成分和通配符输入成分,第二状态转变规则包括通配符状态成分和指定的输入成分,以及第三状态转变规则包括指定的状态成分和指定的输入成分,第一、第二以及第三规则具有不同的优先级,至少一个状态转变规则包括指示一个模式匹配的输出成分。把该装置配置成能够把数据流传送于每一个规则引擎,并且把其进一步配置成可以在状态转变规则指示模式匹配时,输出指示模式匹配的信号。
文档编号H04L29/06GK101160923SQ200680012356
公开日2008年4月9日 申请日期2006年4月20日 优先权日2005年4月20日
发明者简·范伦特伦 申请人:国际商业机器公司