首页> 中国专利> 基于FPGA+NPU的高速正则表达式匹配混合系统及方法

基于FPGA+NPU的高速正则表达式匹配混合系统及方法

摘要

本发明提出了一种基于FPGA+NPU的高速正则表达式匹配混合系统及方法,该系统主要由现场可编程门阵列FPGA芯片和多核网络处理器NPU组成。在FPGA上实现多个并行的硬件匹配引擎,在NPU上实例化多个软件匹配引擎,硬件引擎和软件引擎以流水的方式工作。同时,利用FPGA片上高速的RAM和片外DDR3 SDRAM存储器构建两级存储架构。第二步、编译正则表达式规则集、生成混合自动机。第三步、对混合自动机的状态表项进行配置。第四步、网络报文处理。该发明大大提升复杂规则集条件下的匹配性能,解决在复杂规则集下性能低的问题。

著录项

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2019-06-18

    授权

    授权

  • 2017-06-23

    实质审查的生效 IPC(主分类):G06F15/167 申请日:20170118

    实质审查的生效

  • 2017-05-31

    公开

    公开

说明书

技术领域

本发明主要支持高速网络中的深度报文检测技术,主要应用于入侵检测系统、协议识别系统中。

背景技术

名词解释

FPGA:(英语:Field Programmable Gate Array,缩写为FPGA),现场可编程门阵列。

NPU:(英语:Network Processing Unit,缩写为NPU),是一种专门应用于网络应用数据包的处理器。

FSM:(英语:finite state automata,缩写为FSM),有限状态自动机。

DFA:(英语:deterministic finite automata,缩写为DFA),确定性有限自动机

NFA:(英语:nondeterministic finite automata,缩写为NFA),非确定性有限自动机。

Hybrid-FA:(英语:hybrid finite automata,缩写为Hybrid-FA),混合自动机。

GPU:(英语:graphics processing unit,缩写为GPU),图形处理器。

TCAM:(ternary content addressable memory,缩写为TCAM),一种三态内容寻址存储器。

SDRAM:(Synchronous Dynamic Random Access Memory,缩写为SDRAM),同步动态随机存储器。

DDR3SDRAM:(Double-Data-Rate Three Synchronous Dynamic Random Access Memory,缩写为DDR3SDRAM),第三代双倍数据率同步动态随机存取存储器,是一种电脑存储器规格。RAM:(random access memory,缩写为RAM),随机存取存储器。

当前的网络应用越来越依赖于对报文负载部分的处理。这些应用从报文负载中识别出相关特征,并用这些特征进行负载均衡、应用层协议识别、流量计费、网络入侵检测等。深度报文检测是特征识别的核心技术。预先给定一个特征(规则)集,深度报文检测用该规则集对报文负载部分逐字节地进行匹配,结束时返回匹配结果,即报文负载匹配上哪个或哪些规则。

在早期的时候,精确的字符串被广泛地用于深度报文检测中的特征描述。传统的算法如AC算法、WM算法及SBOM算法是经典的高效字符串匹配算法。然而随着特征越来越复杂,精确字符串已经无法有效地对特征进行描述。正则表达式以其强大而灵活的特征描述能力,已经广泛地应用于网络应用及设备中。例如,知名的开源入侵检测系统Snort、Bro及应用层协议识别系统L7-filter均已采用正则表达式来描述它们的规则集。在工业上,网络安全设备如思科安全系统、Cavium的匹配引擎、IBM PowerEN processor上的硬件加速器均支持正则表达式。

