本發(fā)明涉及一種正則表達(dá)式匹配領(lǐng)域中的轉(zhuǎn)換方法,尤其是正則表達(dá)式轉(zhuǎn)換為匹配引擎過程中所用到的構(gòu)造有限狀態(tài)機(jī)的算法。
背景技術(shù):
隨著互聯(lián)網(wǎng)流量的快速增長和通過網(wǎng)絡(luò)收集、交換數(shù)據(jù)的擴(kuò)散,大量正則表達(dá)式模式與高帶寬數(shù)據(jù)進(jìn)行匹配使得正則表達(dá)式匹配成為應(yīng)用中的主要瓶頸。網(wǎng)絡(luò)帶寬的日益增長給人們提供便利的同時,也極大的增加了網(wǎng)絡(luò)攻擊的風(fēng)險。正則表達(dá)式匹配是在文本文檔中尋找所有子串的過程,我們一般使用模式(pattern)來描述一個正則表達(dá)式。由于正則表達(dá)式匹配在入侵檢測系統(tǒng)中(nidss)扮演著至關(guān)重要的角色,比如snort,l7-filter等開源的入侵檢測系統(tǒng),里面就大量使用了正則表達(dá)式匹配。同時由于半導(dǎo)體技術(shù)的不斷發(fā)展,fpga已經(jīng)擁有了大規(guī)模并行處理單元,大容量的片上存儲器,因此使用fpga實現(xiàn)正則表達(dá)式匹配的硬件加速成為目前人們研究的熱點之一。同時,提出一個有效的轉(zhuǎn)換算法,從正則表達(dá)式轉(zhuǎn)化有限狀態(tài)機(jī),再到適用于fpga正則表達(dá)式匹配電路顯得越來越重要。
技術(shù)實現(xiàn)要素:
本發(fā)明基于上述問題,提出了一種將正則表達(dá)式轉(zhuǎn)化為有限狀態(tài)機(jī)的新型算法,該算法可以將任意一個基于pcre規(guī)則集的正則表達(dá)式轉(zhuǎn)化為有限狀態(tài)機(jī),然后生成模塊化的適用于fpga的正則表達(dá)式匹配引擎電路。該算法具有效率高,產(chǎn)生的中間節(jié)點少等優(yōu)點,同時生成的電路結(jié)構(gòu)比較簡單,能夠減少fpga上資源的占用。該算法用于正則表達(dá)式匹配電路的實現(xiàn)過程,主要包含以下幾個步驟:
步驟一:給出任意一個基于pcre規(guī)則集的正則表達(dá)式,分析該表達(dá)式中的規(guī)則,將其轉(zhuǎn)化為正則表達(dá)式解析樹的形式;
步驟二:將轉(zhuǎn)換之后的正則表達(dá)式樹狀結(jié)構(gòu)再轉(zhuǎn)化為鏈表(tokenlsit)形式;
步驟三:然后使用新型算法的基本符號構(gòu)造規(guī)則,遍歷分解為鏈表形式的正則表達(dá)式,將它轉(zhuǎn)換為有限狀態(tài)機(jī);
步驟四,通過有限狀態(tài)機(jī),使用正則表達(dá)式中基本符號的電路單元,轉(zhuǎn)換為適用于fpga模塊化引擎電路;
在提出的算法的步驟中,步驟一具體實現(xiàn)方式為:
1)在pcre規(guī)則集內(nèi),用軟件生成包含pcre規(guī)則的任意正則表達(dá)式,此時生成的正則表達(dá)式具有一般性;
2)然后依次分析正則表達(dá)式中包含的逐個規(guī)則,生成對應(yīng)的正則表達(dá)式解析樹形式;在提出的算法的步驟中,步驟二包含的內(nèi)容為:
1)由于步驟一中的正則表達(dá)式解析樹形式字符匹配重復(fù)會產(chǎn)生大量相同的節(jié)點,產(chǎn)生了非必要的深度增加的解析樹,增加了遞歸次數(shù);而且并不完全支持perl語法的擴(kuò)展,因此需要轉(zhuǎn)換為正則表達(dá)式的鏈表形式;
2)轉(zhuǎn)換之后正則表達(dá)式鏈表形式中,每個鏈表節(jié)點包含val,rep,next,child四個部分組成,val部分一般為字符類,括號或者聯(lián)合符號(|),擴(kuò)展了pcre語法特點;rep部分一般為限定重復(fù)次數(shù)和閉合符號(*);next部分為指向鏈表的下一個節(jié)點,正則表達(dá)式中一般使用連接符號(.)或者用聯(lián)合符號(|)連接下一個鏈表節(jié)點;child部分為該正則表達(dá)式鏈表的子鏈表部分。。
步驟三中具體提出的算法步驟能夠處理具體正則語言中的各種符號,包含如下內(nèi)容:
1)算法包含正則表達(dá)式的基本符號的狀態(tài)圖構(gòu)造,例如:連接符號(.)狀態(tài)轉(zhuǎn)換圖,聯(lián)合符號(|)狀態(tài)轉(zhuǎn)換圖,閉合符號(*)狀態(tài)轉(zhuǎn)換圖,以及限定重復(fù)次數(shù)?符號狀態(tài)轉(zhuǎn)換圖,+號狀態(tài)轉(zhuǎn)換圖和{m,n}符號狀態(tài)轉(zhuǎn)換圖;
2)理論上任何一個正則表達(dá)式狀態(tài)轉(zhuǎn)換機(jī)都可以由1)中所描述的基本符號的狀態(tài)圖所構(gòu)成,可以實現(xiàn)模塊化的設(shè)計,通過遍歷正則表達(dá)式鏈表的第一個節(jié)點開始,使用提出的算法處理鏈表節(jié)點信息,構(gòu)造有限狀態(tài)圖,到最后一個節(jié)點結(jié)束,最終生成正則表達(dá)式有限狀態(tài)機(jī);
3)該算法描述的子程序可以處理主要以下四個部分:
一、鏈表中的當(dāng)前節(jié)點的val部分為聯(lián)合符號|(即tcur.val=”|”)時,以及該節(jié)點擁有子正則表達(dá)式,即child部分(tcur.child),那么子正則表達(dá)式的節(jié)點和父節(jié)點通過空字符轉(zhuǎn)換來連接;
二、對具有閉合符號(*)或者限定次數(shù)的符號(+),需要臨時創(chuàng)建一個偽狀態(tài)p來代表反饋環(huán)的源狀態(tài),之后會刪除該偽狀態(tài)p;
三、向具有閉合符號(*)鏈表節(jié)點的輸入空字符狀態(tài)轉(zhuǎn)換直接傳遞給之后的節(jié)點;
四、限定重復(fù)的次數(shù)會被直接轉(zhuǎn)換成為nfa匹配引擎的狀態(tài)。
附圖說明
下面結(jié)合附圖和具體實施方式對本發(fā)明做更進(jìn)一步具體的說明,本發(fā)明上述和其他方面的優(yōu)點將會變得更加清楚。圖中以正則表達(dá)式為a{4}b*(c[ab]?|d)+f為例。
圖1是將給定的正則表達(dá)式轉(zhuǎn)換為左解析樹的形式;
圖2是將解析樹形式的正則表達(dá)式轉(zhuǎn)換為鏈表形式;
圖3是該轉(zhuǎn)換算法中字符和符號圖形化表示的構(gòu)造規(guī)則,(a)表示連接符號,(b)表示聯(lián)合符合,(c)表示正則表達(dá)式中問號的構(gòu)造方法,(d)表示閉包符號,(e)表示正則表達(dá)式中加號的構(gòu)造,(f)表示重復(fù)出現(xiàn)m到n次字符構(gòu)造方法。
圖4是通過提出的轉(zhuǎn)換算法,最終生成的正則表達(dá)式有限狀態(tài)機(jī);
圖5表示該轉(zhuǎn)換算法中一些名詞解釋。
具體實施方式
下面結(jié)合附圖對本發(fā)明的具體實施作詳細(xì)說明,本發(fā)明的核心思路就是通過提出的算法中正則表達(dá)式字符和符號的基本構(gòu)造規(guī)則,以及遍歷鏈表形式的正則表達(dá)式,得到正則表達(dá)式有限狀態(tài)機(jī)。
正則表達(dá)式轉(zhuǎn)換為非確定性的有限狀態(tài)機(jī),所需要的步驟如下:
步驟一:本發(fā)明使用自編寫軟件程序隨機(jī)生成pcre規(guī)則集內(nèi)的一個正則表達(dá)式,此處以正則表達(dá)式a{4}b*(c[ab]?|d)+f為例;
步驟二:分析該正則表達(dá)式,對正則表達(dá)式進(jìn)行處理,得到如圖1所示的正則表達(dá)式解析樹的形式,由于解析樹形式產(chǎn)生了非必要的樹深度增加和遞歸次數(shù)的增加,還需要繼續(xù)進(jìn)行轉(zhuǎn)換;
步驟三:觀察解析樹形式的正則表達(dá)式,如圖2所示,繼續(xù)將它轉(zhuǎn)換為二維鏈表形式,每個鏈表節(jié)點包含val,rep,next,child四個部分組成,該鏈表形式的正則表達(dá)式更緊湊和更容易遍歷;
步驟四:根據(jù)正則表達(dá)式鏈表形式,遍歷鏈表中的各個節(jié)點,將其轉(zhuǎn)化為對應(yīng)的有限狀態(tài)機(jī)。
所述步驟四包含如下的處理步驟,結(jié)合圖5來分析:
(1)遍歷到鏈表中當(dāng)前某個節(jié)點時,如圖5所示,使用tcur表示當(dāng)前節(jié)點,spre表示當(dāng)前節(jié)點所處狀態(tài)的前一個狀態(tài)的所有集合;
(2)判斷當(dāng)前節(jié)點val部分(即tcur.val)是否為符號”|”,若tcur.val==|為真,需要遍歷當(dāng)前節(jié)點的子鏈表(即tcur.child),重復(fù)步驟四中(1)步驟;
(3)如果步驟(2)中tcur.val==|為假,需要輔助判斷當(dāng)前節(jié)點的rep部分(即tcur.rep);
(4)根據(jù)tcur.rep,如果它為*符號或者+符號,此時需要創(chuàng)建一個偽狀態(tài)p(使用create_state(p)),如果當(dāng)前節(jié)點val部分為括號,需要處理當(dāng)前節(jié)點的子鏈表,轉(zhuǎn)到步驟(1),否則如果val部分為字符,創(chuàng)建該字符狀態(tài),然后需要刪除偽狀態(tài)p(使用delete_state(p));
(5)根據(jù)tcur.rep,如果它為{m,n}符號,直接根據(jù)圖3中發(fā)(f)圖構(gòu)造狀態(tài);
(6)遍歷當(dāng)前節(jié)點的下一個節(jié)點(tcur.child),重復(fù)步驟(1)。
步驟四中包含的名詞解釋如圖5所示,本步驟中可由兩個交互遞歸的程序所實現(xiàn),可以編寫程序一來處理鏈表中節(jié)點的整體,實現(xiàn)節(jié)點到有限狀態(tài)圖的轉(zhuǎn)換,它用來處理符號聯(lián)合(|),閉包(*)和限定重復(fù)({m,n});然后編寫程序二,主要用來處理鏈表節(jié)點的val部分,一般是處理字符類或者括號。因此步驟四可以處理正則表達(dá)式鏈表形式中的任意的字符,用來轉(zhuǎn)換任意結(jié)構(gòu)的正則表達(dá)式鏈表形式,最終得到正則表達(dá)式對應(yīng)的有限狀態(tài)機(jī)。在圖5的名詞解釋中有兩個特別重要的概念對構(gòu)造模塊化的正則表達(dá)式電路至關(guān)重要。第一個就是當(dāng)前狀態(tài)的前一個狀態(tài)集合spre,它包含了通過空字符狀態(tài)轉(zhuǎn)換為當(dāng)前狀態(tài)的所有之前狀態(tài)節(jié)點的集,能夠有效的減少有限狀態(tài)機(jī)的中間狀態(tài)。第二個特別的概念就是對包含閉包的節(jié)點來說偽狀態(tài)p的建立,它能夠為閉包符號(*)反饋到源狀態(tài)充當(dāng)臨時的占位符,然后在算法處理過程中,偽狀態(tài)p會被源狀態(tài)集合所取代。鏈表形式的正則表達(dá)式通過該算法遍歷處理之后,利用該算法的對字符和符號基本構(gòu)造規(guī)則,會得到如圖4所示的有限狀態(tài)機(jī)。
步驟五:由算法得到正則表達(dá)式的有限狀態(tài)機(jī)之后,我們就可以生成相應(yīng)用于正則表達(dá)式匹配的電路。
綜上所述,一般的正則表達(dá)式編譯器實現(xiàn)過程中,正則表達(dá)式由鏈表形式轉(zhuǎn)換為有限狀態(tài)機(jī)使用的算法與本發(fā)明使用的算法不同,本算法提出轉(zhuǎn)換方法可以有效的減少有限狀態(tài)機(jī)生成過程中中間節(jié)點狀態(tài)數(shù)量,簡化了生成的正則表達(dá)式電路結(jié)構(gòu),可以快速將正則表達(dá)式轉(zhuǎn)換成電路結(jié)構(gòu),并準(zhǔn)確映射到fpga上。
本發(fā)明提供了一種新型算法來轉(zhuǎn)換正則表達(dá)式到有限狀態(tài)機(jī),具體轉(zhuǎn)換過程可以由很多種方式,本發(fā)明闡述的轉(zhuǎn)換算法只是其中一種優(yōu)選方式。并且上述的實施例是示例性的,不能理解為對本發(fā)明的限制,對于本技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明原理的前提下,可以做出若干的改進(jìn)和潤飾,這些改進(jìn)和潤飾也應(yīng)視為本發(fā)明的保護(hù)范圍。