專利名稱:一種在大流量下進(jìn)行深度包檢測的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種在大流量下進(jìn)行深度包檢測的方法,屬于數(shù)據(jù)通信領(lǐng)域。
技術(shù)背景
在數(shù)據(jù)通信網(wǎng)絡(luò)中,深度包檢測技術(shù)的應(yīng)用很廣泛,經(jīng)常用于數(shù)據(jù)包應(yīng)用類型分析、用戶行為分析,以及入侵檢測、病毒/蠕蟲檢測等方面。
深度包檢測技術(shù)的實現(xiàn)方法分為軟件和硬件兩種。軟件方法利用各種模式匹配算法來進(jìn)行特定關(guān)鍵字的匹配,但軟件進(jìn)行深度包檢測的速度有限,不能保證線速處理。而采用硬件的方法實現(xiàn)深度包檢測,可以在大流量下實現(xiàn)線速處理。
使用硬件進(jìn)行深度包檢測的方法很多,當(dāng)關(guān)鍵字量大,且需要在運(yùn)行時更新時,常采用“現(xiàn)場可編程門陣列”(FPGA)加上“三相式內(nèi)容尋址存儲器”(TCAM)的實現(xiàn)方式,將數(shù)據(jù)包輸入到FPGA的緩存中,然后發(fā)送給TCAM進(jìn)行匹配,TCAM將匹配結(jié)果返回給FPGA繼續(xù)處理。雖然TCAM的運(yùn)算速度非??欤?dāng)前主流的TCAM的查找速度能達(dá)到300M次查找/ 秒。但在大流量網(wǎng)絡(luò)環(huán)境下,例如IOG 40G,該查找速度仍然達(dá)不到每次查找只偏移1個字節(jié)。而在需要查找浮動關(guān)鍵字的場合,由于關(guān)鍵字的起始位置不固定,因此查找過程需要每次僅偏移一個字節(jié)進(jìn)行比對。這時,單純使用TCAM不能滿足系統(tǒng)要求。
另一種常用的規(guī)則匹配方法是使用布隆過濾器(Bloom Filter)進(jìn)行匹配。布隆過濾器是由Burton Bloom在1970年提出,其基本工作方法如下
首先是配置過程生成一個位串,并清0,位串中的每個存儲單元對應(yīng)一個地址。 然后,對需要進(jìn)行匹配的每個關(guān)鍵字都用多個散列(hash)函數(shù)進(jìn)行計算,并把計算結(jié)果作為配置地址,把位串中相應(yīng)的存儲單元置為1。
需要進(jìn)行匹配時,把待匹配內(nèi)容用同樣的多個hash函數(shù)計算,將多個結(jié)果作為位串中的查詢地址與配置地址進(jìn)行匹配。若查詢到的所有結(jié)果不是都為1,說明匹配不成功; 若結(jié)果都為1,說明匹配有可能成功,且成功的概率可以計算得到。但是當(dāng)不匹配的待匹配內(nèi)容的hash運(yùn)算結(jié)果和關(guān)鍵字的hash運(yùn)算結(jié)果相同時,可能會報告匹配成功(假陽性)。發(fā)明內(nèi)容
本發(fā)明針對上述FPGA+TCAM方式實現(xiàn)深度包檢測的過程中,大流量時遇到的問題,提出了一種在大流量下進(jìn)行深度包檢測的方法,充分利用了 FPGA的特點(diǎn),在操作系統(tǒng)的主控單元(由用戶控制)的內(nèi)存中和FPGA中分別設(shè)置不同種類和數(shù)量的布隆計數(shù)器,利用布隆過濾器進(jìn)行初步過濾,使得關(guān)鍵字的增加、刪除、匹配過程方便易行。
本發(fā)明的硬件環(huán)境采用主控單元的內(nèi)存+FPGA+TCAM。在主控單元的內(nèi)存中實現(xiàn)關(guān)鍵字統(tǒng)計,在FPGA內(nèi)部實現(xiàn)布隆過濾器進(jìn)行粗匹配,隨后在TCAM中實現(xiàn)精匹配。
具體技術(shù)方案為
1)在FPGA內(nèi)部搭建3個層次結(jié)構(gòu)的過濾模塊。
a)并行放置L個結(jié)構(gòu)、大小相同的第一層過濾模塊,待匹配內(nèi)容在通過這L個過濾模塊進(jìn)行匹配時依次偏移I個字節(jié),從而使待匹配內(nèi)容在每個時鐘周期內(nèi)都可以偏移L個字節(jié)。L的值由需要進(jìn)行深度包檢測的數(shù)據(jù)流量和FPGA的工作時鐘決定。
b)第一層過濾模塊內(nèi)部并行放置M個第二層過濾模塊,用于匹配多種長度的關(guān)鍵字。M的值由關(guān)鍵字的長度分布情況決定。
c)第二層過濾模塊內(nèi)部并行放置N個第三層過濾模塊,每個第三層過濾模塊由塊狀隨機(jī)存儲器組成基礎(chǔ)布隆過濾器,其中每個布隆過濾器的每個存儲單元所存儲的內(nèi)容是 lbit。N的值由根據(jù)關(guān)鍵字長度采用的hash算法的種類除以2得到。
2)主控單元根據(jù)用戶的添加及刪除操作初始化配置地址。
a)在操作系統(tǒng)的主控單元的內(nèi)存中保存有一個過濾模塊的存儲空間,同樣分為3 個層次,其中第三層是計數(shù)型布隆過濾器,即,在第三層的每個存儲單元中所存儲的內(nèi)容并不是lbit,而是包含多bit的一個整數(shù)。
b)當(dāng)添加關(guān)鍵字時,若關(guān)鍵字長度為m個字節(jié),則在主控單元的存儲空間中找到匹配長度為n個字節(jié)的第二層過濾模塊,n為小于等于m的最大值,對關(guān)鍵字的前n個字節(jié) (n字節(jié)前綴)進(jìn)行hash運(yùn)算,并把運(yùn)算結(jié)果作為初始化地址,查詢N個第三層計數(shù)型布隆過濾器,修改相應(yīng)配置地址內(nèi)的值(通常是加I)。若第三層計數(shù)型布隆過濾器的存儲單元內(nèi)的值發(fā)生變化(如從0變?yōu)榉?),則對應(yīng)更新FPGA內(nèi)L個對應(yīng)的存儲單元的值(如變?yōu)?I)。
c)當(dāng)刪除關(guān)鍵字時,若關(guān)鍵字長度為m,則在主控的存儲空間中找到匹配長度為n 的第二層過濾模塊,n為小于等于m的最大值,對其n字節(jié)前綴進(jìn)行hash運(yùn)算,并把運(yùn)算結(jié)果作為地址,查詢N個第三層計數(shù)型布隆過濾器,修改相應(yīng)地址內(nèi)的值(通常是減I)。若第三層計數(shù)型布隆過濾器的存儲單元內(nèi)的值發(fā)生變化(如從非0變?yōu)?),則對應(yīng)更新FPGA 內(nèi)L個對應(yīng)的存儲單元的值(如變?yōu)?)。
3)進(jìn)行關(guān)鍵字匹配操作。
a)當(dāng)某個待匹配內(nèi)容在FPGA的第三層基礎(chǔ)布隆過濾器內(nèi)的各個hash運(yùn)算查詢存儲單元的值為全部命中(如都為I),說明粗匹配成功。對應(yīng)的第一層過濾模塊所在的偏移位置被記錄下來,存儲進(jìn)FPGA的緩存器中。每個時鐘周期有0 L個粗匹配成功結(jié)果。
b)將與第一層過濾模塊中粗匹配成功的偏移位置對應(yīng)的待匹配內(nèi)容,從數(shù)據(jù)包中重新提取出來,送入TCAM進(jìn)行精匹配。
M值由關(guān)鍵字的長度分布情況決定。若關(guān)鍵字的長度分布范圍較大,則并不需要對每一種關(guān)鍵字長度都提供一個第二層過濾模塊。對于長度介于兩個第二層過濾模塊的存儲空間大小之間的關(guān)鍵字,僅取其字節(jié)前綴進(jìn)行配置。
所述步驟2c)中,每個第三層布隆過濾器對應(yīng)2種hash運(yùn)算的結(jié)果,這利用了 FPGA中雙端口存儲器每個時鐘周期可以進(jìn)行2次查找的特性。
根據(jù)關(guān)鍵字的數(shù)量及長度分布情況,合理設(shè)置L/M/N的值,以及每個第三層布隆過濾器的大小,可以把粗過濾的誤命中率降低到TCAM匹配能力范圍內(nèi)。
本發(fā)明通過兩步匹配的方法,既實現(xiàn)了精確匹配,又減少了 TCAM的壓力。在布隆過濾器的實現(xiàn)過程中,采用了層次化的設(shè)計方法,并充分利用了 FPGA內(nèi)豐富的雙端口隨機(jī)存儲器配置方式靈活的特點(diǎn)。設(shè)計中充分考慮了關(guān)鍵字量大且長度不同的問題,并且該方法能夠方便的進(jìn)行關(guān)鍵字的增加、刪除操作。
圖1為主控單元+FPGA+TCAM進(jìn)行深度包檢測的結(jié)構(gòu);
圖2為粗匹配模塊內(nèi)部結(jié)構(gòu);
圖3為第一層過濾模塊內(nèi)部結(jié)構(gòu);
圖4為第二層過濾模塊的內(nèi)部結(jié)構(gòu);
圖5為第三層基礎(chǔ)布隆過濾器內(nèi)部結(jié)構(gòu);
圖6為主控單元中存儲的計數(shù)型布隆過濾器。
具體實施方式
為讓本發(fā)明的上述特征和優(yōu)點(diǎn)能更明顯易懂,下文特舉實施例,并配合附圖作如下詳細(xì)說明。
本發(fā)明的硬件環(huán)境采用操作系統(tǒng)的主控單元+FPGA+TCAM的結(jié)構(gòu),如圖1所示。主控單元實現(xiàn)關(guān)鍵字統(tǒng)計,根據(jù)用戶的添加/刪除關(guān)鍵字的操作初始化配置地址,數(shù)據(jù)包進(jìn)入FPGA后,輸入到緩存器,然后進(jìn)行粗匹配(布隆過濾器)、精匹配(TCAM匹配),最后經(jīng)過處理后輸出。
首先在FPGA內(nèi)部搭建3個層次結(jié)構(gòu)的過濾模塊。
FPGA內(nèi)粗匹配模塊結(jié)構(gòu)如圖2所示。L個第一層過濾模塊并行排列(L的值由需要進(jìn)行深度包檢測的數(shù)據(jù)流量和FPGA的工作時鐘決定,這里以L = 4為例,但并不以此為限),當(dāng)數(shù)據(jù)輸入到相鄰的兩個第一層過濾模塊時,彼此偏移1個字節(jié),也就是說每個第一層過濾模塊對應(yīng)一個偏移位置。由于內(nèi)部采用流水線操作,第一層過濾模塊每個時鐘周期都可以輸入新的數(shù)據(jù),因此,相當(dāng)于輸入數(shù)據(jù)每個時鐘周期可以偏移4個字節(jié)GB)。因此, 假設(shè)FPGA工作頻率為300MHz時,L = 4可以處理的數(shù)據(jù)流量為300M*4*8bit = 9. 6Gbps。 圖中以關(guān)鍵字粗匹配最長前綴為8進(jìn)行示例,但并不以此為限。
L個第一層過濾模塊的內(nèi)部結(jié)構(gòu)完全相同,其結(jié)構(gòu)如圖3所示。圖中,某個第一層過濾模塊內(nèi)設(shè)置M個第二層過濾模塊,且并行排列(這里以M = 3為例)。3個第二層過濾模塊分別處理不同長度的關(guān)鍵字。這里,我們假設(shè),最小的關(guān)鍵字長度為4B。3個第二層過濾模塊進(jìn)行“或操作”后輸出結(jié)果。
M個第二層過濾模塊的內(nèi)部結(jié)構(gòu)大致相同,但每個第二層過濾模塊包含不同的存儲單元數(shù)。事實上,是根據(jù)存儲空間的大小來設(shè)置包含不同存儲單元數(shù)的第二層過濾模塊結(jié)構(gòu)。圖3的第二層過濾模塊的結(jié)構(gòu)如圖4所示。對于任一第二層過濾模塊,若需要使用的hash算法為2N個,則需要在該第二層過濾模塊中并聯(lián)使用N個第三層過濾模塊(這里以N = 2為例,但不以此為限),由塊狀隨機(jī)存儲器構(gòu)成基礎(chǔ)布隆過濾器。將輸入的數(shù)據(jù)分別按照2N個hash算法進(jìn)行運(yùn)算后,使用基礎(chǔ)布隆過濾器進(jìn)行運(yùn)算結(jié)果的查找?;A(chǔ)布隆過濾器的匹配結(jié)果需要進(jìn)行“與運(yùn)算”后輸出。
基礎(chǔ)布隆過濾器的內(nèi)部結(jié)構(gòu)如圖5所示,由FPGA的塊狀隨機(jī)存儲器組成,配置成寬度為Ibit的模式。利用該存儲器能夠同時進(jìn)行雙端口操作的優(yōu)勢,可以同時進(jìn)行兩個 hash結(jié)果的查找。查找結(jié)果經(jīng)過“與操作”后輸出。其中一個端口可以在進(jìn)行關(guān)鍵字更新時進(jìn)行配置操作。
布隆過濾器可能出現(xiàn)誤匹配的現(xiàn)象,為了減少誤匹配導(dǎo)致的TCAM負(fù)載過重,需要在一定的關(guān)鍵字?jǐn)?shù)量下,盡量利用FPGA內(nèi)的存儲器,加大布隆過濾器的存儲空間。并且,還可以根據(jù)關(guān)鍵字的長度分布,對多個第二層過濾模塊,采用不同大小的存儲空間。
在FPGA內(nèi)部實現(xiàn)布隆過濾,需要一個主控單元作為用戶進(jìn)行添加、刪除關(guān)鍵字的操作接口,因此在FPGA外部通過接口與主控單元連接。而在主控單元的內(nèi)存中,也保存有一個存儲空間,該存儲空間只包括一個第一層過濾模塊,及該層過濾模塊內(nèi)部的第二層和第三層結(jié)構(gòu),如圖6所示。主控單元的內(nèi)存中的第三層過濾模塊,由塊狀隨機(jī)存儲器構(gòu)成計數(shù)型布隆過濾器。在計數(shù)型布隆過濾器中,每個存儲單元存儲的都是包含多bit的一個整數(shù),每次添加操作會使數(shù)據(jù)加1,刪除操作會使數(shù)據(jù)減1,因此計數(shù)型布隆過濾器實際記錄的是對關(guān)鍵字進(jìn)行hash運(yùn)算后得到的相同結(jié)果的重復(fù)次數(shù)。
下面詳細(xì)描述添加、刪除操作的過程
系統(tǒng)初始化過程中進(jìn)行添加關(guān)鍵字操作時,主控單元首先分析該關(guān)鍵字的長度, 由于第二層過濾模塊處理的長度并不覆蓋所有的關(guān)鍵字長度,因此,某些關(guān)鍵字(如本身特別長的,或是超過設(shè)置時定義的最長長度的關(guān)鍵字)需要取其前綴。如圖2中所示的三個第二層過濾模塊,其存儲單元分別為4B、6B、8B,若關(guān)鍵字長度為5B,則需要取其4B前綴, 對應(yīng)1號第二層過濾模塊;若關(guān)鍵字長度為7B,則需要取其6B前綴,對應(yīng)2號第二層過濾模塊;若關(guān)鍵字長度在8B以上(含8B),則需要取其8B前綴,對應(yīng)3號第二層過濾模塊。(第二層過濾模塊的存儲單元可以根據(jù)實際情況自行設(shè)置,并不局限于上述情況。)然后,主控單元使用與FPGA中完全相同的hash運(yùn)算,將結(jié)果作為配置地址,查詢到第三層的計數(shù)型布隆過濾器的相應(yīng)位置,并把該位置的數(shù)據(jù)加1。若N次加1運(yùn)算使得某位置的數(shù)據(jù)由0變?yōu)榉?,則把FPGA中L個第一層過濾模塊對應(yīng)的第三層布隆過濾器中相應(yīng)的配置地址都修改成1 ;若這些運(yùn)算沒有從0到非0的跳變,則不需修改FPGA內(nèi)的存儲值。隨后,主控單元把該關(guān)鍵字添加到TCAM中。
系統(tǒng)初始化過程中進(jìn)行刪除操作時,主控單元同樣要分析該關(guān)鍵字的長度并視情況取其前綴,其步驟與添加操作時一樣,故不再贅述。之后,進(jìn)行與FPGA中完全相同的hash 運(yùn)算,將結(jié)果作為配置地址,查詢到內(nèi)存中的計數(shù)型布隆過濾器的相應(yīng)位置,并把該位置的數(shù)據(jù)減1。若N次減1運(yùn)算使得某位置的數(shù)據(jù)由非0變?yōu)?,則把FPGA中L個第一層過濾模塊對應(yīng)的第三層布隆過濾器中的相應(yīng)的配置地址都修改成0。隨后,主控單元把該關(guān)鍵字從TCAM中刪除。
添加或刪除操作關(guān)鍵字的操作,在匹配過程中也能隨時進(jìn)行,其步驟與系統(tǒng)初始化時一致,故不再贅述。
匹配過程如下
匹配過程中,輸入數(shù)據(jù)按照一字節(jié)的偏移分別送到L個第一層過濾模塊中,如圖2 所示。在每個第一層過濾模塊內(nèi)部,輸入數(shù)據(jù)截取相應(yīng)的字節(jié)前綴,同時送入M個第二層過濾模塊。例如輸入數(shù)據(jù)為“一種新的檢測方法”,則在圖3中即表現(xiàn)為截取“一種”送入1 號第二層過濾模塊(一個漢字占2個字節(jié)長度),同時截取“一種新的”送入2號第二層過濾模塊,以及截取“一種新的檢測”送入3號第二層過濾模塊。(第二層過濾模塊的存儲單元可以根據(jù)實際情況自行設(shè)置,并不局限于上述情況。)
在第二層過濾模塊內(nèi)部,截取的字節(jié)前綴分別進(jìn)行2*N次hash運(yùn)算,并根據(jù)hash結(jié)果查詢第三層的基礎(chǔ)布隆過濾器的配置地址并進(jìn)行匹配。利用FPGA中雙端口存儲器每個時鐘周期可以進(jìn)行2次查找的特性,每個第三層的布隆過濾器對應(yīng)2種hash運(yùn)算的結(jié)果。當(dāng)查詢地址對應(yīng)的配置地址均顯示為1,則表示匹配成功。匹配后,所有的查詢結(jié)果進(jìn)行“與操作”,并在第二層過濾模塊輸出后進(jìn)行“或操作”,只有當(dāng)結(jié)果均為I才表示粗匹配成功。若第一層過濾模塊顯示當(dāng)前粗匹配成功,則其對應(yīng)的偏移位置送入精匹配模塊,從該偏移位置開始的數(shù)據(jù)在精匹配模塊控制下送入TCAM進(jìn)行精匹配。
最后,TCAM將精匹配結(jié)果反饋給FPGA作處理,然后FPGA將最終的匹配結(jié)果輸出。
權(quán)利要求
1.一種在大流量下進(jìn)行深度包檢測的方法,包括在FPGA內(nèi)部搭建3層過濾模塊,并行放置L個第一層過濾模塊;每第一層過濾模塊內(nèi)部并行放置M個第二層過濾模塊;每第二層過濾模塊內(nèi)部并行放置N個第三層過濾模塊,由多個塊狀隨機(jī)存儲器組成基礎(chǔ)布隆過濾器;在主控單元的內(nèi)存中保存一個過濾模塊的存儲空間,構(gòu)建與FPGA對應(yīng)的3層結(jié)構(gòu),其中第三層組成計數(shù)型布隆過濾器;主控單元對關(guān)鍵字取其字節(jié)前綴作運(yùn)算,把運(yùn)算結(jié)果配置為初始化地址,并根據(jù)第三層計數(shù)型布隆過濾器的存儲單元內(nèi)的值的變化更新FPGA內(nèi)L個對應(yīng)的存儲單元的值; 以及檢測過程,步驟包括a)輸入數(shù)據(jù)分別送到L個第一層過濾模塊中,并截取相應(yīng)的字節(jié)前綴,同時送入M個第二層過濾模塊;b)在第二層過濾模塊內(nèi)部,截取的字節(jié)前綴分別進(jìn)行hash運(yùn)算,并根據(jù)結(jié)果查詢第三層的基礎(chǔ)布隆過濾器的配置地址并進(jìn)行匹配;c)根據(jù)待匹配內(nèi)容在FPGA的第三層基礎(chǔ)布隆過濾器內(nèi)的各個運(yùn)算結(jié)果,記錄對應(yīng)的第一層過濾模塊所在的偏移位置,存儲進(jìn)FPGA的緩存器中;d)將被記錄下來的偏移位置對應(yīng)的待匹配內(nèi)容,從數(shù)據(jù)包中重新提取出來,送入TCAM 進(jìn)行精匹配。
2.如權(quán)利要求I所述的方法,其特征在于,所述L個第一層過濾模塊結(jié)構(gòu)、大小相同。
3.如權(quán)利要求I所述的方法,其特征在于,待匹配內(nèi)容輸入所述L個第一層過濾模塊時依次偏移I個字節(jié)。
4.如權(quán)利要求I所述的方法,其特征在于,初始化過程包括對關(guān)鍵字的添加或刪除操作。
5.如權(quán)利要求I所述的方法,其特征在于,L的值由需要進(jìn)行深度包檢測的數(shù)據(jù)流量和 FPGA的工作時鐘決定;M的值由關(guān)鍵字的長度分布情況決定;,N的值由根據(jù)關(guān)鍵字長度采用的hash算法的種類除以2得到。
6.如權(quán)利要求I所述的方法,其特征在于,所述字節(jié)前綴的截取值為存儲空間中小于關(guān)鍵字字節(jié)的最大匹配長度。
7.如權(quán)利要求I所述的方法,其特征在于,每個第二層過濾模塊包含不同的存儲單元數(shù)。
8.如權(quán)利要求I所述的方法,其特征在于,所述第二層過濾模塊進(jìn)行“或操作”后輸出結(jié)果;所述基礎(chǔ)布隆過濾器的匹配結(jié)果需要進(jìn)行“與運(yùn)算”后輸出。
9.如權(quán)利要求I所述的方法,其特征在于,所述第三層過濾模塊同時進(jìn)行雙端口匹配操作,其中一個端口在進(jìn)行關(guān)鍵字更新時進(jìn)行配置操作。
10.如權(quán)利要求I所述的方法,其特征在于,所述主控單元使用與FPGA中完全相同的 hash運(yùn)算。
全文摘要
本發(fā)明提出了一種在大流量下進(jìn)行深度包檢測的方法,針對FPGA+TCAM方式實現(xiàn)深度包檢測的過程中,大流量時遇到的問題,在操作系統(tǒng)的主控單元的內(nèi)存中和FPGA中分別構(gòu)建不同種類和數(shù)量的層次化布隆計數(shù)器,利用布隆過濾器進(jìn)行初步過濾,在主控單元的內(nèi)存中實現(xiàn)關(guān)鍵字統(tǒng)計,在FPGA內(nèi)部實現(xiàn)布隆過濾器進(jìn)行粗匹配,隨后在TCAM中實現(xiàn)精匹配。本發(fā)明通過兩步匹配的方法,既實現(xiàn)了精確匹配,又減少了TCAM的壓力,并充分考慮了關(guān)鍵字量大且長度不同的問題,使得關(guān)鍵字的增加、刪除、匹配過程方便易行。
文檔編號H04L29/06GK102546299SQ20121000478
公開日2012年7月4日 申請日期2012年1月9日 優(yōu)先權(quán)日2012年1月9日
發(fā)明者岳培培 申請人:北京銳安科技有限公司