通常的匹配方法是将正则表达式规则集转换成等价的有限状态自动机(FSM,finite state automata),自动机中的每个状态代表一个匹配的中间过程。匹配引擎每次读取负载的一个字节,查询自动机的状态表,跳转到下一个活跃状态集。若匹配中某个活跃状态对应的给定的某个规则,则说明该负载命中了这条规则。传统上有两种类型的FSM:确定性有限自动机(DFA,deterministic finite automata)和非确定性有限自动机(NFA,nondeterministic finite automata)。NFA的优点是空间开销小,NFA状态数与规则集的数量及规则长度成线性关系。缺点是NFA处理的时间复杂度高,在任意状态NFA可能有多个活跃状态,处理一个字符可能需要多次访问状态表,效率非常低。DFA的优点是任意一个时刻只有一个活跃状态,因此处理一个字符只需要一次访存,时间复杂度固定为O(1)。但是在NFA生成DFA的过程中会引入状态膨胀、甚至状态爆炸,导致空间开销极大,有时甚至无法生成完整的DFA。由于NFA的时间复杂度由其理论模型决定,在不改变系统结构的情况下很难对其进行改进。而DFA匹配逻辑简单,当前研究主要都集中在基于DFA的匹配中。

深度报文检测中的正则表达式匹配目前主要面临两个方面的挑战。第一个挑战来自自动机,随着网络应用的扩展,需要检测的规则数量越来越多,规则也越来越复杂,进而导致DFA的规模越来越大。DFA存储开销可能高于当前网络设备中的存储资源,甚至在很多应用场合下无法生成完整的DFA。第二个挑战来自性能,当前因特网链路速率正以每年40%至50%的速率持续增长,而很多深度报文检测应用如入侵检测系统需要对报文的实时处理,因此对正则表达式匹配提出了线速要求。而深度报文检测本质是对报文负载的逐字节的扫描,本身就是一个复杂度极高的过程,因此需要从体系结构、访存逻辑多方面综合提升匹配性能。

对第一个挑战,研究人员提出了很多压缩方法来降低DFA的存储开销。DFA状态表本质是一个二维的矩阵,矩阵中每一个表项代表一个转移边。Kumar提出的D2FA是最经典的DFA压缩算法,它通过引入默认跳转边来消除不同状态间的相同转移边,大部分DFA压缩算法都是基于D2FA而改进的。D2FA的缺点是没有性能保证,Becchi在其基础上通过限定默认跳转边的方向来保证其性能不低于DFA的1/2。尽管当前压缩算法有很好的性能保证,但是它们都是构建在DFA的基础上,它们无法解决状态爆炸导致DFA无法生成的问题。针对状态爆炸问题,当前学者提出了多种解决方案,如规则分组,半确定自动机(hybrid-FA),基于特征分解的自动机(H-FA、XFA、PaCC)等。基于特征分解的自动机主要停留在理论层面无法实用,而规则分组会导致匹配性能的线速下降。本专利将使用半确定自动机hybrid-FA作为正则匹配的的自动机。

Hybrid-FA是介于NFA和DFA之间的一个非常实用的自动机。在NFA转换成DFA的子集合算法中,hybrid-FA中止了那些容易引起爆炸的NFA状态的确定化,生成了带有一个头部DFA和若干个尾部NFA的自动机。Hybrid-FA很好地对NFA和DFA进行了平衡,通过适度终止确定化,避免了DFA的状态爆炸;其次通过对规则头部确定化生成头部DFA,可以使大部分报文的处理有确定的性能保证,避免了NFA过大的时间开销。

对第二个挑战,在以存储为中心的体系结构下,匹配性能取决于访存性能。对给定的规则集和报文,访存次数是确定的,关键是要提高每次访存的效率。最好的方法是将自动机全部存储在高速存储器上,但是在通用的网络设备中高速存储器容量非常有限,并且远小于自动机的存储需求。因此,如何利用好网络设备中的高速存储器是一个关键问题。另一方面可以从并行的角度入手,通过实例化多个并行引擎来对匹配性能进行线速提升。当前网络设备中并行资源比较多,如FPGA中并行的硬件资源、通过多核处理器、GPU、多核NPU、TCAM等器件都可以提供并行的资源,当前通过挖掘硬件设备并行性来提高性能的研究也集中在这几个方面。但是,单一器件均无法满足正则表达式匹配需求。以硬件逻辑为中心的FPGA通常使用NFA作为自动机,它将NFA状态表编译成硬件逻辑,对多个状态的访问处理都可以在一个时钟周期内完成。但是基于NFA的FPGA硬件并行度的提升是以复制硬件逻辑为代价的,复杂的规则集加上线速的匹配要求会极大地增加硬件开销。无法实时更新是以硬件逻辑为中心的FPGA的另一个天生的缺陷,导致其无法应用于经常需要更新规则集的应用中。通用多核处理器和多核NPU虽然主频比较高,但是通常它们提供的并行度非常有限。GPU和TCAM一般需要非常规整的类似于DFA的自动机才能发挥效能,且它们的存储资源非常有限。

