用于遍历为具有高级特征的正则表达式图样生成的非确定有限自动机(NFA)的系统和方法
背景
开放系统互连(OSI)参考模型定义了用于通过传输介质进行通信的7个网络协议层(L1-L7)。上层(L4-L7)表示端到端通信并且下层(L1-L3)表示本地通信。
联网应用感知系统需要处理、过滤和切换L3到L7网络协议层的范围,例如,L7网络协议层诸如超文本传输协议(HTTP)和简单邮件传输协议(SMTP),以及L4网络协议层诸如传输控制协议(TCP)。除了处理网络协议层以外,联网应用感知系统需要通过L4-L7网络协议层来同时通过基于访问和内容的安全性来保护这些协议,这些协议层包括防火墙、虚拟专用网(VPN)、安全套接字层(SSL)、入侵检测系统(IDS)、互联网协议安全(IPSec)、线速的防病毒(AV)和防垃圾邮件功能。线速是在其上传输和接收数据的网络的物理介质上的数据传送速率。
网络处理器可用于高吞吐量L2和L3网络协议处理,即,执行数据包处理从而以线速转发数据包。通常,通用处理器用于处理需要更多智能处理的L4-L7网络协议。虽然通用处理器可以执行计算密集型任务,但是没有足够用于处理数据使得其能够被以线速转发的性能。
内容感知联网需要以“线速”的对数据包的内容的检查。可以对内容进行分析,以确定是否存在安全漏洞或入侵。应用大量正则表达式形式的图样和规则以确保所有的安全漏洞或入侵被检测到。正则表达式是用于描述值/字符/字母串中的图样的紧凑型方法。由正则表达式所匹配的最简单图样是单个值/字符/字母或值/字符/字母串,例如,/c/或/cat/。正则表达式还包括具有特殊含义的运算符和元字符。
通过使用元字符,正则表达式可以用于更复杂的搜索,诸如“abc.*xyz”。即,在“abc”和“xyz”之间的无限量字符的情况下,找到字符串“abc”,之后是字符串“xyz”。另一示例是正则表达式“abc..abc.*xyz;”,即,找到字符串“abc”,后面两个字符,然后是字符串“abc”并且在无限量字符后由字符串“xyz”跟随。
入侵检测系统(IDS)应用检查所有流过网络的单独数据包的内容,并且标识可能指示尝试闯入或威胁系统的可疑图样。可疑图样的一个示例可以是数据包中的特定文本串,该特定文本串在100个字符以后跟随另一特定文本串。
通常使用搜索算法(如用于处理正则表达式的确定有限自动机(DFA)或非确定有限自动机(NFA))执行内容搜索。
概述
在一个实施例中,有效载荷段(也被称为有效载荷的段)为有效载荷的被检查与NFA图形节点中所指示的元素匹配的部分。有效载荷段可以是值、字符、字母、字节或其他数据大小。有效载荷段可以具有任何粒度(例如,大小)。例如,有效载荷段可以是一个字节、多个字节、小于一个字节、或甚至任何数量的位。引擎可以处理最小粒度(例如,一个字节、或任何数据量),但其还可以处理大于最小的粒度。在一个实施例中,有效载荷段可以是有效载荷字节。
在一个实施例中,一种行走表示图样的非确定有限自动机(NFA)图形的方法可以包括:从该NFA图形的一个节点中提取一种节点类型、下一个节点地址、计数值、和一个元素;以及通过使一个有效载荷与该元素进行匹配至少零次来将该有效载荷的一段针对该元素进行匹配。该次数可以基于该节点类型。
在一个实施例中,该节点类型可以是以下各项中的至少一项:可变计数、固定计数、固定计数和可变计数、字符、不区分大小写的字符、字符类、字符串、不区分大小写的字符串、标记的或分离的。
在一个实施例中,该方法还可以包括将一个条目推送至一个运行堆栈。该条目可以指示该节点类型、图形中的下一个节点的地址、一个复制位、一个逆向位、一个有效载荷偏移位、匹配类型、或计数值。将该条目推送至该运行堆栈可以基于该节点类型。如果该节点类型为可变计数、固定-可变计数、或分离的,则可以执行将该条目推送至该运行堆栈。该方法还可以包括:弹出该运行堆栈的一个顶条目,加载所弹出的顶条目所指示的一个图形节点,以及将该有效载荷的该段与该元素进行匹配。在所弹出的顶条目中所指示的一个有效载荷偏移下,可以在所加载的图形节点中指示该元素。在将该有效载荷的该段与该元素进行匹配的失配后执行将该运行堆栈的该顶条目弹出。
在一个实施例中,该方法包括:弹出该运行堆栈的该顶条目,提取所弹出的顶条目所存储的图形节点信息,以及将该有效载荷的该段与该元素进行匹配。在所弹出的顶条目中所指示的一个有效载荷偏移下,可以在所提取的图形节点中指示该元素。在将该有效载荷的该段与该元素进行匹配的失配后可以执行将该运行堆栈的该顶条目弹出。
在一个实施例中,字符串节点类型可以表示多个值的图样。每个值可以是字节、字母、或字符中的至少一项。将该有效载荷的该段针对与字符串节点类型相关联的该元素进行匹配可以包括使该段内的至少两个值针对被存储作为该节点中的该元素的字符串的对应值进行匹配(例如,并行)。如果该段与该元素部分匹配,并且如果该有效载荷的长度比被存储作为该节点的该元素的字符串的长度更短,则该方法可以包括加载该有效载荷的同一流的下一个有效载荷并继续将该字符串中的剩余值与该下一个有效载荷中的值进行匹配。该方法可以进一步包括将一个部分匹配推送至一个当加载该下一个有效载荷后有待加载的保存缓冲区。将该部分匹配推送至该保存缓冲区可以包括:将正在被处理的一个当前运行堆栈条目存储在该保存缓冲区内,当加载该下一个有效载荷后,将该保存缓冲区中所存储的至少一个条目拷贝至该运行堆栈。如果从该运行堆栈条目中读取该节点,则该方法可以进一步包括减少该运行堆栈中所存储的段的数量,并且如果该运行堆栈条目中所存储的段的数量大于零,则将该运行堆栈条目推送至该运行堆栈。如果该节点类型为可变计数领属节点则将该有效载荷的该段与该元素进行匹配可以包括:提取该有效载荷的至少一段并且将该至少一段与该元素进行匹配,直到不存在匹配,并且如果该有效载荷用尽,则将堆该栈条目推送至该保存缓冲区并设置一个终止行走值。
在一个实施例中,将该有效载荷的该段针对具有可变计数节点类型的该元素进行匹配可以包括针对该元素进行匹配该节点所指示的可变次数。该可变次数可以为至少零次、最多有限次数、或最多无限次数。该节点类型可以进一步指示该可变计数节点为一个贪婪节点、懒惰节点、领属节点、或全匹配节点。
在一个实施例中,如果节点类型为可变计数懒惰节点则将该有效载荷的该段与该元素进行匹配可以包括返回在该有效载荷中找到的最短匹配。如果该节点类型为可变计数懒惰节点则针对该元素对该有效载荷的该段进行匹配可以包括:将该段与该元素进行匹配,并且如果该段匹配,则加载该图形中的该下一个节点地址处的下一个节点,并且如果该段不匹配,则返回不匹配。针对该可变计数懒惰节点对该有效载荷的该段进行匹配可以包括:如果该段匹配,则将该堆栈条目推送至该运行堆栈并且加载该图形中的该下一个节点地址处的下一个节点。该堆栈条目可以指示该可变计数懒惰节点和有效载荷偏移。如果该节点类型为可变计数懒惰节点则将该有效载荷的该段与该元素进行匹配包括:如果将该下一个节点元素与该段进行匹配为失配,则从该运行堆栈的该堆栈条目中弹出该可变计数懒惰节点的节点类型的该节点,并将所弹出的节点中所存储的该元素与该有效载荷段进行匹配。当将该有效载荷的该段与所弹出的节点中所存储的该元素进行匹配后,该方法可以包括:减少该可变计数懒惰节点的一个计数值,将一个经更新的堆栈条目推送至该运行堆栈,以及加载在所弹出的条目中所存储的该下一个节点地址处的下一个节点。如果该有效载荷的该段继续在该第一有效载荷的同一流的下一个有效载荷内,则该方法还包括将该运行堆栈条目推送至一个保存缓冲区以及当加载该下一个有效载荷后,将之后的缓冲区条目加载到该运行堆栈内。
在一个实施例中,如果该节点类型为可变计数贪婪节点或可变计数领属节点则将该有效载荷的该段针对该元素进行匹配包括返回在该有效载荷中找到的最长匹配。
在一个实施例中,如果该节点类型为可变计数贪婪节点则将该有效载荷的该段与该元素进行匹配可以包括提取该有效载荷的至少一段。该方法可以进一步包括将该至少一段与该元素进行匹配。如果存在不匹配并且对该元素进行匹配小于等于可变计数贪婪节点中的可变计数的次数,或该有效载荷中不再有可用的段,则该方法可以包括:如果所匹配的段的数量指示已经对该元素进行匹配小于最大次数,则推送存储该节点的该节点类型、该有效载荷的至少一段的有效载荷偏移、和所匹配的该数量的段的运行堆栈条目,提取该下一个节点地址所指示的该NFA图形的下一个节点,以及继续将该有效载荷偏移后面的一个位置所指示的该有效载荷的下一段与该下一个节点的一个第二元素进行匹配,其中,如果存在不匹配,则从该运行堆栈弹出该运行堆栈条目,使段匹配计数的数量减量,将该经更新的运行堆栈条目推送回该运行堆栈,并且继续将来自所弹出的条目中所存储的偏移的该有效载荷的该下一段与所弹出的条目中所存储的该下一个节点地址处存储的下一个节点的该元素进行匹配。
该方法可以进一步包括:如果确定匹配,则将一个条目推送至一个指示该段的有效载荷偏移的运行堆栈,如果到达该可变计数贪婪节点的计数,则加载下一个节点。该方法可以进一步包括:如果没有达到该可变计数贪婪节点的该计数,则确定该有效载荷的后续段与该元素匹配。该方法可以进一步包括:如果确定不匹配,则从一个运行堆栈弹出一个条目并确定在所弹出的条目的节点中指示的该有效载荷偏移处的该有效载荷的该段与所弹出的条目的节点中指示的该元素匹配。
在一个实施例中,该方法可以进一步包括:如果该节点类型为可变计数贪婪节点,则对该有效载荷的该段针对该元素进行以下匹配:提取该有效载荷的至少一段并将该至少一段与该元素进行匹配直到存在不匹配,其中,该至少一段与该元素匹配等于该可变计数贪婪节点中的可变计数的次数,或该有效载荷中不再有可用的段,并且然后,如果一个运行堆栈条目的计数大于零,则推送该堆栈条目。该方法可以进一步包括:如果从该堆栈条目读取该节点,则减少该堆栈条目的该可变计数,并且如果该可变计数大于零,则推送一个运行堆栈条目。
在一个实施例中,该方法可以进一步包括:如果该节点类型为可变计数领属节点,则将该有效载荷的该段与该元素进行以下匹配:连续地将该有效载荷段与该元素进行匹配直到不匹配或该可变计数领属节点的计数指示已经对该元素进行匹配最大次数,并且然后继续将该有效载荷的后续段与该下一个节点地址处所存储的该下一个节点进行匹配。如果包括该有效载荷段的有效载荷用尽,则该方法包括将该节点、计数、和有效载荷偏移推送至一个保存缓冲区,并且当从该有效载荷段的同一流中加载下一个有效载荷段后,从该保存缓冲区加载该节点、计数、和有效载荷偏移并且继续将该下一个有效载荷段的该段与该元素进行匹配。
在一个实施例中,如果该节点类型为可变计数全匹配节点则将该有效载荷的该段与该元素进行匹配可以包括返回在该有效载荷中找到的所有匹配。如果该节点类型为可变计数全匹配节点则针对该元素对该有效载荷的该段进行匹配可以进一步包括:将该段与该元素进行匹配,并且如果其匹配,则将该节点推送至该运行堆栈,并且如果其不匹配,则返回不匹配。该堆栈条目可以用继续对该NFA图形进行匹配的指示来指示该可变计数全匹配节点和有效载荷偏移。推送该运行堆栈条目可以包括将复制值设置成假。如果该有效载荷的该段不可用,则对该有效载荷的该段进行匹配可以包括将该节点推送至该保存缓冲区并将一个终止行走值设置成真。
在一个实施例中,如果该节点类型为可变计数全匹配节点则将该有效载荷的该段针对该元素进行匹配可以包括将该段与该元素进行匹配,并且如果字节匹配,则存储该匹配,并且指示如果找到匹配则继续对该NFA图形进行匹配。
在一个实施例中,如果该节点类型为可变计数全匹配节点则将该有效载荷的该段与该元素进行匹配包括:将该段与该元素进行匹配,并且如果其匹配,则将该节点推送至该运行堆栈,并且如果其不匹配,则返回不匹配。推送该运行堆栈条目包括将复制值设置成假。如果该有效载荷的该段不可用,则该方法包括:对该有效载荷的该段进行匹配包括将该节点推送至该保存缓冲区并将一个终止行走值设置成真。
在一个实施例中,一种固定计数节点类型表示有待针对一个元素进行匹配固定次数的图样。如果该有效载荷的长度比该固定计数节点的计数更短,则该方法可以包括加载下一个有效载荷并继续将该元素中的剩余值与该下一个有效载荷中的值进行匹配。该方法可以进一步包括将一个部分匹配推送至一个当加载该下一个有效载荷后有待加载的保存缓冲区。将该部分匹配推送至该保存缓冲区可以包括:将来自一个运行堆栈的至少一个条目存储在该保存缓冲区内,并且当加载该下一个有效载荷后,将该保存缓冲区中所存储的至少一个条目拷贝至该运行堆栈。该固定计数节点类型的该元素可以是字符、字符类或字符串。将该有效载荷的该段与和该固定计数节点类型相关联的该元素进行匹配包括将该段内的至少两个值针对该节点中所存储的该元素的一个值进行匹配。如果该段与该元素匹配,并且如果该有效载荷的长度比该固定计数节点的计数更短,则该方法包括加载该有效载荷的同一流的下一个有效载荷并继续将该元素中的剩余值与该下一个有效载荷中的值进行匹配。
在一个实施例中,元素可以是字符、字符类和字符串中的至少一项。字符类可以表示至少一个值的布尔或运算。每个字符类可以作为遮罩存储在存储器内,其中,如果遮罩中的每个可能的字符为字符类的一部分,则设置一个与该字符相对应的指示符,并且如果其不是字符类的一部分,则不设置。该方法可以进一步包括通过将该有效载荷的一段用作该遮罩的索引来对该有效载荷的该段进行匹配,从而使得如果设置所标引的条目,则图形行走引擎确定该有效载荷段与该字符类匹配。每个字符类可以作为二维矩阵存储在存储器中。与该字符类相关联的第一索引和与该字符值相关联的第二索引可以访问该二维矩阵。如果该节点类型为字符类则将该有效载荷的一段针对该元素进行匹配可以包括:用是该节点的该元素中所指示的字符类索引的第一索引和是该有效载荷的该段的第二索引访问该二维矩阵,并且如果设置了该条目则发布匹配并且如果未设置该条目则发布不匹配。
在一个实施例中,该方法可以包括:当成功匹配后,从自该节点提取的该下一个节点地址加载该NFA图形的一个第二节点。
在一个实施例中,该计数值可以指示针对该元素匹配的最大次数。如果该节点类型为固定计数,则该计数值可以指示针对该元素匹配的恰好次数。如果该节点类型为字符串,则该计数值可以指示字符串的长度。
该方法还可以包括:如果该节点类型为可变计数,则从该节点提取一个计数值,其中该计数值指示与该元素进行匹配的最大次数,如果该节点类型为固定计数,则从该节点提取一个计数值,该计数值指示与元素进行匹配的恰好次数,如果该节点类型为字符串,则从该节点提取一个计数值,该计数值指示该字符串的长度,并且如果该节点类型为固定-可变计数,则从该节点提取两个计数值,一个第一计数值指示与该元素进行匹配的恰好次数而一个第二计数值指示与该元素进行匹配的最大次数。
在一个实施例中,该方法可以包括:该有效载荷的该段与标记节点类型相关联的该元素进行以下匹配:指示找到匹配,并且弹出一个运行堆栈中的任何条目,或者,如果在该节点中进行了指示,则继续在逆向方向上行走该节点中所指示的该下一个地址处的下一个节点。
在一个实施例中,将该有效载荷的该段与和节点类型为固定-可变计数节点类型相关联的该元素进行匹配可以包括对该元素进行匹配从该节点提取的固定计数值所指示的固定次数和从该节点提取的可变计数值所指示的可变次数。该可变次数可以为至少零次、最多有限次数或最多无限次数。该固定次数可以是指示一次。该固定次数可以是零次,从而使得该固定-可变计数节点类型的元素被匹配为可变计数节点。
在一个实施例中,如果该节点类型为固定-可变计数懒惰节点则将该有效载荷的该段与该元素进行匹配可以包括:将该段与该元素进行匹配,并且如果该段匹配,则加载该图形中的该下一个节点地址处的下一个节点,并且如果该段不匹配,则返回不匹配。如果该节点类型为可固定-变计数懒惰节点则将该有效载荷的该段与该元素进行匹配可以包括将一个堆栈条目推送至一个运行堆栈,该堆栈条目指示该可变计数懒惰节点和有效载荷偏移,以及加载在该图形中的该下一个节点地址处的下一个节点。如果该节点类型为可变计数懒惰节点则将该有效载荷的该段与该元素进行匹配可以包括:如果该段匹配,则将一个堆栈条目推送至该运行堆栈,该堆栈条目指示该可变计数懒惰节点和有效载荷偏移,加载该图形中的该下一个节点地址处的下一个节点,并且如果该段不匹配,则返回不匹配。
在一个实施例中,一种用于行走表示图样的非确定有限自动机(NFA)图形的系统可以包括:一个确定模块,被配置成用于从该NFA图形的一个节点中提取一种节点类型、下一个节点地址、计数值、和一个元素,以及一个匹配模块,被配置成用于通过使一个有效载荷与该元素进行匹配至少零次来将该有效载荷的一段针对该元素进行匹配,该次数基于节点类型。
可变计数节点为针对一个元素进行匹配可变次数的节点,该次数量由一个范围(例如,零到五次)限定。可变计数节点可以具有四种特性中的一种:懒惰、贪婪、领属、或全匹配。可变计数懒惰节点被配置成用于找到该范围内的最短可能的元素匹配。可变计数懒惰或领属节点被配置成用于找到该范围内的最长可能的元素匹配。可变计数全匹配节点被配置成用于返回有效载荷中的所有匹配。
固定计数节点针对一个元素进行匹配固定量次数。固定计数和可变计数图样可以是被配置成用于针对一个范围进行匹配的可变计数图样的表达式,其中,该范围以高于零的数字开始。例如,针对一个元素进行匹配10到20次的可变计数图样可以被表达为针对该元素进行匹配十次的固定计数节点然后针对该元素进行匹配0到10次的可变计数节点。字符串节点为按具体顺序针对字符串(字符集合)进行匹配的节点。
标记节点为指示在有效载荷中找到图样的匹配的节点。分离节点为对图形中两条路径之间的选择进行指示的节点。
附图简要说明
从本发明的示例实施例的以下更具体的说明中上述内容将是明显的,如在这些附图中所展示的,其中,贯穿这些不同的视图,相似的参考字符是指相同的部分。附图不一定按比例,而是着重于展示本发明的实施例。
图1A和图1B为包括网络服务处理器的示例安全装置的框图。
图2A分别为图1A和图1B中所示的网络服务处理器、或协议处理器的框图。
图2B为框图,展示了图2A的引擎(例如,网络服务处理器)的环境的示例实施例。
图3A为图解,展示了NFA图形的示例实施例。
图3B为本发明所使用的NFA图形的示例实施例的图解。
图3C为图解,展示了示出可以使用的其他类型的计数节点的NFA图形的示例实施例。
图4A为现有技术系统所使用的NFA图形的示例实施例。
图4B为图解,展示了本发明所使用的NFA图形的示例实施例。
图4C为使用五个单独节点的图样“USPTO”的常规图形的示例实施例。
图4D展示了使用字符串节点的图形的示例实施例。
图5为图解,展示了NFA图形的示例实施例,该图形展示了本发明的示例实施例。
图6A为框图,展示了编译器处理图样的示例实施例。
图6B为图6A的图样产生的编译NFA图形的图解。
图7为框图,展示了对图样进行编译的示例实施例。
图8为流程图,展示了对图样进行编译的示例实施例。
图9为流程图,展示了图形行走引擎对节点进行处理的示例实施例。
图10为框图,展示了图形行走引擎对NFA图形的节点进行处理的示例实施例。
图11为流程图,展示了使本发明所使用的NFA图形行走的过程。
图12为流程图,展示了对节点进行处理的示例实施例。
图13为流程图,展示了对字符类节点进行处理的示例实施例。
图14为流程图,展示了图形行走引擎对字符串节点进行处理的示例实施例。
图15A和图15B为流程图,展示了对固定计数节点进行处理的示例实施例。
图16为流程图,展示了对可变计数节点进行处理的示例实施例。
图17为流程图,展示了对可变计数懒惰节点进行处理的示例实施例。
图18为流程图,展示了对可变计数贪婪节点进行处理的示例实施例。
图19为流程图,展示了对可变计数领属节点进行处理的示例实施例。
图20为流程图,展示了对可变计数全匹配节点进行处理的示例实施例。
图21为表,展示了字符类中所使用的位图/遮罩的示例实施例。
图22为表,展示了字符类匹配节点的格式。
图23为表,展示了字符串匹配节点的格式。
图24为表,展示了固定计数匹配节点的格式。
图25为表,展示了可变计数匹配节点的格式。
图26为表,展示了字符类匹配堆栈条目的格式。
图27为表,展示了字符串匹配堆栈条目的格式。
图28为表,展示了固定计数匹配堆栈条目的格式。
图29为表,展示了可变计数匹配堆栈条目的格式。
发明详细说明
以下是本发明的多个示例实施例的描述。
戈亚尔(Goyal)等人的被公开为美国公开号2013/0133064的美国第13/303,855号申请“逆向NFA生成和处理(Reverse NFAGeneration and Processing)”和戈亚尔(Goyal)等人的被公开为美国公开号2012/0221497的美国第13/168,395号申请“正则表达式处理自动机(Regular Expression Processing Automaton)”描述了NFA和表达式匹配概念。以上申请的全部教导通过引用结合于此。
perl兼容正则表达式(PCRE)已经成为安全和联网应用中正则表达式语法的约定俗成的标准。随着更多应用需要深度数据包检查已经兴起或更多威胁在互联网中变得普遍,用于标识病毒/攻击的相应特征/图样或应用也已经变得更加复杂。特征数据库从具有简单字符串图样到具有通配字符/范围/字符类的正则表达式(regex)图样进化到高级PCRE特征。高级PCRE特征具体地是指如起始偏移、反向引用、捕捉组、和断言的特征。本发明的实施例支持线速下的高级PCRE特征。
在详细描述本发明的示例实施例之前,以下紧接着描述了可以使用DFA和NFA在其中实施这些实施例的示例网络安全应用,以帮助读者理解本发明的发明特征。
图1A为包括网络服务处理器100的示例安全装置102的框图。安全装置102可以是可以将在一个以太网端口(Gig E)接收到的数据包切换到另一个以太网端口(Gig E)和在转发这些数据包之前在所接收到的数据包上执行多个安全功能的独立系统。例如,安全装置102可以用于在将所处理的数据包转发至局域网之前对在广域网上接收到的数据包执行安全处理。
网络服务处理器100对所接收到的数据包中所封装的开放系统互连网络L2-L7层协议进行处理。如本领域技术人员所熟知的,开放系统互连(OSI)参考模型定义了七层网络协议层(L1-7)。物理层(L1)表示将设备连接到传输媒介的实际接口,包括电气接口和物理接口。数据链路层(L2)执行数据组帧。网络层(L3)将数据格式化为数据包。传输层(L4)处理端到端的传输。会话层(L5)管理设备之间的通信,例如,无论通信是半双工的还是全双工的。表现层(L6)管理数据格式化及表现,例如,语法、控制代码、特殊图形及字符集。应用层(L7)允许多个用户之间进行通信,例如,文件传输及电子邮件。
网络服务处理器100可以为上层网络协议(例如,L4-L7)调度和排列工作(数据包处理操作),并且允许在所接收到的待执行的数据包中进行上层网络协议的处理,以便以线速转发数据包。通过处理这些协议来以线速转发这些数据包,该网络服务处理器不会降低网络数据传送速率。
网络服务处理器100可以包括多个以太网媒体访问控制接口,其中,标准简化的千兆比特媒体独立接口(RGMII)连接至芯片外PHY104a、104b。
网络服务处理器100还可以通过物理接口PHY104a、104b从以太网端口(Gig E)接收数据包以及对所接收到的数据包执行L2-L7网络协议处理以及将所处理的数据包转发通过物理接口104a、104b到达网络中的另一跳或最终目的地或通过外围组件互连/外围组件互连扩展接口(PCI/PCI-X)总线106以便由主机处理器进行进一步处理。网络协议处理可以包括网络安全协议的处理,如防火墙、应用防火墙、包括IP安全(IPSec)和/或安全套接字层(SSL)的虚拟专用网(VPN)、入侵检测系统(IDS)和防病毒(AV)。
网络服务处理器100还可以包括用于控制外部本地存储器108的存储器控制器,如动态随机存取存储器(DRAM)和双倍数据速率同步动态随机存取存储器(DDR SDRAM)。在某些实施例中,外部本地存储器118为低延迟存储器。
外部本地存储器118可以用于允许快速查找的互联网服务和安全应用,包括入侵检测系统(IDS)或防病毒(AV)应用或需要字符串匹配的其他应用可能所需的字符串匹配。
根据本发明的一个实施例,网络服务处理器100可以执行图样搜索、正则表达式处理、内容验证、转换和安全以加速数据包处理。正则表达式处理和图样搜索可以用于针对IDS和AV应用以及需要字符串匹配的其他应用执行字符串匹配。
网络服务处理器100中的DRAM控制器可以控制对耦合到网络服务处理器100上的外部动态随机存取存储器(DRAM)108的访问。DRAM108可以存储从PHY接口104a、104b或PCI/PCI-X接口106接收到的数据包以供网络服务处理器100进行处理。在一个实施例中,DRAM接口支持运行高达800MHz的64或128位双倍数据速率II同步动态随机存取存储器(DDR II SDRAM)。DRAM还可以存储DFA和NFA图形表达式搜索中查找和图样匹配所需的规则数据。
启动总线110可以提供可以存储在闪速存储器112内并且当网络服务处理器100通电或复位时可以由网络服务处理器100执行的必要启动代码。应用代码还可以通过启动总线110从实施紧凑式闪存标准的装置114、或从可以是磁盘通过PCI/PCI-X总线106附接的另一个大容量装置加载到网络服务处理器100内。
杂项I/O接口116提供辅助接口,如通用输入/输出接口(GPIO)、闪存、IEEE802双线管理接口(MDIO)、通用非同步收发器(UART)和串行接口。
应认识到,示例安全装置102可以替代性地包括协议处理器101(图1B)。协议处理器101可以包括网络服务处理器100的元件,并且添加了内容处理加速器107,通过PCI/PCI-X连接106耦合到处理器101,并且外部DRAM111耦合到加速器107。加速器107和DRAM111可以用于内容搜索应用中,从而在处理器101外部进行所有内容搜索操作。
图2A分别为图1A和图1B中所示的网络服务处理器100、或协议处理器101的框图。网络服务处理器100、和/或协议处理器101使用多个处理器(内核)202提供高应用性能。网络应用可以被分类成数据平面和控制平面操作。内核202中的每个内核可以专用于执行数据平面或控制平面操作。数据平面操作可以包括数据包操作以便转发数据包。控制平面操作可以包括处理复杂的高层协议的多个部分,如互联网协议安全(IPSec)、传输控制协议(TCP)和安全套接字层(SSL)。数据平面操作可以包括处理这些复杂的高层协议的其他部分。
可以由接口单元210a、210b中的任一个通过SPI-4.2或RGM II接口接收数据包。PCI接口224也可以接收数据包。接口单元210a、210b处理L2网络协议,该网络协议对所接收到的数据包进行以下预处理:检查所接收到的数据包内所包括的L2网络协议报头中的各字段。在接口单元210a、210b已经执行L2网络协议处理之后,将数据包转发至数据包输入单元214。数据包输入单元214可以执行所接收到的数据包中所包括的L3和L4的网络协议报头的预处理。该预处理包括对传输控制协议(TCP)/用户数据报协议(UDP)(L3网络协议)的校验和检查。
数据包输入单元214可以用对至少一个处理器202中所执行的高层软件方便的格式将数据包数据写入到2级高速缓存212或DRAM108中的缓冲区中,以便进一步处理高层网络协议。数据包输入单元214还可以支持可编程缓冲区大小并且可以跨多个缓冲区分配数据包数据以支持大的数据包输入大小。
数据包次序/工作(POW)模块(单元)228可以为处理器202对工作(数据包处理操作)进行排队和调度。工作被定义为处理器有待执行的、由工作队列上的条目标识的任何任务。该任务可以包括数据包处理操作,例如,针对有待由在工作队列上的工作队列条目所标识的所接收到的数据包上执行的L4-L7层的数据包处理操作。每个单独的数据包处理操作为处理器有待在存储器(L2高速缓存212或DRAM108)中所存储的所接收到的数据包上执行的一份工作。例如,该工作可以是所接收到的防火墙/虚拟专用网络(VPN)数据包的处理。防火墙/VPN数据包的处理可以包括以下单独的数据包处理操作(多份工作):(1)碎片整理,以对所接收到的数据包内的碎片进行重新排序;(2)IPSec解密;(3)IPSec加密;以及(4)转发数据包之前的网络地址转换(NAT)或TCP序列号调整。
网络服务处理器100、和/或协议处理器101还可以包括存储器子系统。存储器子系统可以包括每个处理器202中的1级数据高速缓存204、每个处理器202中的指令高速缓存、2级高速缓存212、外部DRAM存储器的DRAM控制器216以及外部本地存储器118(例如,DDRSDRAM)的接口230。该存储器子系统被架构成用于支持多处理器并且被调谐成用于实现存储器密集型内容联网应用所需的高吞吐量和低延迟。处理器202和I/O协处理器装置全都可以共享2级高速缓存212和(图1A和图1B的)外部DRAM存储器108。
网络服务处理器100和/或协议处理器101还可以包括卸载处理器202从而使得网络服务处理器实现高吞吐量的特定用途协处理器。这些特定用途协处理器包括执行以下更加详细描述的非确定型有限自动机(NFA)处理的协处理器244和执行压缩和解压缩的压缩/解压缩协处理器208。
每个处理器202可以是带有指令高速缓存206、1级数据高速缓存204、用于密码算法的内置硬件加速(加密加速模块)200的双发射超标量处理器,其中,通过低延迟存储器总线230直接访问本地存储器。至本地存储器118的低延迟直接访问路径绕过L2高速缓存212并且可以从处理器(内核)202和NFA协处理器244两者直接访问。
在进一步详细描述用于正则表达式处理的内容搜索宏命令和图样搜索的操作之前,将描述网络服务处理器100中的其他模块。在一个示例中,在处理器202已经处理了数据包之后,数据包输出单元(PKO)218从L2高速缓存或DRAM读取数据包数据,执行L4网络协议后处理(例如,生成TCP/UDP校验和),转发数据包通过接口单元210a、210b以及释放用于存储数据包的L2高速缓存212或DRAM108位置。
每个处理器202通过一致存储器总线234连接至L2高速缓存。一致存储器总线234(在一个实施例中宽度为384位)为用于处理器202、I/O桥(IOB)232与2级高速缓存和控制器212之间的所有存储器和I/O事务的通信通道。
空闲池分配器(FPA)236维护多个指针池,以释放2级高速缓存212及DRAM108中的存储器。为每个空闲指针池实现带宽高效(后进先出(LIFO))堆栈。如果指针池太大而不能安装在空闲池分配器(FPA)236内,则空闲池分配器(FPA)236使用指针池中用于存储附加指针的释放存储器在2级高速缓存212或DRAM108中建立树/列表结构。
I/O桥(IOB)232管理整体协议及仲裁并且提供一致的I/O划分。IOB232包括桥238和FAU240。桥238包括多个缓冲区队列,用于存储有待在I/O总线、一致存储器总线、数据包输入单元214与数据包输出单元218之间传输的信息。
提取和添加单元(FAU)240为支持读取、写入、自动提取和添加、以及自动更新操作的2KB寄存器组。可以从处理器202和数据包输出单元218访问提取和添加单元(FAU)240。寄存器存储高度使用的值并因此减少访问这些值的流量。FAU240中的寄存器用来维护用于通过数据包输出单元218转发所处理的数据包的输出队列的长度。
PCI接口控制器224具有允许处理器202在网络服务处理器中的本地存储器与远程(PCI)存储器之间在两个方向上异步地移动数据的DMA引擎。
典型地,内容感知应用处理使用或者确定有限自动机(DFA)或者非确定有限自动机(NFA)来识别所接收到的数据包的内容中的图样。DFA和NFA两者都是有限状态机,即,计算模型,计算模型中的每一个都包括状态集合、开始状态、输入字母(所有可能的符号集合)和转换函数。计算在开始状态中开始,并且根据转换函数而改变为新的状态。
图样通常使用正则表达式来表达,正则表达式包括基本元素,例如,诸如A-Z、0-9的正常文本字符以及诸如*、^和|的元字符或其他值。正则表达式的基本元素是要被匹配的符号(单个字符)。这些与允许元素(+)、交替(|)、Kleene星号(*)中的一个或多个匹配的元字符组合,其与元素匹配零次或多次。在一个实施例中,元字符可以由PCRE图样标准来限定。用于级联的元字符用于从单个字符(或子串)创建多个字符匹配图样,而用于交替(|)的元字符用于创建可以匹配两个或更多个子串中任何一个的正则表达式。元字符Kleene星号(*)允许图样匹配任意次数,包括不会发生有效载荷段的在前字符或字符类或字符串与在前字符或字符类匹配。组合不同的运算符和单个字符允许构建复杂的表达式。例如,表达式(th(is|at)*)将匹配以下字符串:th,this,that,thisis,thisat,thatis或thatat。当元字符(?)跟着一个元素时,元字符(?)可以是{0,1}的等效物。例如,图样“zzza?”可以与“zzz”有效载荷匹配或与有效载荷“zzza”匹配。
字符类结构[...]允许列出要匹配的字符的列表,例如gr[ea]y查找grey和gray两者。破折号指示字符的范围,例如[A-Z]或[0-9]。字符类可以进一步具有多个范围,例如,[a-zA-Z0-9]将包括所有字母、小写字母和大写字母、以及所有数字。除了换行字符以外,元字符“.”匹配任何一个字符。此外,元字符“^”指示除了后面的一个字符以外的每个字符。例如,“[^\n]”指示除了“换行”字符以外的每个字符(其中“\n”指示换行)。另一个示例为“[^0-9]”,其指示除了数字“0”至“9”以外的任何字符。
典型地,ASCII字符作为来自0-128或0-256的二进制数分别存储在7位和8位实施例中。例如,换行(或跳行)字符可以被表示为ASCII下的数字12。然后,换行可以用二进制被表示为分别7位和8位实施例中的“0001010”或“00001010”。然而,这对于存储字符类而言不是最佳的。
对DFA或NFA状态机的输入通常是(8位)字节的串,即,字母是单字节(一个字符或符号)。输入流中的每个字节产生从一个状态到另一状态的转换。
DFA或NFA状态机的状态和转换函数可以通过图形来表示,其中,图形中的每个节点表示状态,并且图形中的圆弧表示状态转换。状态机的当前状态由选择特定图形节点的节点标识符来表示。
使用DFA来处理正则表达式并且找到字符的输入流中由正则表达式描述的一个或多个图样的特征在于:
1)确定的运行时间性能:可以从输入字符(或符号)以及DFA的当前状态确定DFA的下一个状态。换言之,每DFA状态仅存在一次状态转换。这样,DFA的运行时间性能被认为是确定的并且完全可以从输入预测行为。
2)支持跨多个数据包匹配所需要的较小的每流上下文(例如,状态或节点指针):在搜索跨越构成流的若干数据包的输入的图样中,搜索可能在一个数据包处停止并且然后在另一个数据包处恢复。通常,确定要恢复搜索的状态需要跟踪、记住或以另外的方式存储(例如,作为状态指针或堆栈条目)直至搜索停止时所遍历的所有状态。然而,在DFA中,为了恢复搜索,仅需要记录搜索停止时的状态。这样,DFA的特征为需要较小的每流上下文,以支持跨多个输入数据包的图样匹配,例如,以若干字节的量级存储状态或节点指针。
3)其中节点的数量(或图形大小)可以随着图样的大小呈指数增长的图形。
相比之下,使用NFA来处理正则表达式并且找到由字符的输入流中的正则表达式所描述的一个或多个图样的特征在于:
1)非确定的运行时间性能:给定输入字符(或符号)和NFA的当前状态,可能存在要转换到其上的NFA的多于一个的下一状态。换言之,不能唯一地从NFA的输入和当前状态确定NFA的下一状态。这样,NFA的运行时间性能被认为是不确定的,并且不能完全从输入预测行为。
2)支持跨多个数据包匹配所需要的较大的每流上下文(例如,状态或节点指针):如前所述,跨多个输入数据包的图样匹配,其中,搜索在一个数据包处停止并且然后在另一数据包处恢复,需要跟踪直至在搜索停止时所遍历的所有状态。在NFA中,越多输入被匹配,需要跟踪的当前状态的数量就越多。这样,可以说,与DFA相比,NFA的特征为需要较大的每流上下文来支持跨多个输入数据包的图样匹配。
3)其中节点的数量(或图形大小)通常随着图样的大小呈线性增长的图形。
图2B为框图250,展示了图2A的引擎252(例如,网络服务处理器,(例如NFA引擎))的环境的示例实施例。引擎252操作性地耦合成用于读取来自指令队列254的一个或多个指令253。指令队列254存储主机所发送的有待由引擎252处理的指令。引擎252通过读取其中所存储的指针对指令253进行处理。指令253中的指针包括到输入缓冲区258(其可以被称为输入堆栈,即使其不具有堆栈的LIFO特性)的条目的指针、到有效载荷262的指针、到匹配结果缓冲区266的指针、到保存缓冲区264(其可以被称为保存堆栈,即使其不具有堆栈的LIFO特性)的指针以及到运行堆栈260的指针。
引擎252将来自指针的一个或多个条目加载至输入缓冲区258(例如,S1、S2、和/或S3)。然后,该引擎将来自输入缓冲区258的一个或多个条目推送至运行堆栈260。在本示例中,该引擎可以将条目S1、S2、和S3推送至运行堆栈260。然后,引擎252弹出运行堆栈上的第一条目(例如,S1)并开始对其进行处理。在一个实施例中,该运行堆栈为后进先出(LIFO)堆栈。来自输入缓冲区258的每个条目(例如,S1、S2、和S3)包括有效载荷偏移和到图形257的指针。然后,该引擎可以加载来自图形存储器256的图形257并开始使用与有效载荷262的偏移相对应的有效载荷段对图形进行处理。
当引擎252使用来自有效载荷262的有效载荷段对图形257进行处理时,其可以将条目推送和弹出至运行堆栈260。当需要将其位置保存在图形中时,引擎252将条目推送至运行堆栈260。当图形呈现多条处理路径时,引擎252需要将其位置保存在图形中。引擎252可以遍历这些路径其中之一,并且在失配情况下,可以返回至运行堆栈260条目中所指示的节点和有效载荷以遍历其他一条或多条路径。图形257中的分离节点或可变计数节点可以在图形中呈现此类多条路径。
在处理有效载荷262和图形257中,有效载荷262可以在处理完成之前用完数据。有效载荷262可以是数据包或来自数据流(或有效载荷流)的其他分组数据。该流可以具有多个有效载荷262(例如,数据包),每个有效载荷262在该流中具有一个顺序。有效载荷262的每个段为该有效载荷的具有具体粒度的部分,如但不限于一个字节。在一个实施例中,该粒度是可调整的或可选的。这种情况的一个示例为当有效载荷262的有效载荷偏移开始朝向数据包的末端并且在数据包结束前进行找到部分匹配时。为了继续该工作,引擎252将当前堆栈条目保存到保存缓冲区264内。从而,当有效载荷用尽时,保存缓冲区264存储运行堆栈260的一个或多个运行堆栈条目。然后,当引擎252从数据包的数据流加载有效载荷262的后续部分时,引擎252可以从保存缓冲区264加载运行堆栈条目并将它们推送至运行堆栈260内以继续该工作。这种将保存缓冲区条目加载到运行堆栈内还可以由主机处理器来执行,同时将指令提交至用于同一流的后续数据包的引擎。
当找到有效载荷262对图形257的匹配后,除非引擎252被配置成用于返回所有匹配,否则其弹出并可以丢弃运行堆栈260内的与从输入缓冲区258加载的工作相关联的所有条目(例如,第一条目S1)。然后,引擎252将结果(例如,匹配位置和长度)保存在匹配结果266存储器内。然后,引擎252可以从之前已经从输入缓冲区258(例如,S2)加载的运行堆栈加载下一个条目。然后,引擎252可以对与那个条目相对应的图形和有效载荷段进行处理,并继续对附加工作进行处理直到运行堆栈260是空的。
当找到有效载荷262对图形257的失配后,该引擎弹出并处理运行堆栈260内的与从输入缓冲区258加载的工作相关联的下一个条目(例如,第一条目S1)。如果运行堆栈260内没有留下与从输入缓冲区258加载的工作相关联的条目(例如,第一目S1),则引擎252完成当前工作并从之前已经从输入缓冲区258加载的运行堆栈加载下一个条目(例如,S2)。然后,引擎252可以对与那个条目相对应的图形和有效载荷段进行处理,并继续对附加工作进行处理直到运行堆栈260是空的。
图3A为图解300,展示了例如戈亚尔(Goyal)等人的被公开为美国公开号2013/0133064的美国第13/303,855号申请“逆向NFA生成和处理(Reverse NFA Generation and Processing)”和戈亚尔(Goyal)等人的被公开为美国公开号2012/0221497的美国第13/168,395申请“正则表达式处理自动机(Regular Expression Processing Automaton)”中所描述的系统所使用的NFA图形320的示例实施例。以上申请的全部教导通过引用结合于此。NFA图形320被配置成用于匹配图样“ab{0,5}x”。“b{0,5}”针对图样中的‘b’在任何地方匹配从零到五次。从而,该图样对以下有效载荷进行匹配:ax、abx、abbx、abbbx、abbbbx、或abbbbbx。
NFA图形320以节点N0302开始。当加载节点N0302后,图形行走引擎被配置成用于确定有效载荷的第一段(例如,字节)是否匹配‘a’。如果匹配,则图形行走引擎加载节点N1304和有效载荷的下一段,并且如果不匹配,则图形行走引擎返回不匹配。
当加载节点N1304后,如果有效载荷的下一段为‘x’,则图形行走引擎加载为标记节点的节点N7316。该标记节点指示在有效载荷内找到匹配,从而使得图形行走引擎返回匹配。如果有效载荷的下一段为‘b’,则图形行走引擎加载节点N2306。如果有效载荷的下一段为除了‘x’或‘b’以外的任何事物,则图形行走引擎确定有效载荷中没有匹配并返回不匹配。
当加载节点N2306后,如果有效载荷的下一段为‘x’,则图形行走引擎加载为标记节点的节点N7316。该标记节点指示在有效载荷内找到匹配,从而使得图形行走引擎返回匹配。如果有效载荷的下一段为‘b’,则图形行走引擎加载节点N3308。如果有效载荷的下一段为除了‘x’或‘b’以外的任何事物,则图形行走引擎确定有效载荷中没有匹配并返回不匹配。
当加载节点N3308后,如果有效载荷的下一段为‘x’,则图形行走引擎加载为标记节点的节点N7316。该标记节点指示在有效载荷内找到匹配,从而使得图形行走引擎返回匹配。如果有效载荷的下一段为‘b’,则图形行走引擎加载节点N4310。如果有效载荷的下一段为除了‘x’或‘b’以外的任何事物,则图形行走引擎确定有效载荷中没有匹配并返回不匹配。
当加载节点N4310后,如果有效载荷的下一段为‘x’,则图形行走引擎加载为标记节点的节点N7316。该标记节点指示在有效载荷内找到匹配,从而使得图形行走引擎返回匹配。如果有效载荷的下一段为‘b’,则图形行走引擎加载节点N5312。如果有效载荷的下一段为除了‘x’或‘b’以外的任何事物,则图形行走引擎确定有效载荷中没有匹配并返回不匹配。
当加载节点N5312后,如果有效载荷的下一段为‘x’,则图形行走引擎加载为标记节点的节点N7316。该标记节点指示在有效载荷内找到匹配,从而使得图形行走引擎返回匹配。如果有效载荷的下一段为‘b’,则图形行走引擎加载节点N6314。如果有效载荷的下一段为除了‘x’或‘b’以外的任何事物,则图形行走引擎确定有效载荷中没有匹配并返回不匹配。
当加载节点N6314后,如果有效载荷的下一段为‘x’,则图形行走引擎加载为标记节点的节点N7316。该标记节点指示在有效载荷内找到匹配,从而使得图形行走引擎返回匹配。如果有效载荷的下一段为除了‘x’以外的任何事物,则图形行走引擎确定有效载荷中没有匹配并返回不匹配。
图3B为本发明所使用的NFA图形370的示例实施例的图解。NFA图形370被配置成用于匹配与图3A中相同的图样“ab{0,5}x”。如上所述,“b{0,5}”针对图样中的‘b’在任何地方匹配从零到五次。从而,该图样与以下有效载荷匹配:ax、abx、abbx、abbbx、abbbbx、或abbbbbbx。
节点N0352为被配置成用于针对元素‘a’进行匹配的字符节点。节点N1354为被配置成用于针对元素‘b’在任何地方匹配从‘0’和‘5’次的可变计数节点。可变计数节点可以被配置成用于针一个对元素进行匹配任何次数,包括无限次数。节点N2356为被配置成用于针对元素‘x’进行匹配的字符节点。节点N3358为被配置成用于表示图样末端并且发出在有效载荷中已经找到匹配的信号的标记节点。
图形行走引擎从NFA图形370加载节点N0352。然后,图形行走引擎对有效载荷的第一段进行处理。如果该有效载荷段为‘a’,则图形行走引擎加载节点N1354。否则,图形行走引擎返回不匹配。
当加载节点N1354后,图形行走引擎将该节点解释为针对字符类‘b’进行匹配从0到5次的可变计数节点。从此节点开始,图形行走引擎被配置成用于针对有效载荷中的这种图样进行匹配,并且然后加载下一个节点(节点N2356)。然后,节点N2356确定有效载荷的下一段是否为‘x’。如果是,则图形行走引擎加载节点3358(标记节点),指示图样为匹配。如果不是,则图形行走引擎返回不匹配。以下描述了图形行走引擎使用运行堆栈行走过可变计数节点的特定细节。
NFA图形370标识与图3A的NFA图形320相同的图样,然而用更少的节点来这样做。因此,NFA图形370使用更少的存储器并且具有降低的复杂性。
图3C为图解380,展示了示出其他类型的计数节点的NFA图形390的示例实施例。固定计数节点针对一个元素对有效载荷段搜索固定次数,而不是使用一个范围。例如,图样“ab{5}x”匹配有效载荷“abbbbbx”,但不匹配“ax”、“abx”、“abbx”、“abbbx”、或“abbbbx”。同样,以一个范围而不是零开始的可变计数匹配图样可以被转换成固定计数图样、然后转换成可变计数图样。例如,“ab{5,10}x”还可以被表达为“ab{5}b{0,5}x”。图3C中的NFA图形390示出了这种等效图样。如上所述,这生成用于针对“a”进行匹配的节点N0382、针对“b”进行匹配五次的节点N1384、针对“b”进行匹配从零到五次的可变计数节点N2386、针对“x”进行匹配的节点N3388、以及用于表示找到匹配的标记节点N4389。
作为本发明的示例实施例,每个节点存储一个元素,其中,元素为或者单独的值/字符/字母、字符类ID(例如,字符类索引)、或者字符串。每个节点进一步存储其节点类型和节点类型所要求的任何其他信息,例如可变计数节点存储针对每个元素进行匹配的最大(并且可选地最小)次数和其是否为懒惰/贪婪/领属全匹配类型节点,固定计数节点存储针对每个元素进行匹配的次数。
图4A为现有技术系统所使用的NFA图形440的示例实施例。NFA图形440被配置成用于对“[aA][bB]”图样进行匹配,其对包括“ab”、“aB”、“Ab”、和“AB”的有效载荷进行匹配。
图形行走引擎首先处理节点N0402。如果有效载荷为“a”,则图形行走引擎加载节点N1404。然后,图形行走引擎对有效载荷的下一段进行处理。如果有效载荷为“b”,则图形行走引擎加载节点N3408,该节点是标记节点。如果有效载荷为“B”,则图形行走引擎加载节点N4410,该节点也是标记节点。两个标记节点指令图形行走引擎返回匹配。
另一方面,如果当处理节点N0402时,图形行走引擎处理为“A”的有效载荷,则图形行走引擎加载节点Node2406。然后,图形行走引擎对有效载荷的下一段进行处理。如果有效载荷为“b”,则图形行走引擎加载节点N5412,该节点是标记节点。如果有效载荷为“B”,则图形行走引擎加载节点N6414,该节点也是标记节点。两个标记节点指令图形行走引擎返回匹配。
NFA图形440甚至可以用短图样如“[aA][bB]”来增加复杂性。即使每个字符类仅指定两个值/字符/字母,则添加至图样的每个附加字符类使图形中的节点数量翻倍。进一步地,字符类可以具有所指示的任何数量的字符,字符越多,则甚至进一步增加图形的复杂性越大。
在一个实施例中,每个字符类可以存储在128位或256位图中。字符类中的每个位表示其相应的ASCII值。例如,位图中的第12位表示“换行”字符。如果第12位为1,其意味着字符类包括“换行”字符。如果第12位为0,则字符类不包括“换行”字符。以相同方式,每个字符类可以存储多个ASCII值。例如,[^\n](即,具有除了换行以外的所有字符的字符类)将除了第12位以外的所有位标记为“1”。举另一个示例来将,字符类[a-z]包括97–122的ASCII值。因此,字符类[a-z]的位图将具有被设置为“1”的位97–122和被设置为“0”的所有其他位。
当图形行走引擎对有效载荷段与字符类进行匹配时,其可以将有效载荷的ASCII值用作字符类的索引。例如,当字符类为[a-z]时,假设图形行走引擎处理字母“r”,该字母具有为114的ASCII值。图形行走引擎可以访问字符类的第114位并且确定其是否被设置为用于确定其是否与该字符类匹配。这可以用以下逻辑语句来表达:“if(CharacterClass[PayLoadASCIIValue]==true),return match;else returnnomatch”,其中,PayLoadASCIIValue为有效载荷的当前段的ASCII值,或者在这种情况下为114。
给定图样还可以包括多个字符类。例如,图样“[a-z][0-9][^\n][a-z]”具有四个字符类,但仅三个唯一字符类(即,[a-z]、[0-9]、和[^\n]),因为[a-z]为重复字符类。所以,编译器首先确定该或这些图样中存在的唯一字符类的数量。然后,编译器为每个字符类分配唯一号码(例如,索引或标识符)。例如,编译器为[a-z]分配为1的索引、为[0-9]分配为2的索引、以及为[^\n]分配为3的索引。即使其出现两次,字符类[a-z]作为位图被存储一次,并且可通过其索引“1”来访问。
编译器存储字符类作为二维矩阵,可以用作为输入的两个索引来对其进行访问。第一索引标识字符类,并且第二索引标识那个字符类内的值。
在NFA图形的上下文中,节点类型=“字符类”的每个节点的“元素”字段包含字符类编号。此外,“可变计数”或“固定计数”类型的节点的“元素”字段还可以是字符类的索引,从而使得图形行走引擎针对该字符类分别进行匹配可变次数或固定次数。
此外,编译器确定所有图样的字符类。例如,编译器可以接收图样一“[a-z][0-9]”、图样二“[a-z][^\n]”以及图样三“[0-9][A-F]”。虽然图样一、二和三共有六个字符类,但其仅具有四个唯一字符类。因此,编译器给[a-z]分配索引1、给[0-9]分配索引2、给[^\n]分配索引3和给[A-F]分配索引4。图形的任何节点可以通过访问字符类的位图来对字符类进行访问,而不管其所出现在其中的一个或多个图样。这减少了存储所有字符类所需的存储器。
在行走过程中,图形行走引擎将节点中所存储的指示(节点类型字符类的)字符类的元素用作第一索引并且将有效载荷段(例如,有效载荷字节)用作具体字符类位图的第二索引。这加载了二维矩阵的具体位,其中,在两个索引的位置处加载的位指示有效载荷段(例如,有效载荷字节)是否在具体字符类内。
图4B为图解450,展示了带有本发明所使用的密集节点和相应字符类矩阵472(例如,位图表)的NFA图形470的示例实施例。NFA图形470被配置成用于对图样“[aA][bB]”进行匹配,其与包括“ab”、“aB”、“Ab”、和“AB”的有效载荷匹配。在本实施例中,NFA图形470利用图形的节点内的字符类来减少图形中节点的数量并降低图形复杂性。编译器确定该图样是否包括两个唯一字符类([aA]和[bB])。编译器为字符类[aA]分配索引0并为字符类[bB]分配索引1,并且两者作为位图存储在二维矩阵中。
字符类矩阵472示出了字符类[aA]和[bB]在其相应索引处的展示。字符类0(即,[aA])示出了用于设置“A”和“a”的条目,并且字符类1(即,[bB])示出了用于设置“b”和“B”的条目。使用相同字符类的其他图形可以利用这些字符类,并且该矩阵可以进一步包括与其他图形不同的字符类。关于图21,示出了字符类矩阵的另一个示例。
图22为表2200,展示了字符类匹配节点的格式。表2200包括节点类型2202、匹配类型2204、元素2206、下一个节点地址2208、以及计数值2210。对于字符类匹配节点而言,节点类型2202指示字符类。匹配类型2204指示其不适用(例如,空值)。元素2206指示用于访问字符类矩阵中的字符类的字符类索引。下一个节点地址2208包括图形中的下一个节点的地址。计数值2210对于字符类匹配节点而言是不适用的。
再次参照图4B,当读取节点N0452时,图形行走引擎确定节点N0452是否针对所指定的字符类中的任何值/字符/字母匹配,在这种情况下,其为“a”或“A”,并且加载有效载荷的第一段。图形行走引擎加载节点的节点类型和节点的元素,节点类型指示其为字符类,节点的元素指示字符类具有索引0。然后,图形行走引擎将有效载荷的当前段用作位图的索引(例如,加载Matrix[0][PayloadSegmentValue])以确定该有效载荷段是否与字符类匹配。如果该有效载荷的第一段为所指定的字符类中的任何值/字符/字母,如从这些索引的位置处的位图加载的值所指示的,图形行走引擎加载由节点N0452中所存储的“下一个节点地址”所指向的节点N1454。
当读取节点N1454时,图形行走引擎确定节点N1454是否针对所指定的字符类中的任何值/字符/字母匹配,在这种情况下,其为“b”或“B”,并且加载有效载荷的下一段。图形行走引擎加载节点的节点类型和节点的元素,节点类型指示其为字符类,节点的元素指示字符类具有索引1。然后,图形行走引擎将有效载荷的当前段用作位图的索引(例如,加载Matrix[1][PayloadSegmentValue])以确定该有效载荷段是否与字符类匹配。如果该有效载荷的当前段为所指定的字符类中的任何值/字符/字母,如从这些索引的位置处的位图加载的值所指示的,图形行走引擎加载由节点N1454(即,节点N2456)中所存储的“下一个节点地址”所指向的节点。当加载节点N2456时,基于节点N2456的“节点类型”,图形行走引擎确定其是否为标记节点。然后,图形行走引擎可以返回匹配。
NFA图形470具有降低的复杂性和减少的大小。进一步地,每个字符类中的值/字符/字母的数量不增加或减少NFA图形470的大小。此外,增加图形中不同字符类的数量会线性地增加NFA图形470的大小,而不是增加字符类中的值/字符/字母的数量的倍数。
除了字符类以外,根据本发明的示例实施例,另一种节点类型为字符串节点。字符串节点为一个针对连续值/字母/字符进行匹配的节点。
图23为表2300,展示了字符串匹配节点的格式。字符串节点表2330包括节点类型2302、匹配类型2304、元素2306、下一个节点地址2308、以及计数值2310。节点类型2302指示“字符串匹配”。匹配类型2304不适用(例如,空值)。元素2306指示字符串数据2340的地址。下一个节点地址2308包括图形中的下一个节点的地址。计数值2310指示字符串的长度。
字符串节点2330的元素2306的字符串数据的地址所指示的字符串数据2340包括节点类型2312、匹配类型2314、元素2316、下一个节点地址2318、以及计数值2320。节点类型2312指示其为“字符串数据”。元素2316指示字符串中的字符。匹配类型2314、下一个节点地址2318、以及计数2320全都不适用。
字符串节点的相似变体为不区分大小写的字符串节点。在一个示例实施例中,字符串前面的修饰符可以指示图样中的不区分大小写的字符串节点,如“{i}abc”,其将与以下有效载荷匹配:“abc”、“abC”、“aBc”、“aBC”、“Abc”、“AbC”、“Abc”、和“ABC”。本领域的普通技术人员可以认识到修饰符“{i}”可以是任何所指示的符号或系列符号。
为了处理不区分大小写的字符串节点(以及不区分大小写的字符节点),在进行比较之前,对字母的位之一进行遮罩。例如,大写字母(A-Z)的ASCII值在65-90之间和在97-122之间。‘A’(例如,十进制的97)的二进制表示为1100001,而‘a’(例如,十进制的65)的二进制表示为1000001。因此,在两个二进制值之间,仅一个位不同(例如,位[5],如果从自0开始的最低有效位进行标引)。对于每对相应的不区分大小写的字母字符而言,在比较之前,遮罩元素和有效载荷段内的位[5](其中,每个的最低有效位为零)。该比较返回匹配,因为除了仅表示大写变化的位[5]以外,这些值是相同的。本领域的普通技术人员可以认识到,除了位[5]以外的其他一个或多个位可以用作例如其他字符方案中的遮罩位。
图4C为使用五个单独节点的图样“USPTO”的常规图形475的示例实施例,每个节点进行值/字符/字母检查。因此,常规图形475具有针对‘U’匹配的第一节点N01476、针对‘S’匹配的第二节点N01477、针对‘P’匹配的第三节点N02478、针对‘T’匹配的第三节点N3489、针对‘O’匹配的第三节点N4480、以及指示匹配的标记节点N5481。
图4D展示了使用字符串节点的图形490的示例实施例。节点N0492为包括指向字符串“USPTO”的指针的字符串节点。节点N0492指令引擎针对整个字符串“USPTO”进行匹配而不是按照图4C针对每个单独的字母进行匹配并且然后加载下一个节点。
图24为表2400,展示了固定计数匹配节点的格式。对于固定计数节点而言,节点类型2402指示固定计数匹配2402。匹配类型字段2404对固定计数节点而言不适用。对于固定计数匹配节点而言,元素2406可以指示进行匹配所针对的字符,或者其可以指示进行匹配所针对的字符类索引。如果匹配成功,则下一个节点地址2408包含有待处理的下一个节点的地址。计数值2410包含进行元素匹配的固定次数。
图25为表2500,展示了可变计数匹配节点的格式。该节点包括指示可变计数匹配的节点类型2502。该节点进一步包括指示可变计数节点是否为懒惰、贪婪、领属、或全匹配节点的匹配类型2504。元素2506可以包含进行匹配所针对的字符,或者其可以指示进行匹配所针对的字符类索引。如果匹配成功,则下一个节点地址2508包括有待处理的下一个节点的地址。计数值2510包括进行元素匹配的最大次数,其包括用于表示无限的特殊符号。
可选地,计数值2510还可以包含用于存储元素必须匹配的最大次数的第二计数值(如果没有提供第二计数值,则默认为零)。这可以用于表示范围匹配。此类图样还可以由进行元素匹配最小次数的固定计数节点然后进行匹配剩余次数的可变计数节点的组合来表示。
图5为图解500,展示了NFA图形510的示例实施例,该图形展示了本发明的示例实施例。NFA图形510被配置成用于检测图“[^\n]*[zZ]b{5}”,其中,[^\n]为指示除了换行字符以外的任何值/字符/字母的字符,并且[“zZ”]为表示或者“z”或者“Z”的字符类。
节点N0502为可变计数节点。可变计数节点可以是或者懒惰、贪婪、领属(其是贪婪节点的优化形式)或全匹配类型节点。当从图样编译图形时,设置节点类型。用户可以在图样中指示可变计数节点应被编译为哪种匹配节点类型。可替代地,取决于所希望的图形行为,用户还可以将编译器设置为默认到四种模式中的任何模式。假设图形行走引擎处理有效载荷“yyyZbbbbbzyyyZbbbbb”。
如果节点N0502是懒惰的,则图形行走引擎找出到下一个节点(节点N1504)的可能的最短路径。即,图形行走引擎在节点N1504而不是在节点N0502处理有效载荷中的“z”或“Z”的第一实例,即使节点N0502元素包括找出除换行以外的任何有效载荷段,其包括“z”或“Z”。然而,如果节点N0502以此类方式处理有效载荷,则其将不利用通过图形的最短路径。
当按照可变计数懒惰节点处理节点N0时,图形行走引擎将具有零有效载荷偏移的节点N0的运行堆栈条目推送至运行堆栈。当推送运行堆栈条目后,图形行走引擎提取下一个节点N1504。图形行走引擎提取与零有效载荷偏移相对应的下一个有效载荷字节(‘y’),并试图使其与节点N1504的元素字符类[zZ]匹配。由于该字节与该字符类不匹配,图形行走引擎弹出该运行堆栈条目。然后,图形行走引擎对带有包含节点N0502的所弹出的堆栈条目的同一字节进行处理。字节‘y’与字符类[^\n]匹配,所以其实现匹配。然后,图形引擎使有效载荷偏移增量1并推送包含节点N0502的运行堆栈条目。
当推送运行堆栈条目后,图形行走引擎提取下一个节点N1504。图形行走引擎提取与1有效载荷偏移相对应的下一个有效载荷字节,‘y’,并试图使其与节点N1504的元素字符类[zZ]匹配。由于该字节与该字符类不匹配,图形行走引擎弹出该运行堆栈条目。然后,图形行走引擎对带有包含节点N0502的所弹出的堆栈条目的同一字节进行处理。字节‘y’与字符类[^\n]匹配,所以其实现匹配。图形行走引擎使有效载荷偏移增量1并推送包含节点N0502的运行堆栈条目。
当推送运行堆栈条目后,图形行走引擎提取下一个节点N1504。图形行走引擎提取与2有效载荷偏移相对应的下一个有效载荷字节(‘y’),并试图使其与节点N1504的元素字符类[zZ]匹配。由于该字节与该字符类不匹配,图形行走引擎弹出该运行堆栈条目。然后,图形行走引擎对带有包含节点N0502的所弹出的堆栈条目的同一字节进行处理。字节‘y’与字符类[^\n]匹配,所以其实现匹配。图形行走引擎使有效载荷偏移增量1并推送包含节点N0502的运行堆栈条目。
当推送运行堆栈条目后,图形行走引擎提取下一个节点N1504。图形行走引擎提取与3有效载荷偏移相对应的下一个有效载荷字节(‘Z’),并试图使其与节点N1504的元素字符类[zZ]匹配。由于该字节与该字符类匹配,图形行走引擎提取下一个节点N2506。
然后,图形行走引擎加载固定计数节点N2,该节点针对‘b’进行匹配五次。图形行走引擎加载有效载荷的下五个段,所有这些段为‘b’,固定计数节点与其元素匹配,该元素也为‘b’。在固定计数节点N2506匹配之后,然后,图形行走引擎加载为标记节点的节点N3508。标记节点指示找到匹配。然后,如果复制位为‘1’,则图形行走引擎弹出运行堆栈中的所有条目并丢弃它们,在这种情况下,其丢弃运行堆栈中的包含具有有效载荷偏移3的节点N0502的单个条目。复制位为一个标志位,当到达NFA图形中的标记节点后(例如,找出有效载荷中的匹配),可以从运行堆栈弹出标志标记复制位(例如,设置为‘1’)的任何运行堆栈条目并将其丢弃而不进行进一步处理。如果没有标记复制位(例如,设置为‘0’),则当被弹出后,不丢弃运行堆栈条目,而是被处理以试图找到附加(例如,针对全匹配节点)匹配。
关于图17,更加详细地描述了处理可变计数懒惰节点。
如果节点N0502是贪婪的,则图形行走引擎找出到下一个节点(节点N1504)的可能的最长路径。例如,有效载荷中的第一“z”或“Z”不一定意味着处理节点N1504。假设图形行走引擎处理“yyyZbbbbbzyyyZbbbbb”的相同有效载荷。虽然懒惰节点N0502返回“yyyZbbbbb”作为匹配,但贪婪节点N0502返回“yyyZbbbbbzyyyZbbbbb”。换言之,节点N0502忽略第一可能的匹配而继续对有效载荷进行匹配以找到最长可能的匹配。以此类方式对有效载荷进行匹配需要图形行走引擎保存其步伐,例如,通过将有效载荷位置的节点和偏移推送至运行堆栈。这样,如果图形行走引擎到达有效载荷末端而没有找到匹配,其可以从运行堆栈弹出节点从而回溯以匹配早前可能的匹配。
在本发明的一个示例实施例中,在处理贪婪或领属节点N0502时,图形行走引擎加载有效载荷的字节并针对元素对它们进行匹配直到其找到非匹配或其用完有效载荷。因为字符类为[^\n],其涵盖有效载荷中的所有值/字符/字母,所以图形行走引擎用完有效载荷。然后,图形行走引擎将节点推送至包括被设置的复制位、有效载荷偏移、和指示当匹配可变计数节点内指示的元素时所消耗的字节数量的计数(即,在这种情况下,该计数为19)的运行堆栈。然后,图形行走引擎加载字符类节点N1504,但由于没有来自有效载荷的字节以供消耗,其返回非匹配。
然后,图形行走引擎从运行堆栈弹出可变计数节点并将该计数减少1。然后,图形行走引擎将节点推送至包括被设置的复制位、有效载荷偏移、和指示所消耗的字节数量的计数(18)的运行堆栈。然后,图形行走引擎加载字符类节点N1502。图形行走引擎试图消耗有效载荷中的第19字节,其为‘b’,但这不与节点N1504的字符类[zZ]匹配。然后,图形行走引擎再次弹出运行堆栈条目。重复此内容直到计数减少至节点N1504消耗的字节为一个匹配的数量,其是当该计数为13时。当该计数为13时,可变计数节点有效地消耗“yyyZbbbbbzyyy”。然后,节点N1504试图消耗第14字节,其为“Z”,其是针对字符类[zZ]的匹配。然后,图形行走引擎加载节点N2506。节点N2消耗有效载荷中的下5个“b”。然后,图形行走引擎加载节点N3508,其是指示找到匹配的标记节点。处理标记节点N3508之后,图形行走引擎弹出并丢弃复制位被设置为1的所有运行堆栈条目,并且在这种情况下,运行堆栈中仅存在一个此类条目。因此,贪婪节点发现有效载荷中的最长匹配。设置/未设置复制位是将引擎在运行时间期间推送的(标记)运行堆栈条目与也存在于运行堆栈中的初始输入缓冲区条目分开,然而,这还可以通过其他方式来实现。关于图18,更加详细地描述了处理可变计数贪婪节点。
如果节点N0502是领属的,则图形行走引擎找出到下一个节点(节点N1504)的可能的最长路径。针对领属节点,图形行走引擎产生于上述贪婪节点相同的结果,但执行以下更优化的过程:如关于图19更加详细描述的,当到达有效载荷末端后不回溯。
如果节点N0502为可变计数全匹配节点,则图形行走引擎找出到下一个节点(节点N1504)的可能的所有可能的路径。图形行走引擎可以针对可变计数全匹配节点返回多个匹配。关于图20,更加详细地描述了处理可变计数全匹配节点。
图6A为框图600,展示了编译器604处理图样602的示例实施例。在本示例中,图样602为“ACMEa*b{5,10}c{5}[def]”。图样602包括可以分别被分成字符串节点(例如,“ACME”)、可变计数节点(例如,“a*”)、固定计数和可变计数节点(例如,可转换成“b{5}b{0,5}”的“b{5,10}”)、固定计数节点(例如,c{5})以及字符类(例如,[def])的图样段620、622、624、626和628。
编译器604包括字符串检测模块610、可变计数检测模块612、固定计数检测模块614、固定计数和可变计数检测模块616、以及字符类检测模块618。每个模块610、612、614、616和618接收图样602、或其中对应的图样段620、622、624、626、和628,并基于图样为图形组装模块606组装的编译NFA图形640生成节点630、632、634、636a-b、638。
在另一个实施例中,编译器604对图样602进行元素和元素类型而非单独模块检查以针对每个元素和节点类型进行匹配。
图6B为图6A的图样602产生的编译NFA图形640的图解601。编译NFA图形640以针对字符串“ACME”进行匹配的字符串节点650开始。然后,图形640具有被配置成用于针对元素“a”进行匹配无限次数的下一个可变计数节点652。可变计数节点可以或者是懒惰的、贪婪的、领属的或者全的。基于图样的语法,该节点可以被设置为懒惰的、贪婪的、领属的或全匹配类型。例如,如果元字符后面跟着第二元字符“?”,如图样“*?”、“+?”、“??”或“{n,m}?”,则编译器可以创建匹配类型懒惰可变计数节点。如果元字符后面跟着第二元字符“+”,如图样“*+”、“++”、“?+”和“{n,m}+”,则编译器可以创建匹配类型领属节点。例如,如果元字符后面跟着第二元字符“*”,如图样“**”、“+*”、“?*”、和“{n,m}*”,则编译器可以创建匹配类型全可变计数节点。
例如,考虑有效载荷“abbbbbbb”。针对“ab*”图样,生成贪婪匹配类型可变计数节点。结果是节点消耗整个有效载荷,从而使得结果为“abbbbbbb”。
类似地,针对“ab*+”图样,创建领属匹配类型可变计数节点。领属节点具有与贪婪节点类似的特性,然后,被配置成用于当到达有效载荷末端后不进行回溯。同样,结果为可变计数领属节点此处消耗整个有效载荷并且不进行回溯,从而使得结果为“abbbbbbb”,这刚好与贪婪节点相同。
针对“ab*?”图样,创建懒惰匹配类型可变计数节点。结果为,可变计数节点消耗最短可能匹配,其为“a”。
针对“ab**”图样,创建全匹配类型可变计数节点。结果为,找到全可能匹配,从而使得找到“a”、“ab”、“abb”、“abbb”、“abbbb”、“abbbbb”、“abbbbbb”、和“abbbbbbb”。
在其他实施例中,各种符号可以用于例如通过指定特殊字符为图样的前缀或后缀来指示匹配类型。在其他实施例中,生成图形640的编译器的设置可以设置节点的匹配类型。
然后,图形640具有固定计数节点654a和可变计数节点654b,其基于逻辑上被分成b{5}和“b{0,5}”的“b{5,10}”图样段。固定计数节点654a针对“b”进行匹配五次。可变计数节点654b针对“b”在任何地方进行匹配从零到五次。然后,图形640具有在有效载荷中针对“c”进行匹配五次的固定计数节点656。字符类节点658针对元素[def]进行匹配,其为字符“d”、“e”、或“f”中任一项。
该图形还可以针对作为可变计数节点或固定计数节点的一部分的字符类进行匹配。例如,图样“[xyz]{0,5}”编译成针对字符类[xyz]进行匹配从零到五次的可变计数节点。例如,“xyzzx”是与该图样匹配的有效载荷。
图7为框图700,展示了对图样702进行编译的示例实施例。图样确定模块703对图样702进行匹配项检查。匹配项包括元素和节点类型。如果图样确定模块703找到匹配项,则其将该匹配项作为元素704和节点类型706输出至节点生成模块708。如果图样确定模块703没有找到匹配项,则其指示图样结束,并且图样确定模块703可以消耗另一个图样,或者如果没有更多图样,则完成编译。节点生成模块708生成包括元素704和节点类型706的密集节点710,该元素可以是值/字符/字母、字符类、或字符串,该节点类型可以是值/字符/字母、字符类、可变计数、固定计数、可变计数和固定计数、字符串、或分离节点(用于交替)或用于宣布匹配的标记节点(被用作图形的最终节点)。
图8为流程图800,展示了对图样进行编译的示例实施例。编译以对图样进行匹配项检查而开始,匹配项包括元素和节点类型(802)。然后,该方法确定是否找到匹配项(804)。如果找到了,则该方法生成指示节点类型和元素的节点(806)如果没找到,则该方法结束(808)并可选地对另一个图样进行编译。
图9为流程图900,展示了图形行走引擎对节点进行处理的示例实施例。图形行走引擎从节点提取节点类型和元素(902)。如上所述,该元素可以是值/字符/字母、字符类索引、或字符串值。然后,图形行走引擎确定节点是否需要继续与同一元素进行匹配(904)。图形行走引擎可以例如通过使用索引或计数变量来跟踪其针对可变计数节点或固定计数节点已经匹配的元素的数量。如果节点类型指示继续针对该元素进行匹配,则图形行走引擎使有效载荷段与该元素匹配(906)。然后,图形行走引擎确定该有效载荷段是否该元素匹配(910)。如果匹配,则确定该节点需要继续进行匹配(904)。如果节点类型不指示继续进行匹配,则图形行走引擎针对该节点返回匹配或不匹配(908),并且可用于处理图形中的下一个节点。
如果该有效载荷段与该元素不匹配(910),然而,图形行走引擎返回不匹配(912)。
图10为框图1000,展示了图形行走引擎对NFA图形1002的节点1004a-d进行处理的示例实施例。确定模块1006接收包括节点1004a-d的NFA图形1002。NFA图形1002可以包括任意数量的节点1004a-d。进一步地,在一个实施例中,确定模块1006可以接收单独节点1004a-d。确定模块1006将节点类型1008和元素1010输出至匹配模块1011。基于节点类型1008,匹配模块1011针对元素1010对一个或多个有效载荷段1014进行匹配。匹配模块1011可以接收基于节点类型1008的一个或多个附加段1014,例如,被配置成匹配一个或多个有效载荷段的可变计数节点或固定计数节点。当完成处理后,匹配模块1011输出匹配或不匹配1012。可选地,匹配模块1011可以请求确定模块1006处理NFA图形1002的下一个节点。匹配模块1011可以进一步处理早前或稍后的有效载荷段以及NFA图形的早前或稍后的节点。
图11为流程图1100,展示了使本发明所使用的NFA图形行走的过程。在一个实施例中,执行该过程的元素可以是与关于图2B中所示的框图250描述的元素。
图形行走引擎252包括多个存储器,这些存储器存储用于保存步伐通过图形的其他部分的路径的运行堆栈260和当有效载荷以仅部分匹配完成被处理时用于存储保存缓冲区/堆栈264的保存缓冲区/堆栈264,从而使得当加载同一流的下一个有效载荷时,该引擎可以从保存缓冲区将堆栈条目重新加载到运行堆栈内。在一个实施例中,运行堆栈260或保存缓冲区264可以被保持为片上存储器中的循环缓冲区,并且其可以溢出至外部系统存储器,但可以使用其他堆栈实现方式和存储器类型。并且,当将下一个指令馈送至引擎以处理同一流的后续有效载荷时,主机可以从保存缓冲区将条目拷贝(移动)到运行堆栈(输入缓冲区)内。
运行堆栈260将堆栈条目推送至头指针并从头指针弹出堆栈条目。保存缓冲区/堆栈对其尾指针处的堆栈条目进行排队。因为保存缓冲区/堆栈264对其尾指针处的条目进行排队(例如LILO),其被结构化为一个队列。与处理器耦合的主机为初始运行堆栈提供至少一个填充的条目(例如,从图2的输入缓冲区258输入)。该主机还可以提供初始指令(例如,来自指令队列254)。行走指令包含以下与堆栈相关的信息:(1)运行堆栈头指针;(2)保存堆栈尾指针;(3)运行堆栈条目的数量;以及(4)按照条目数量的运行堆栈和保存堆栈大小。
在本发明的一个示例实施例中,运行堆栈条目包括指示节点类型字段、复制字段、逆向处理字段、有效载荷偏移字段、类型特定数据字段、和地址字段的字段。如果该节点类型为“NOP”(例如,无操作(No-op)),则图形行走引擎丢弃运行堆栈条目并弹出有待处理的下一个运行堆栈条目。如果该节点类型为提取(Fetch),则运行堆栈条目不包含节点信息,并且类型特定数据字段无效。如果该类型为除了“NOP”或Fetch以外的任何类型(例如,固定字符、可变计数、分离节点、字符串节点、字符类、字符、或标记节点),则运行堆栈条目本身包含类型特定数据字段中的节点信息。下表列出了可能的节点类型。
复制字段用于将图形行走引擎在运行时间期间推送的运行堆栈条目与也存在于同一运行堆栈中的初始输入缓冲区条目分开。逆向字段指示是否应在处理当前节点后使有效载荷偏移增量或减量。这允许在正向和逆向上处理有效载荷。偏移字段指示当前节点所处理的有效载荷的位置。如果该节点类型为提取,则地址字段包含起始节点地址。以另外的方式,如果当处理堆栈条目时有效载荷匹配,则地址字段包含有待提取的下一个节点的地址。
将运行堆栈条目推送到运行堆栈260内允许图形行走引擎处理其他NFA节点或NFA图形的另一个分支,同时如果在那个分支中没有找到匹配,则能够返回到运行堆栈260内所记录的节点。
保存缓冲区/堆栈264允许图形行走引擎保存部分匹配,例如,在图形行走引擎到达有效载荷的末端的情况下。当加载同一流的后续有效载荷后,该引擎将堆栈条目从保存缓冲区/堆栈264拷贝到运行堆栈260内。在另一个实施例中,当向图形行走引擎提供下一个指令后,主机装置的主机软件可以将保存堆栈的内容拷贝至输入堆栈。在本实施例中,由于图形行走引擎由主机软件管理,其没有意识到数据包流或该流中的后续数据包。图11展示了实现所述使用运行堆栈和保存堆栈的系统的示例实施例,然而,本领域的普通技术人员可以设想其他实现方式。
该过程以启动图形行走而开始(1102)。然后,该过程确定运行堆栈(例如,运行堆栈260)是否是空的(1104)。如果运行堆栈(例如,运行堆栈260)是空的,则该过程返回(1122)。响应于来自主机的指令253,可以从输入缓冲区258推送运行堆栈(例如,运行堆栈260)条目。如果运行堆栈(例如,运行堆栈260)不是空的(例如,具有至少一个条目),则图形行走引擎(例如,引擎252)弹出运行堆栈(例如,运行堆栈260)以加载下一个堆栈条目(1106)。该运行堆栈(例如,运行堆栈260)是后进先出(LIFO)数据结构,所以从该运行堆栈(例如,运行堆栈260)弹出的条目是最近被推送到该运行堆栈(例如,运行堆栈260)内的条目。
然后,图形行走引擎确定该运行堆栈条目是否存储节点信息(1108)。如果存储,则图形行走引擎从所弹出的运行堆栈条目读取节点信息(1110)。如果没有存储,则图形行走引擎从所弹出的运行堆栈条目所指示的存储器地址提取节点(1112)。
然后,图形行走引擎在结果中设置“终止行走”位(也被称为“完成(done)”位)为假(1114)。然后,图形行走引擎对运行堆栈条目(1118)所指示的节点进行处理,这关于图12进行了更加详细的解释。关于图11,然后,图形行走引擎确定该终止行走位在被处理的节点内是否被赋值为真(TRUE)(1120)。如果没有,则图形行走引擎提取在当前节点的“下一节点地址”字段处所指示的节点(1116)。如果有,则图形行走引擎确定该运行堆栈是否是空的(1104)。
图12为流程图1200,展示了对节点进行处理的示例实施例。流程图1200为图11的对节点进行处理(1118)的扩展。
图形行走引擎开始处理节点(1202)。图形行走引擎确定该图形行走引擎是否为密集节点(1204)。如果其不是密集节点,则该图形行走引擎按照非密集NFA节点(例如,字符节点、分离节点、或标记节点)对该节点进行处理(1214)。然后,该图形行走引擎返回(1224)。
如果该节点为密集图形节点(1204),则图形行走引擎确定该节点是否为字符类节点(1206)。如果是,则图形行走引擎对该字符类节点进行处理(1216)。关于图13,更加详细地描述了处理字符类节点。然后,图形行走引擎返回(1224)。
如果该节点不是字符类节点(1206),则图形行走引擎确定该节点是否为字符串节点(1208)。如果是,则图形行走引擎按照字符串节点对该节点进行处理(1218)。关于图14,更加详细地描述了处理字符串节点。然后,图形行走引擎返回(1224)。
如果该节点不是字符串节点(1208),则图形行走引擎确定该节点是否为固定计数节点(1210)。如果是,则其对该固定计数节点进行处理(1220)。关于图15,进一步详细地描述了处理固定计数节点。然后,图形行走引擎返回(1224)。
关于图12,如果节点不是固定计数节点(1210),则图形行走引擎确定该节点是否为可变计数节点(1211)。如果是,则图形行走引擎按照可变计数节点对该节点进行处理(1222)。关于图16,进一步详细地描述了处理可变计数节点。然后,图形行走引擎返回(1224)。如果图形行走引擎确定该节点为可变计数节点(1211),则其返回错误代码(1226)。
图形行走引擎可以使用对该节点进行处理的其他实施例。例如,图形行走引擎可以通过以不同的顺序检查每种节点类型来确定该节点的类型。
图13为流程图1300,展示了对字符类节点进行处理的示例实施例。关于图22,以上描述了字符类节点的格式。关于图13,流程图1300为图12中所描述的对字符类节点进行处理(1216)的扩展。
图26为表2600,展示了在对字符类节点类型进行处理的上下文中推送的堆栈条目的示例实施例。该堆栈条目包括指示字符类匹配的堆栈条目类型2602、指示字符类索引的元素2606、以及指示图形中的下一节点的下一节点地址2608。该堆栈条目进一步包括复制位2612、指示图形是否要逆向行走的逆向位2614、以及指示下一字节的偏移以在有效载荷中进行处理的偏移位2616。该堆栈条目进一步包括匹配类型2604和计数值2610,这两个都指示它们不适用。字符类堆栈条目仅被排队到保存缓冲区/堆栈内,并且不被推送至运行堆栈,因为没有必要将其推送到运行堆栈内。
关于图13,图形行走引擎开始对字符类节点进行处理(1302)。图形行走引擎从字符类节点(例如,图22的元素2206)加载字符类索引,并使用该字符类索引读取二维矩阵中所存储的位图/遮罩(1304)。然后,图形行走引擎检查有效载荷中是否存在至少又一个字节要处理(1306)。
如果存在至少又一个字节,则图形行走引擎从有效载荷提取下一字节(或其他数据大小)(1308)。图形行走引擎使用有效载荷的字节来访问位图/遮罩的位(或其他数据大小)和确定是否设置该位(1310)。如果设置了该位,则图形行走引擎确定该有效载荷的字节与节点所表示的字符类匹配,并返回(1312)。如果没有设置该位(1310),则图形行走引擎将结果中的终止行走位设置为“真”(1314)并且然后返回(1312)。终止行走位指示当前图形行走没有找到匹配并且指示该引擎应中止当前图形行走线程而不是提取图形的下一个节点。
在其他方面,如果图形行走引擎确定不再有要处理的有效载荷(1306),则图形行走引擎将节点推送至保存缓冲区/堆栈,从而使得可以针对同一流的后续数据包恢复匹配(1316)。然后,图形行走引擎将结果中的终止行走位设置为“真”(1314)并且然后返回(1312)。
图14为流程图1400,展示了图形行走引擎对字符串节点进行处理的示例实施例。如上所述,关于图23,展示了字符串节点的格式和字符串数据。关于图14,流程图1400为关于图12所描述的对字符串节点进行处理(1218)的扩展。
图27为表2700,展示了用于字符串匹配类型的堆栈条目的示例实施例。堆栈条目包括指示字符串匹配的堆栈条目类型2702、指示剩余字符串数据的地址的元素2706、指示图形中的下一节点的下一节点地址2708、以及指示有待处理的字符串的剩余长度的计数值2710。该堆栈条目进一步包括指示运行堆栈中的条目是否为副本的复制位2712、指示图形是否要逆向行走的逆向位2714、以及指示下一字节的偏移以在有效载荷中进行处理的偏移位2716。该堆栈条目进一步包括指示其不适用的匹配类型2704。针对字符串匹配类型,堆栈条目被排队到保存缓冲区/堆栈,因为不需要将它们推送至运行堆栈。
关于图14,图形行走引擎开始对字符串节点进行处理(1402)。图形行走引擎加载字符串数据,其包括来自节点的字符串的长度(例如,图23的字符串节点2330的计数2310),确定有效载荷中可用字节的数量(或其他数据大小),以及确定有效载荷中可用字节的数量是否等于大于字符串的长度(1404)。如果是,则图形行走引擎将“匹配长度”设置为“字符串长度”(1406)。以另外的方式,图形行走引擎将“匹配长度”设置为可用有效载荷段的数量(1404)。“匹配长度”为字符串的有待与有效载荷匹配的字节数量。如果匹配长度小于字符串长度(1404),则匹配长度被设置为可用字节数量,从而使得字符串可以是部分匹配的,并且继续进行与后续数据包的匹配。
设置匹配长度之后,(1404或1406),图形行走引擎从有效载荷中提取多个字节,其中,字节的数量为该匹配长度,并且还提取字符串数据节点(例如,图23的字符串数据2340)(1408)。字符串数据节点包括有待与有效载荷段进行比较的实际字符串元素(例如,图23的字符串数据2340的元素2314)。然后,图形行走引擎将所提取的有效载荷段的数量与相同字符串字节数量进行并行比较(1410)。然后,节点确定有效载荷的“匹配长度”字节是否与所有所提取的字符串字节匹配(1412)。如果不匹配,则图形行走引擎将结果的终止行走位设置为真(1418)并且返回(1420)。如果有效载荷的字节与字符串的字节匹配(1412),则图形行走引擎确定匹配长度是否与字符串长度相同(1414)。
如果匹配长度和字符串长度相同(1414),则图形行走引擎返回(1420)。如果匹配长度和字符串长度不相同(1414),则图形行走引擎将包含字符串的剩余长度的堆栈条目(图27)推送至保存缓冲区/堆栈,从而使得来自同一流的后续有效载荷的剩余“字符串长度”字节可以与“剩余字符串数据”、和以上关于图27中所描述的信息一起匹配(1416),将结果的终止行走位设置为真(1418)并返回(1420)。
图15A和图15B为流程图1500和1501,展示了对固定计数节点进行处理的示例实施例。关于图24,以上描述了固定计数节点的格式。关于图15A-B,流程图1500和1501为关于图12所描述的对固定计数节点进行处理(1220)的扩展。
图28为表2800,展示了固定计数匹配类型的堆栈条目的示例实施例。堆栈条目包括指示固定计数匹配的堆栈条目类型2802、指示字符或字符类索引的元素2806、指示图形中的下一节点的下一节点地址2808、以及指示有待匹配的字节的剩余计数的计数值2810。该堆栈条目进一步包括指示运行堆栈中的节点是否为副本的复制位2812、指示图形是否要逆向行走的逆向位2814、以及指示下一字节的偏移以在有效载荷中进行处理的偏移位2816。该堆栈条目进一步包括指示其不适用的匹配类型2804。针对固定计数匹配类型,堆栈条目被排队到保存缓冲区/堆栈,因为不需要将它们推送至运行堆栈。
关于图15A,图形行走引擎开始对固定计数节点进行处理(1502)。图形行走引擎读取节点中所存储的“计数”(例如,图24的计数值2410)(1504)。节点中所存储的计数表示字符或字符类有待与有效载荷匹配的次数。例如,针对源自部分图样“b{5}”的固定节点,因为字符‘b’要与有效载荷匹配5次,计数为5。
然后,图形行走引擎确定有效载荷中是否有可用的字节“计数”数量(1506)。如果有,则图形行走引擎将匹配长度设置为“计数”(1510)。以另外的方式,图形行走引擎将匹配长度设置为可用有效载荷段的数量(1508)。“匹配长度”为固定计数图样的有待与有效载荷匹配的字节数量。如果匹配长度小于固定计数节点的计数(1508),则匹配长度被设置为可用字节数量,从而使得固定计数节点可以是部分匹配的,并且继续进行与同一流的后续数据包的匹配。设置匹配长度(1508或1510)之后,图形行走引擎从有效载荷提取字节的“匹配长度”数量的字节(1512)。
然后,图形行走引擎例如通过读取图24的元素2406中的数据来确定节点是否为固定计数字符类节点或固定计数字符节点,该数据指示字符类中的字符或索引数量(1514)。如果其为固定计数字符类节点(1514),则图形行走引擎使用从固定字符类节点(例如,图24的元素2406)提取的字符类索引来读取字符类位图/遮罩(1516)。然后,图形行走引擎试图使“匹配长度”数量的有效载荷段与遮罩中的相应条目并行匹配(1518)。以与以上字符类节点的上下文中所述的相同的方式执行字符类节点匹配。如果节点为固定计数字符节点(1514),图形行走引擎将“匹配长度”数量的有效载荷段平行于节点中所存储的该元素(例如,图24的元素2406)进行匹配(1520)。
确定节点是否为固定计数字符类节点或固定计数字符节点(1514)和响应于该确定(分别为1516和1518或1520)之后,参照图15B的流程图1501,图形行走引擎确定有效载荷的“匹配长度”数量的字节是否与该字符或字符类匹配(1522)。如果匹配,则图形行走引擎确定该匹配长度是否与该固定计数节点的计数相同(1524)。如果相同,则图形行走引擎返回(1530)。如果不相同,图形行走引擎将堆栈条目(图28)推送至保存缓冲区/堆栈,从而使得来自同一流的后续有效载荷的剩余“计数”字节与剩余固定计数节点元素(1526)匹配,将结果的终止行走位设置为真(1528)并返回(1530)。
如果有效载荷的“匹配长度”数量的字节与字符类的字符不匹配(1522),则图形行走引擎将结果的终止行走位设置为真(1528)并返回(1530)。
图16为流程图1600,展示了对可变计数节点进行处理的示例实施例。关于图25,以上描述了可变计数节点的格式。关于图16,流程图1600为关于图12所描述的对可变计数节点进行处理(1222)的扩展。
图29为流程图2900,展示了用于可变计数匹配类型的堆栈条目的示例实施例。该堆栈条目包括指示可变计数匹配的堆栈条目类型2902、指示字符或字符类索引的元素2906、指示图形中的下一节点的下一节点地址2908、以及指示有待匹配的字节的剩余计数的计数值2910。该堆栈条目进一步包括指示运行堆栈中的节点是否为副本的复制位2912、指示图形是否要逆向行走的逆向位2914、以及指示下一字节的偏移以在有效载荷中进行处理的偏移位2916。该堆栈条目进一步包括指示节点是否为懒惰、贪婪、领属、或全匹配节点的匹配类型2904。可以将该堆栈条目推送和弹出至运行堆栈,或在用尽有效载荷的情况下,可以将其从运行堆栈拷贝至保存缓冲区/堆栈。
关于图16,图形行走引擎开始对可变计数节点进行处理(1602)。图形行走引擎加载图25的匹配类型2504并确定该节点匹配类型是否为懒惰的(1604)。如果是,则其对该可变计数懒惰节点进行处理(1614),在图17中对此进行了进一步的详细解释。然后,该图形行走引擎返回(1622)。
如果不是,则图形行走引擎确定该节点匹配类型是否为贪婪的(1606)。如果是,则其对该可变计数贪婪节点进行处理(1616),在图18中对此进行了进一步的详细解释。然后,该图形行走引擎返回(1622)。
如果不是,则图形行走引擎确定该节点是否为领属匹配类型(1608)。如果是,则其对该可变计数领属节点进行处理(1618),在图19中对此进行了进一步的详细解释。然后,该图形行走引擎返回(1622)。
如果不是,则图形行走引擎确定该节点匹配类型是否为“全”或“全匹配”节点并按照可变计数全匹配节点对该节点进行处理(1620),图20中对此进行了进一步的详细解释。然后,该图形行走引擎返回(1622)。
图17为流程图1700,展示了对可变计数懒惰节点进行处理的示例实施例。关于图25,以上描述了可变计数节点的格式,并且关于图29,以上描述了可变计数堆栈条目的格式。关于图17,流程图1700为关于图16所描述的对可变计数懒惰节点进行处理(1614)的扩展。
图形行走引擎开始处理可变计数懒惰节点(1702)。图形行走引擎确定该节点是否是从运行堆栈条目读取的(1704)。如果该节点不是从运行堆栈条目读取的,这意味着该节点第一次被处理,则图形行走引擎确定该计数(例如,图25的计数值2510)是否大于零,并且如果大于,则其推送其复制位被设置为“1”(例如,图29的复制位2912)的带有如上解释填充的所有相关信息的运行堆栈条目(图29,2900)(1706)。然后,图形行走引擎返回(1724)。所推送的运行堆栈条目允许图形行走引擎记住其返回路径并继续行走至位于下一节点地址(例如,图25的2508)处的下一节点。如果当行走下一节点路径时找到匹配,则将复制位设置为“1”允许从运行堆栈弹出和丢弃节点。如果没有找到匹配,则当从运行堆栈弹出这些节点时,可以对它们进行处理。
如果该节点是从运行堆栈条目读取的(1704),则图形行走引擎确定有效载荷中是否有有待处理的至少又一个字节(1708)。如果不再有有效载荷的字节(1708),图形行走引擎将带有节点信息的堆栈条目(图29,2900)推送至保存缓冲区/堆栈(1710),将结果的终止行走位设置为“真”(1712)并返回(1724)。将节点推送至保存缓冲区/堆栈(1710)保存了匹配的进度,从而使得当图形行走引擎处理属于同一应用流的后续数据包时,其可以从保存缓冲区/堆栈加载之前的匹配进度并恢复匹配。
如果有效载荷没有用尽(即,如果存在有效载荷的有待处理的至少一个字节)(1708),则图形行走引擎通过检查图29的元素2906来确定可变计数节点是否为字符类节点或字符节点(1714)。如果该可变计数节点为可变计数字符类节点(1714),则其使用可变计数字符类节点中的图29的元素2906中所存储的字符类索引来读取位图/遮罩(1720)。然后,图形行走引擎从有效载荷提取一个字节并通过将来自该有效载荷的字节用作该位图/遮罩的索引来将该字节与该位图/遮罩中的相应条目进行比较(1722)。如果设置了该条目,则图形行走引擎确定匹配。
另一方面,如果该可变计数节点为可变计数字符节点(1714),则图形行走引擎从有效载荷中提取一个字节并将其与图29的该节点中所存储的该元素2906进行匹配(1716)。
确定该节点是否为可变计数字符类节点或可变计数字符节点(1714)并响应于该确定(分别为1720和1722或1716),则图形行走引擎确定该字节是否与该元素匹配(1718)。如果匹配,则图形行走引擎使该计数(例如,图29的计数值2910)减量1(1705),如果该计数大于零则推送设置了复制位(例如,图29的复制位2912)的运行堆栈条目(例如,图29的2900)(1706)并返回(1724)。如果该计数等于零,则不将条目推送至运行堆栈内。以另外的方式,图形行走引擎将结果中的终止行走位设置为“真”(1712)并且返回(1724)。
图18为流程图1800,展示了对可变计数贪婪节点进行处理的示例实施例。关于图25,以上描述了可变计数节点的格式,并且关于图29,以上描述了可变计数堆栈条目的格式。关于图18,流程图1800为关于图16所描述的对可变计数贪婪节点进行处理(1616)的扩展。
图形行走引擎开始处理可变计数贪婪节点(1802)。图形行走引擎确定该节点是否是从运行堆栈条目读取的(1804)。如果是,则图形行走引擎在运行堆栈条目中使该计数(例如,图29的计数值2910)减量1(1806)。然后,如果该计数(例如,图29的计数值2910)大于零,则其将运行堆栈条目与所设置的复制位一起推送至运行堆栈(1808)。然后,该图形行走引擎返回(1818)。
如果没有从运行堆栈读取运行堆栈条目(即,第一次处理该节点)(1804),则图形行走引擎通过检查图25的元素2506来确定该可变计数节点是否为可变计数字符类节点或可变计数字符节点(1810)。如果该可变计数节点为可变计数字符类节点(1810),则其通过读取图25的元素2506来读取与该可变计数字符类节点中所存储的字符类索引相对应的位图/遮罩(1814)。然后,图形行走引擎从有效载荷提取一个字节并通过将来自该有效载荷的字节用作该位图/遮罩的索引来将该字节与该位图/遮罩中的相应条目进行比较,直到存在不匹配或该有效载荷中不再具有可用的字节,或所匹配的字节数量等于该计数值(图25的2510)(1816)。然后,图形行走引擎将有待存储的可用计数(图29的2910)分配在运行堆栈条目中作为可用计数节点所匹配的字节数量(1817)。然后,如果该运行堆栈条目的计数大于零,则图形行走引擎将复制位设置为1的运行堆栈条目(图29的2900)(1808)。如果该运行堆栈条目的计数等于零,则图形行走引擎不推送运行堆栈条目。然后,图形行走引擎返回(1818)。
如果该节点为可变计数字符节点(1810),则图形行走引擎从有效载荷提取字节并将它们与节点元素(图25的2506)所存储的字符进行匹配,直到其失败、用尽有效载荷、或所匹配的字节数量等于该计数(图25的2510))。然后,图形行走引擎将有待存储的计数值(例如,图29的计数值2910)分配在运行堆栈条目中作为可用计数节点所匹配的字节数量(1817)。
图19为流程图1900,展示了对可变计数领属节点进行处理的示例实施例。关于图25,以上描述了可变计数节点的格式,并且关于图29,以上描述了可变计数堆栈条目的格式。关于图19,流程图1900为关于图16所描述的对可变计数领属节点进行处理(1618)的扩展。
关于图19,图形行走引擎开始对可变计数节点进行处理(1902)。图形行走引擎通过检查图25的元素2506来确定该节点是否为可变计数字符类节点或可变计数字符节点(1904)。如果该节点为可变计数字符类节点(1904),则其读取与该可变计数字符类节点元素(图25的2506)中所存储的字符类索引相对应的位图/遮罩。然后,图形行走引擎从有效载荷提取字节并通过将来自该有效载荷的字节用作该位图/遮罩的索引来将它们与该位图/遮罩中的相应条目进行比较,直到存在不匹配,该有效载荷中不再具有可用的字节或所匹配的字节数量等于该计数(图25的2510)。
如果该节点为可变计数字符节点(1904),则图形行走引擎从有效载荷提取一个字节并将其与该节点中所存储的该元素(图25的2506)进行比较,并继续对字节进行匹配,直到存在不匹配、该有效载荷中不再具有可用字节、或所匹配的字节数量等于该计数(图25的2510)(1906)。
将来自有效载荷的字节与字符类或值/字符/字母进行匹配(分别为1916或1906)后,图形行走引擎确定该有效载荷中是否具有剩余的字节(1908)。如果图形行走引擎已经用尽有效载荷(即,没有剩余字节)(1908),则图形行走引擎将该节点推送至保存缓冲区/堆栈(1910),将终止行走位设置为真(1912),并返回(1918)。如果图形行走引擎没有用尽有效载荷(即,有剩余字节)(1908),图形行走引擎返回(1918)。
图20为流程图2000,展示了对可变计数全匹配节点进行处理的示例实施例。关于图25,以上描述了可变计数节点的格式。关于图20,流程图2000为关于图16所描述的对可变计数全匹配节点进行处理(1620)的扩展。
图形行走引擎开始处理可变计数节点(2002)。图形行走引擎确定该节点是否是从运行堆栈条目读取的(2004)。如果该节点不是从运行堆栈读取的(2004),则其推送没有设置(例如,设置为0)复制位(图29,2912)的运行堆栈条目(图29,2900)(2007)。然后,图形行走引擎返回(2020)。
如果该节点是从运行堆栈读取的,(2004),则图形行走引擎确定其是否用尽有效载荷(例如,有效载荷中是否没有剩余字节)(2005)。如果没有,或如果有效载荷中剩余了字节,则图形行走引擎通过检查图29的元素2906来确定该可变计数节点是否为可变计数字符类节点或可变计数字符节点(2006)。
如果该节点为可变计数字符类节点(2006),则图形行走引擎读取与该可变计数字符类节点(2012)中所存储的字符类索引相对应的位图/遮罩。然后,图形行走引擎从有效载荷提取一个字节并通过将来自该有效载荷的字节用作该位图/遮罩的索引来将该字节与该位图/遮罩中的相应条目进行比较(2014)。
如果该节点为可变计数字符节点(2006),则图形行走引擎从有效载荷中提取一个字节并将其与该节点中所存储的值/字符/字母进行匹配(2008)。
将来自有效载荷的字节与字符类或字符进行匹配(分别为2014或2008)后,图形行走引擎确定该字节是否与该字符类或字符匹配(2010)。如果存在匹配(2010),则图形行走引擎使计数(即,图29的计数值2910)减量1(2022)。如果该计数大于零,则图形行走引擎推送没有设置(例如,设置为0)复制位(图29,2912)的运行堆栈条目(图29,2900)(2007)并返回(2020)。如果该计数等于零,则图形行走引擎不推送任何堆栈条目并返回(2020)。如果没有匹配,则图形行走引擎将终止行走位设置为真(2018)并且返回(2020)。
如果图形行走引擎已经用尽有效载荷,或者没有剩余的有效载荷字节(2005),则图形行走引擎将该节点推送至保存缓冲区/堆栈(2016)。然后,图形行走引擎将终止行走位设置为真(2018)并且返回(2020)。
图21为表2100,展示了字符类中所使用的位图/遮罩的示例实施例。表2100示出了字符类索引2102、字符类定义2104、以及ASCII值2106。在实现字符类表的实施例中,存储器可以存储字符类索引2102的值、字符类定义2104、或ASCII值2106;然而,在此示出了它们以展示这些字符类定义如何与字符类矩阵相关和这些索引可以如何访问该字符类矩阵。图21示出了五个字符类定义仅作为一个示例实施例。其他实施例可以包括不同种类的字符类,并且唯一字符类的数量可以是任何数量。
被分配有字符类索引1的[^\n]字符类转换以与除了换行以外的每个字符匹配,因为“^”运算符产生跟在其后面的任何事物的倒数,并且“\n”指示换行。因此,位图/遮罩中的每个位被设置为“1”,除了与换行相对应的ASCII值,其为12。因此,处理具有为12的值的字节的节点访问此字符类矩阵[1][12],其中“1”为字符类索引并且“12”为到字符类的有效载荷的值。由于该表中的此位置处的值为“0”,该有效载荷不匹配。然而,加载到CharacterClassMatrix[1][PayloadByte]中的任何其他有效载荷产生匹配。
被分配有字符类索引2的[a-z]字符类转换以与‘a’至‘z’的范围内的每个字符匹配。因此,在与字符类索引2相对应的位图/遮罩中,来自97至122的值被设置为“1”并且所有其他值被设置为“0”。因此,处理表示ASCII值“c”的有效载荷段的节点访问CharacterClassMatrix[2][99],其中“2”为字符类索引并且“99”为有效载荷的值。由于该表中的此位置处的值为“1”,该有效载荷与该字符类匹配。然而,针对此字符类,97-122范围以外的有效载荷不匹配。例如,如果该有效载荷为数字“4”,则该节点访问CharacterClassMatrix[2][52],其具有为0的值,该值指示不匹配。
被分配有字符类索引3的[^a-z]字符类转换以与除了‘a’至‘z’的范围内的那些以外的每个值/字符/字母匹配。因此,在与字符类索引3相对应的位图/遮罩中,来自97至122的值被设置为“0”并且所有其他值被设置为“1”。因此,处理表示ASCII值“c”的有效载荷段的节点访问CharacterClassMatrix[3][99],其中“3”为字符类索引并且“99”为有效载荷的值。由于该表中的此位置处的值为“0”,该有效载荷不与该字符类匹配。然而,针对此字符类,97-122范围以外的有效载荷是匹配。例如,如果该有效载荷为数字“4”,则该节点访问CharacterClassMatrix[3][52],其具有为1的值,该值指示匹配。
被分配有字符类索引4的[0-9]字符类转换以与‘0’至‘9’的范围内的每个值/字符/字母匹配。因此,在与字符类索引4相对应的位图/遮罩中,来自48至57的值被设置为“1”并且所有其他值被设置为“0”。因此,处理表示ASCII值“D”的有效载荷段的节点访问CharacterClassMatrix[4][68],其中“4”为字符类索引并且“68”为有效载荷的值。由于该表中的此位置处的值为“0”,该有效载荷不与该字符类匹配。然而,针对此字符类,48-57范围以内的有效载荷是匹配。例如,如果该有效载荷为数字“4”,则该节点访问CharacterClassMatrix[4][52],其具有为1的值,该值指示匹配。
被分配有字符类索引5的[ABCabc]字符类转换以与单独值/字符/字母“A”、“B”、“C”、“a”、“b”、和“c”匹配。因此,在与字符类索引5相对应的位图/遮罩中,来自65、66、67、97、98和99的值被设置为“1”并且所有其他值被设置为“0”。因此,处理表示ASCII值“c”的有效载荷段的节点访问CharacterClassMatrix[5][99],其中“5”为字符类索引并且“99”为有效载荷的值。由于该表中的此位置处的值为“1”,该有效载荷与该字符类匹配。然而,针对此字符类,65、66、67、97、98和99的值不匹配。例如,如果该有效载荷为数字“4”,则该节点访问CharacterClassMatrix[5][52],其具有为0的值,该值指示不匹配。
在一个实施例中,该字符类矩阵可以用于任何数据类型或数据长度。在上述实施例中,这些有效载荷为字符,其可以是7位或8位。然而,可以使用任何长度的数据并且其不一定必须以字符为形式。可以使用其他数据编码。此类表的其他应用的示例为视频处理、音频处理、二分搜索、或任何图样搜索应用。
在此引证的全部专利、公开的申请以及参考文献的教导通过引用以其全文进行结合。
尽管本发明已经参照其示例实施例做了具体的展示和说明,本领域技术人员将理解到通过在不偏离由所附的权利要求书涵盖的本发明的范围下可以从中做出在形式和细节上的不同的变化。