深度报文检测中的正则表达式匹配正面临着日益严峻的挑战。首先,随着网络应用的扩展,深度报文检测中的规则集的数量和复杂度都在急剧提升;其次,网络链路速率也随用户数量及新技术的提升而快速增长。这两方面的趋势都对正则表达式提出了越来越严苛的要求,状态爆炸是不可避免,要满足规则集的扩展就只能摒弃传统的DFA。而当前大部分研究都是基于DFA的压缩技术,且新型自动机的设计在理论和实践上都有诸多困难需要克服。

现有的匹配技术存在的不足:

1.忽略了实践中访存这一核心因素,访存时延是正则表达式匹配的最重要的决定性因素。

2.在实现中过于依赖单一的平台和体系结构,而每个平台都有自身的缺陷导致无法提供满意的解决方案。

3.自动机的设计未能与体系结构的设计充分结合,导致这两个研究方向有脱节。

针对当前研究的不足,我们主要从体系结构设计入手。在自动机的设计上,我们选择目前较为成熟且能解决状态爆炸问题的hybrid-FA。为最大化地提升hybrid-FA,我们设计了以存储为中心的FPGA+NPU的混合体系结构。FPGA部分主要解决hybrid-FA的头部DFA的匹配,NPU主要解决hybird-FA尾部NFA的匹配。FPGA和NPU是流水化处理,报文首先在FPGA部分进行匹配,匹配过程中若有NFA状态激活就将当前状态和剩余的报文传递给NPU,由NPU完成剩余的匹配。通常情况下,NFA状态很少激活,或者激活的位置都在报文比较靠后的位置。因此NPU流水段的任务量相较FPGA部分非常小,要提升整体匹配性能只要保证FPGA部分匹配性能即可。

在FPGA部分的设计中,为提升并行度,我们实例化多个匹配引擎,每个匹配引擎并行工作。为了提升匹配中的访存性能,设计了两级存储的层次化结构来存储hybrid-FA的DFA状态表。其中FPGA上的RAM作为高速存储器,存储DFA中频繁被访问的状态表项,每个硬件引擎对应一个专有的RAM块,硬件引擎之间互不干扰。另外,FPGA中RAM通常是双端口结构,两个读操作可以并行地进行。而匹配操作全是读操作,因此每个将每个RAM块对应两个引擎,使性能翻倍。使用外置的DDR3SDRAM作为外置存储器,存储hybrid-FA的整个状态表项。在NPU部分,为隐藏访存时延,同样实例化尽可能多的匹配引擎。

发明内容

考虑到状态爆炸与匹配性能两方面的要求,采用hybird-FA自动机,设计了一个FPGA+NPU的混合体系结构及方法。通过流水化结构将hybrid-FA的DFA部分处理和NFA部分处理分离。DFA部分任务量大但处理效率高,NFA部分效率低但任务量也少,以此实现两个流水的均衡。FPGA部分采用层次化存储和并行引擎的方式最大化提升流水段的性能,NPU部分实例化尽可能多的引擎来隐藏访存时延。该方案可有效地解决状态爆炸下匹配性能问题,为高速骨干网络安全设备的深度报文检测提供技术手段和工具。

为解决上述技术问题,技术方案包括以下系统和方法:

一、FPGA+NPU的高速正则表达式匹配混合系统结构

本发明的系统结构图如图1所示。核心的系统结构主要包括FPGA和NPU两部分,匹配任务由FPGA上的硬件引擎和NPU上的软件引擎协同完成。硬件引擎由FPGA上硬件逻辑编译而成,功能固定,软件引擎指NPU上的匹配线程。本发明的正则表达式匹配是以存储为中心的,即匹配过程是基于访问自动机状态表来驱动的。DDR3SDRAM作为外置存储器存放hybrid-FA的整个状态表,该状态表被所有的硬件引擎和软件引擎共享。此外对每个硬件引擎,我们还用FPGA上的片上RAM为其开辟专用的bank作为一级缓存,每个bank均存放访问频率最高的前100个DFA状态。FPGA上还有一个任务传送模块,用于将硬件引擎未完成的匹配任务传递给NPU。对应的NPU上有一个任务分配线程,用于将硬件引擎未完成的任务分配给空闲的线程。自动机的编译及配置是在系统的主CPU中完成的,未在图中完整表示。

二、基于FPGA+NPU混合匹配架构的正则表达式匹配方法

图2是本发明的软硬件匹配流程图。匹配流程主要包括硬件引擎和软件引擎两个流水段,对给定报文的匹配中只有访问到边界状态时才会激活相应的软件流水段工作。并且,硬件流水段和软件流水段是松散连接的,并不是一一对应的关系。硬件流水段只需要把未完成的任务交给NPU即可,NPU会将此任务再分配给空闲的软件线程。匹配工作从硬件引擎开始,硬件引擎每次从报文负载中读取一个字符,根据当前DFA状态和该字符更新DFA状态,这个更新的操作可能发生在RAM中,也可能发生在SDRAM中,取决于源DFA状态是否为高频DFA状态。每更新一次状态就需要判断当前状态是否为终止状态,若为终止状态则将终止状态对应的规则ID写入结果缓存区。然后再判断是否为边界状态,如果为边界状态说明NFA状态被激活,此时硬件引擎将当前状态及剩余任务发送给NPU,硬件引擎可以继续处理下一个报文。

软件引擎工作流程如下,首先从NPU的任务分配线程中领取任务。随后每次从负载中读取一个字符,更新DFA状态和NFA状态,NPU的更新操作均需访问外置的DDR3SDRAM。每次DFA状态更新后还要判断其是否为边界状态,若为边界状态,则需要将边界状态对应的NFA状态集加入到当前NFA状态集。同硬件引擎,若更新后的DFA状态或NFA状态中有终止状态的,则需将终止状态对应的规则ID写入到结果缓冲区中。

该方法主要包括以下步骤:

第一步、编译规则集,生成自动机

1.1使用KEN THOMPSON在1968年6月计算机通讯(Communications of the ACM)第11卷发表的论文“正则表达式搜索算法(Regular Expression Search Algorithm)”中提出的正则表达式编译算法将正则表达式模式集编译成一个NFA。

1.2使用Micheal Becchi在2007年ACM CoNEXT会议中的论文“一个适用于深度报文检测的混合自动机(A hybrid finite automaton for practical deep packet inspection)”中提出的算法将NFA编译成混合自动机hybrid-FA。Hybrid-FA的数据结构主要包括DFA、NFA和边界DFA状态与NFA状态对应关系。其中DFA是一个二维数组,数组行代表DFA状态标识,数组列对应256个ASCII字符的输入,数组元素代表在对应的状态和输入下跳转到的下一个状态。NFA状态是以矩阵加链表的形式存储,与DFA区别是每个矩阵元素是一个链表,该链表指向的是下一跳的状态集,而不是单个状态。Hybrid-FA中有一类特殊的DFA状态叫边界状态,每个边界状态映射到若干个NFA状态,当边界状态活跃时,其对应的NFA状态就被激活。

1.3为提升匹配效率对混合自动机的数据结构进一步改进。取每个DFA状态ID前两位作为标识位,第一位代表该DFA状态是否是终止状态,第二位代表该DFA状态是否为边界状态。类似地,取NFA状态ID的第一位来表示该NFA状态是否是终止状态。

第二步、求解hybird-FA中经常被访问的DFA状态,即高频DFA状态

2.1在实践中,对于高频DFA状态的计算我们采用了一种简便高效的方法。首先,生成随机长度和内容的报文100MB。其次,使用编译好的hybrid-FA对随机报文进行匹配。统计匹配过程中每个DFA状态的访问次数,将前100个DFA状态作为选定的高频状态。在具体的应用中,可以直接用实际应用中的报文进行匹配来确定高频DFA状态,效果比随机报文更好。

2.2状态标识重分配。由于高频DFA状态标识号是分散的,为方便高频状态的访问及配置,需将状态的标识ID重新分配。对DFA状态表进行100次遍历,第i次遍历时将访问概率排名第i的表项与当前标识ID为i的状态表项互换,每次互换需要扫描一次DFA状态表项,另外如果涉及到边界状态的标识更换,同时需要更换边界状态与NFA状态的对应关系。

第三步、混合自动机状态表项配置

3.1混合自动机状态表项包括以下几个部分,头部DFA状态表、NFA状态表、边界状态对应的NFA集合表、终止状态对应的规则ID表。其中DFA状态表是优化访存的核心,根据实际DFA状态数适当分配DFA的ID标识的比特位,注意需要留出两个比特位作为终止状态和边界状态的标识。计算100个DFA状态表项的空间需求,按该空间需求将FPGA的片上RAM划分成若干个RAM块,对每个RAM块实例化两个对应的匹配引擎。

3.2Hybrid-FA剩余的状态表项,包括全部的DFA状态表、NFA状态表、边界状态对应的NFA集合表、终止状态对应的规则ID表均配置到外置的DDR3SDRAM中。由于FPGA片上RAM存储的表项是固定配置的,匹配过程中不存在对表项的写或替换操作。另外,每个RAM块是块是专享的,而DDR3SDRAM中的表项是共享的。

第四步、报文匹配处理

报文处理流程主要包括两个步骤,报文接收与报文匹配,报文匹配又分为FPGA部分硬件引擎的匹配和NPU部分的软件引擎匹配,注意只有在NFA状态激活时才需要进行NPU部分的匹配。

报文接收需要设置相应的报文缓存区,设有m个硬件引擎,则需开辟m个报文缓存区,每个引擎对应一个专有的报文缓存区,另外还需要一个结果缓存区来缓存命中的规则。报文缓存区为循环队列,队列宽度设置为2KB,长度可以根据测试结果来确定。每个缓冲区都包括一个头指针和一个尾指针,分别指向下一个待处理的报文和下一个接收报文的位置。

4.1报文接收线程直接从链路上捕获报文,经过如下处理后转存至CPU内在中的报文缓冲区。

4.1.1去掉IP和TCP层报文头信息,只保留报文的负载部分。

4.1.2对报文进行填充处理。设报文内存缓冲区的长度为2KB,实际上报文长度不会超过1560字节,在负载的尾部填充0,使负载长度达到2KB。

4.1.3根据报文缓冲区的空闲情况,将报文分配置空闲率最高的那个报文缓冲区,同时将其当前尾指针加1。若所有缓冲区均满则说明当前已达到性能上限,丢弃该报文并记录报告。

4.1.4转4.1.1。

4.2报文匹配流程(FPGA部分)

4.2.1每个硬件匹配引擎根据其头指针,从对应的报文缓冲区取出宽度为2K的一段报文,将初始状态0设置为DFA的当前状态。

4.2.2读取报文负载的下一个字符。

4.2.3根据DFA当前状态和当前输入字符访问状态表。若当前状态ID小于100,则说明为存放在RAM中的高频状态,根据状态ID和输入字符计算相应地址,并从相应RAM中读取下一跳DFA状态标识作为当前状态。否则,说明当前状态存放在SDRAM中,根据当前状态及输入字符计算相应地址,并从SDRAM中读取下一跳DFA状态标识作为当前状态。

4.2.4判断当前DFA状态是否为终止状态或边界状态。若当前状态标识的第一个比特位为1,说明当前状态为终止状态,根据状态ID从SDRAM的状态规则对应表中读取相应的规则ID,并将规则ID写入到结果缓存区中,跳过当前报文,转至4.2.1。若当前状态标识的第二个比特位为1,说明当前DFA状态为边界状态,硬件引擎将当前DFA状态和报文负载的未处理部分传递给NPU部分,由NPU完成剩余部分的匹配,硬件引擎跳转至4.2.1。

4.2.5若当前字符为报文负载的最后一个字符,说明当前报文匹配完毕,跳转至4.2.1读取下一个报文负载,否则跳转至4.2.2读取下一个字符。

4.3报文匹配流程(NPU部分),NPU部分的软件引擎的匹配与FPGA部分的硬件引擎的匹配是相对独立的流水段,没有一一对应的关系。NPU部分实例化多个软件匹配线程及一个任务分配线程,硬件引擎将匹配任务发送到软件引擎的缓冲区,任务分配线程每次从缓冲区中读取一个任务(即DFA状态和报文负载对),然后根据各匹配线程忙闲情况将该任务分配到相应的匹配线程的任务缓冲区。各匹配线程的工作流程如下:

4.3.1从相应的任务缓冲区读取下一个任务,读取边界DFA状态,并从SDRAM中读取该边界状态对应的活跃NFA状态集,将该DFA状态和NFA状态集作为当前活跃状态集。判断当前NFA状态集中是否有终止状态,若有则从SDRAM中读取该NFA状态对应的规则ID,将该规则ID写入到结果缓冲区中,转4.3.1。否则,转4.3.2。

4.3.2读取负载的下一个字符。

4.3.3对每一个当前活跃的NFA状态,根据输入字符从SDRAM中查找其下一跳NFA状态集,并将其作为新的活跃NFA状态集。

4.3.4根据当前DFA状态和输入字符从SDRAM中查找下一跳DFA状态,并将其作为新的当前DFA状态。根据其标识的第一个比特位判断其是否为终止状态,若为终止状态则根据DFA状态标识从SDRAM中读取其对应的规则ID,并将规则ID写入结果缓冲区中,跳过当前报文,转4.3.1。根据DFA状态标识的第二位判断其是否为边界状态,若为边界状态,则从SDRAM中读取对应的NFA状态集,并将该NFA状态集加入到4.3.3的活跃NFA状态集。

4.3.5根据状态标识的第一比特位判断当前NFA状态集中是否有终止状态,若有终止状态则根据标识从SDRAM中读取对应的规则ID,并将规则ID写入结果缓冲区中,跳过当前报文,转4.3.1。否则,转4.3.2。

综合起来,本发明可达到以下效果:

1.采用hybrid-FA应对规则数量和复杂度提升带来的状态爆炸问题。

2.使用FPGA+NPU的混合体系结构将hybird-FA中的高效的DFA匹配和低效的NFA匹配分离并且流水。自动机本身的特征保证FPGA部分的硬件引擎处理大部分负载,NPU部分处理极小一部分负载。因为FPGA和NPU是流水处理的,并且NPU任务量较小,只要保证FPGA部分的性能即可。

3.FPGA部分依据DFA状态访问规律设置片上RAM加片外SDRAM的方式构建两级存储器,DFA访问特点保证绝大部分访存可以在片上RAM完成,因此可极大地提高访存性能。另外,借助RAM双端口实例化2倍的匹配引擎,大大提高并行度。

附图说明

图1是本发明的系统结构图。

图2是本发明的软硬件匹配流程图。

具体实施方式

第一步编译规则集,生成自动机

1.1使用KEN THOMPSON在1968年6月计算机通讯(Communications of the ACM)第11卷发表的论文“正则表达式搜索算法(Regular Expression Search Algorithm)”中提出的正则表达式编译算法将正则表达式模式集编译成一个NFA。

1.2使用Micheal Becchi在2007年ACM CoNEXT会议中的论文“一个适用于深度报文检测的混合自动机(A hybrid finite automaton for practical deep packet inspection)”中提出的算法将NFA编译成混合自动机hybrid-FA。Hybrid-FA的数据结构主要包括DFA、NFA和边界DFA状态与NFA状态对应关系。其中DFA是一个二维数组,数组行代表DFA状态标识,数组列对应256个ASCII字符的输入,数组元素代表在对应的状态和输入下跳转到的下一个状态。NFA状态是以矩阵加链表的形式存储,与DFA区别是每个矩阵元素是一个链表,该链表指向的是下一跳的状态集,而不是单个状态。Hybrid-FA中有一类特殊的DFA状态叫边界状态,每个边界状态映射到若干个NFA状态,当边界状态活跃时,其对应的NFA状态就被激活。

1.3为提升匹配效率对混合自动机的数据结构进一步改进。取每个DFA状态ID前两位作为标识位,第一位代表该DFA状态是否是终止状态,第二位代表该DFA状态是否为边界状态。类似地,取NFA状态ID的第一位来表示该NFA状态是否是终止状态。

第二步求解hybird-FA中经常被访问的DFA状态,即高频DFA状态

2.1在实践中,对于高频DFA状态的计算我们采用了一种简便高效的方法。首先,生成随机长度和内容的报文100MB。其次,使用编译好的hybrid-FA对随机报文进行匹配。统计匹配过程中每个DFA状态的访问次数,将前100个DFA状态作为选定的高频状态。在具体的应用中,可以直接用实际应用中的报文进行匹配来确定高频DFA状态,效果比随机报文更好。

2.2状态标识重分配。由于高频DFA状态标识号是分散的,为方便高频状态的访问及配置,需将状态的标识ID重新分配。对DFA状态表进行100次遍历,第i次遍历时将访问概率排名第i的表项与当前标识ID为i的状态表项互换,每次互换需要扫描一次DFA状态表项,另外如果涉及到边界状态的标识更换,同时需要更换边界状态与NFA状态的对应关系。

第三步混合自动机状态表项配置

3.1混合自动机状态表项包括以下几个部分,头部DFA状态表、NFA状态表、边界状态对应的NFA集合表、终止状态对应的规则ID表。其中DFA状态表是优化访存的核心,根据实际DFA状态数适当分配DFA的ID标识的比特位,注意需要留出两个比特位作为终止状态和边界状态的标识。计算100个DFA状态表项的空间需求,按该空间需求将FPGA的片上RAM划分成若干个RAM块,对每个RAM块实例化两个对应的匹配引擎。

3.2Hybrid-FA剩余的状态表项,包括全部的DFA状态表、NFA状态表、边界状态对应的NFA集合表、终止状态对应的规则ID表均配置到外置的DDR3SDRAM中。由于FPGA片上RAM存储的表项是固定配置的,匹配过程中不存在对表项的写或替换操作。另外,每个RAM块是块是专享的,而DDR3SDRAM中的表项是共享的。

第四步报文匹配处理

报文处理流程主要包括两个步骤,报文接收与报文匹配,报文匹配又分为FPGA部分硬件引擎的匹配和NPU部分的软件引擎匹配,注意只有在NFA状态激活时才需要进行NPU部分的匹配。

报文接收需要设置相应的报文缓存区,设有m个硬件引擎,则需开辟m个报文缓存区,每个引擎对应一个专有的报文缓存区,另外还需要一个结果缓存区来缓存命中的规则。报文缓存区为循环队列,队列宽度设置为2KB,长度可以根据测试结果来确定。每个缓冲区都包括一个头指针和一个尾指针,分别指向下一个待处理的报文和下一个接收报文的位置。

4.1报文接收线程直接从链路上捕获报文,经过如下处理后转存至CPU内在中的报文缓冲区。

4.1.1去掉IP和TCP层报文头信息,只保留报文的负载部分。

4.1.2对报文进行填充处理。设报文内存缓冲区的长度为2KB,实际上报文长度不会超过1560字节,在负载的尾部填充0,使负载长度达到2KB。

4.1.3根据报文缓冲区的空闲情况,将报文分配置空闲率最高的那个报文缓冲区,同时将其当前尾指针加1。若所有缓冲区均满则说明当前已达到性能上限,丢弃该报文并记录报告。

4.1.4转4.1.1。

4.2报文匹配流程(FPGA部分)

4.2.1每个硬件匹配引擎根据其头指针,从对应的报文缓冲区取出宽度为2K的一段报文,将初始状态0设置为DFA的当前状态。

4.2.2读取报文负载的下一个字符。

4.2.3根据DFA当前状态和当前输入字符访问状态表。若当前状态ID小于100,则说明为存放在RAM中的高频状态,根据状态ID和输入字符计算相应地址,并从相应RAM中读取下一跳DFA状态标识作为当前状态。否则,说明当前状态存放在SDRAM中,根据当前状态及输入字符计算相应地址,并从SDRAM中读取下一跳DFA状态标识作为当前状态。

4.2.4判断当前DFA状态是否为终止状态或边界状态。若当前状态标识的第一个比特位为1,说明当前状态为终止状态,根据状态ID从SDRAM的状态规则对应表中读取相应的规则ID,并将规则ID写入到结果缓存区中,跳过当前报文,转至4.2.1。若当前状态标识的第二个比特位为1,说明当前DFA状态为边界状态,硬件引擎将当前DFA状态和报文负载的未处理部分传递给NPU部分,由NPU完成剩余部分的匹配,硬件引擎跳转至4.2.1。

4.2.5若当前字符为报文负载的最后一个字符,说明当前报文匹配完毕,跳转至4.2.1读取下一个报文负载,否则跳转至4.2.2读取下一个字符。

4.3报文匹配流程(NPU部分),NPU部分的软件引擎的匹配与FPGA部分的硬件引擎的匹配是相对独立的流水段,没有一一对应的关系。NPU部分实例化多个软件匹配线程及一个任务分配线程,硬件引擎将匹配任务发送到软件引擎的缓冲区,任务分配线程每次从缓冲区中读取一个任务(即DFA状态和报文负载对),然后根据各匹配线程忙闲情况将该任务分配到相应的匹配线程的任务缓冲区。各匹配线程的工作流程如下:

4.3.1从相应的任务缓冲区读取下一个任务,读取边界DFA状态,并从SDRAM中读取该边界状态对应的活跃NFA状态集,将该DFA状态和NFA状态集作为当前活跃状态集。判断当前NFA状态集中是否有终止状态,若有则从SDRAM中读取该NFA状态对应的规则ID,将该规则ID写入到结果缓冲区中,转4.3.1。否则,转4.3.2。

4.3.2读取负载的下一个字符。

4.3.3对每一个当前活跃的NFA状态,根据输入字符从SDRAM中查找其下一跳NFA状态集,并将其作为新的活跃NFA状态集。

4.3.4根据当前DFA状态和输入字符从SDRAM中查找下一跳DFA状态,并将其作为新的当前DFA状态。根据其标识的第一个比特位判断其是否为终止状态,若为终止状态则根据DFA状态标识从SDRAM中读取其对应的规则ID,并将规则ID写入结果缓冲区中,跳过当前报文,转4.3.1。根据DFA状态标识的第二位判断其是否为边界状态,若为边界状态,则从SDRAM中读取对应的NFA状态集,并将该NFA状态集加入到4.3.3的活跃NFA状态集。

4.3.5根据状态标识的第一比特位判断当前NFA状态集中是否有终止状态,若有终止状态则根据标识从SDRAM中读取对应的规则ID,并将规则ID写入结果缓冲区中,跳过当前报文,转4.3.1。否则,转4.3.2。

采用主流FPGA芯片和NPU芯片,在通用规则集L7、Snort下可达到20~30Gbps的正则表达式匹配性能,而当前在复杂规则集下的单一体系结构中,匹配性能均不超过10Gbps。相较于当前正则表达式匹配结构和方法,本发明可以将性能提升两倍以上。本发明首次提出正则表达式匹配的混合架构,在状态爆炸的前提下提供高速的匹配性能,目前尚无其它基于FPGA+NPU混合架构的正则表达式匹配技术的研究成果。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号