專利名稱::帶狀態(tài)的分組內(nèi)容匹配機(jī)制的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明一般涉及網(wǎng)絡(luò)設(shè)備,尤其涉及但不是只涉及跨分組邊界執(zhí)行分組內(nèi)容檢查。背景信息企業(yè)網(wǎng)絡(luò)時(shí)時(shí)受到各種安全問(wèn)題的威脅。這些威脅可以是內(nèi)部或外部的。內(nèi)部威脅涉及情緒不滿的雇員的試圖闖入、由雇員釋放出的病毒或蠕蟲(chóng)或者只是雇員進(jìn)行被企業(yè)安全策略視為不可接受的網(wǎng)絡(luò)訪問(wèn)。外部威脅涉及對(duì)企業(yè)網(wǎng)絡(luò)的專門攻擊以試圖盜竊知識(shí)產(chǎn)權(quán)、拒絕服務(wù)攻擊、未授權(quán)的侵入、病毒或蠕蟲(chóng)等。在所有這些情況中,分組防火墻是網(wǎng)絡(luò)管理員的主要防御形式。分組防火墻與網(wǎng)絡(luò)通信串聯(lián),截取傳入的分組,并且依照一組防火墻規(guī)則來(lái)驗(yàn)證每個(gè)分組以接受、拒絕或可選地將該分組記入日志。除分組過(guò)濾之外,網(wǎng)絡(luò)管理員有時(shí)還使用分組過(guò)濾器來(lái)強(qiáng)制實(shí)施信息量管理策略。這些策略在限制或管理攻擊行為中是有用的。由于分組防火墻與所有網(wǎng)絡(luò)通信串聯(lián)并對(duì)其進(jìn)行檢査的這個(gè)事實(shí),重要的在于防火墻應(yīng)當(dāng)能夠提供足夠的網(wǎng)絡(luò)吞吐量來(lái)跟上網(wǎng)絡(luò)通信量需求。在目前的企業(yè)網(wǎng)絡(luò)中,防火墻規(guī)則通常限于2500條思科(Cisco)ACL(訪問(wèn)控制列表)規(guī)則。這些規(guī)則相當(dāng)明確,并且被設(shè)計(jì)成允許或拒絕特定活動(dòng)或主機(jī)。由于性能或可管理的原因,ACL規(guī)則限于這些數(shù)量。規(guī)則的數(shù)量直接影響路由器性能,因此這些規(guī)則被保持在較低的數(shù)量。此外,較大數(shù)量的規(guī)則還使得規(guī)則管理更易于出錯(cuò)并且難以驗(yàn)證或更改。在較大的組織中,規(guī)則被分布在各種站點(diǎn)的防火墻上,并且按需進(jìn)行修改,從而增加了出錯(cuò)的機(jī)會(huì)。出于這些原因,規(guī)則的數(shù)量必須保持在可管理的水平。在典型高級(jí)防火墻的實(shí)現(xiàn)中,使用了兩種級(jí)別的過(guò)濾。在第一級(jí)別,基于適用ACL規(guī)則來(lái)執(zhí)行過(guò)濾。在此示例中,基于分組報(bào)頭信息來(lái)標(biāo)識(shí)對(duì)應(yīng)于ACL數(shù)據(jù)庫(kù)的最高優(yōu)先級(jí)規(guī)則。例如,可基于與源和目的地地址、源和目的地端口以及使用眾所周知的分類算法的協(xié)議的值相對(duì)應(yīng)的五元組輸入來(lái)標(biāo)識(shí)規(guī)則。因?yàn)樵S多攻擊(特別是對(duì)服務(wù)拒絕攻擊)將源自使用特定端口的公知源地址,所以與這些攻擊相對(duì)應(yīng)的分組可被容易地標(biāo)識(shí),并且適當(dāng)?shù)囊?guī)則(例如,丟棄分組)可用于實(shí)施期望防火墻策略。這種第一級(jí)別的過(guò)濾可使用現(xiàn)代網(wǎng)絡(luò)設(shè)備以線路速率(line-rate)速度實(shí)現(xiàn)。在某些實(shí)現(xiàn)中,專用組件或單獨(dú)計(jì)算機(jī)可用于執(zhí)行這些過(guò)濾操作。第二級(jí)別的過(guò)濾與分組檢査相關(guān)。在此情況中,對(duì)實(shí)際分組有效負(fù)載搜索一個(gè)或一組特定串。例如,防火墻應(yīng)用程序可能需要搜索表示存在于分組中的病毒或因特網(wǎng)蠕蟲(chóng)的某些串。另外,諸如出于負(fù)載平衡或記賬的目的,其它非安全應(yīng)用程序可能類似地需要窺視分組有效負(fù)載。稱為"內(nèi)容檢査"或"(深度)分組檢査"的這些操作涉及檢査分組有效負(fù)載中的候選模式,并基于存在或不存在這些模式而采取動(dòng)作。在某些防火墻實(shí)現(xiàn)中,分組/內(nèi)容檢査被轉(zhuǎn)移到不支持線路速率速度的單獨(dú)應(yīng)用程序或子系統(tǒng)。例如,這些操作可通過(guò)單獨(dú)計(jì)算機(jī)主機(jī)或耦合到網(wǎng)絡(luò)設(shè)備或由網(wǎng)絡(luò)設(shè)備提供的嵌入式通用處理器來(lái)執(zhí)行。因?yàn)檫@些操作并不在線路速率下執(zhí)行(因而不限于相應(yīng)的處理等待時(shí)間),所以它們可使用較大但較慢、較便宜的存儲(chǔ)器(例如,DRAM(動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器)),并且使用常規(guī)的串搜索技術(shù)。網(wǎng)絡(luò)處理器(也稱為網(wǎng)絡(luò)處理器單元(NPU))由于其成本效率、處理速度、靈活性和可升級(jí)能力而被日益增長(zhǎng)地用在各種網(wǎng)絡(luò)設(shè)備中。在構(gòu)建下一代網(wǎng)絡(luò)平臺(tái)時(shí),期望在無(wú)需添加專用防火墻組件的情況下添加穩(wěn)定的防火墻功能、而不是使用網(wǎng)絡(luò)處理器技術(shù)并以可重復(fù)使用、可升級(jí)方式向NPU代碼添加防火墻功能。內(nèi)容/分組檢查中的一個(gè)關(guān)鍵的難題涉及對(duì)橫跨多個(gè)分組的各種模式進(jìn)行掃描。在使用專用防火墻資源(例如,在單獨(dú)組件或系統(tǒng)上運(yùn)行的內(nèi)容檢査應(yīng)用程序)的常規(guī)方法中,此問(wèn)題通過(guò)簡(jiǎn)單地對(duì)分組流進(jìn)行緩沖來(lái)解決。多個(gè)分組的有效負(fù)載內(nèi)容被組裝到單個(gè)緩沖器(因而消除了分組邊界)以形成要被傳送的數(shù)據(jù)流的副本,并且采用適當(dāng)?shù)哪J狡ヅ渌惴ㄒ話呙杈彌_器中的數(shù)據(jù)來(lái)尋找匹配。雖然這種技術(shù)不要求對(duì)常規(guī)模式匹配算法進(jìn)行更改,但是它強(qiáng)加了相當(dāng)?shù)拇鎯?chǔ)要求。此外,雖然在具有較小數(shù)量的流的系統(tǒng)中實(shí)現(xiàn)此機(jī)制相對(duì)簡(jiǎn)單,但是對(duì)于需要同時(shí)支持較大數(shù)量的流的系統(tǒng),無(wú)法良好地作適應(yīng)性的縮放。此外,這種技術(shù)不適于與網(wǎng)絡(luò)處理器一起使用,而且當(dāng)需要支持同時(shí)存在的較大數(shù)量的流時(shí),無(wú)法在線路速率下執(zhí)行。附圖簡(jiǎn)述通過(guò)在結(jié)合附圖時(shí)參考以下詳細(xì)描述,本發(fā)明的前述方面和附帶優(yōu)點(diǎn)將得更易于理解以及進(jìn)行更好地了解,其中類似附圖標(biāo)記指所有各個(gè)視圖中的類似部分,除非另外指明圖1是示出了用于經(jīng)由使用上下文管線的多個(gè)計(jì)算引擎來(lái)處理多個(gè)功能的技術(shù)的示意圖2是示出了用于實(shí)現(xiàn)本文所述發(fā)明的諸實(shí)施例的各方面的軟件框架構(gòu)的示意圖3是示出了由一個(gè)實(shí)施例執(zhí)行以確定是否要對(duì)一個(gè)分組執(zhí)行內(nèi)容檢查的操作和邏輯的流程圖4a示出了分組中用于流分類的各個(gè)部分;圖4b示出了一組分類規(guī)則和相關(guān)聯(lián)的流;圖5示出了使用主散列表和次散列表的散列表查找方案的一個(gè)實(shí)施例;圖6是示出了在進(jìn)行預(yù)處理操作以生成模式數(shù)據(jù)結(jié)構(gòu)期間執(zhí)行的操作和邏輯的流程圖7是示出了由網(wǎng)絡(luò)線路卡使用的數(shù)據(jù)流和功能塊的示意圖,該線路卡包括具有用于執(zhí)行指令線程以執(zhí)行包括內(nèi)容檢查的分組處理操作的多個(gè)計(jì)算引擎的NPU;圖8a是示出了在對(duì)一個(gè)流中的第一個(gè)分組進(jìn)行內(nèi)容檢査期間執(zhí)行的操作和邏輯的流程圖8b是示出了在對(duì)一個(gè)流中除第一個(gè)分組之外的其它分組進(jìn)行內(nèi)容檢查期間執(zhí)行的操作和邏輯的流程圖9是示出了使用偏移量和深度搜索信息的內(nèi)容檢查操作的流程圖IO示出了與示例性AC狀態(tài)機(jī)數(shù)據(jù)結(jié)構(gòu)相對(duì)應(yīng)的跳轉(zhuǎn)(goto)函數(shù)、失敗函數(shù)和輸出函數(shù);圖11示出了要存儲(chǔ)在存儲(chǔ)器中的模式數(shù)據(jù)結(jié)構(gòu)的一個(gè)實(shí)施例;圖12示出了AC狀態(tài)機(jī)節(jié)點(diǎn)存儲(chǔ)器數(shù)據(jù)結(jié)構(gòu)的一個(gè)實(shí)施例;圖13示出了AC狀態(tài)機(jī)索引存儲(chǔ)器數(shù)據(jù)結(jié)構(gòu)的一個(gè)實(shí)施例;圖14示出了要存儲(chǔ)在存儲(chǔ)器中的DAWG數(shù)據(jù)結(jié)構(gòu)的一個(gè)實(shí)施例;圖15示出了后綴樹(shù)存儲(chǔ)器數(shù)據(jù)結(jié)構(gòu)的一個(gè)實(shí)施例;圖16示出了SHIFT(移位)表存儲(chǔ)器數(shù)據(jù)結(jié)構(gòu)的一個(gè)實(shí)施例;圖17示出了HASH(散列)表存儲(chǔ)器數(shù)據(jù)結(jié)構(gòu)的一個(gè)實(shí)施例;圖18示出了PREFIX(前綴)表存儲(chǔ)器數(shù)據(jù)結(jié)構(gòu)的一個(gè)實(shí)施例;200680024231.X說(shuō)明書(shū)第4/41頁(yè)圖19示出了根節(jié)點(diǎn)存儲(chǔ)器數(shù)據(jù)結(jié)構(gòu)的一個(gè)實(shí)施例;圖20示出了子節(jié)點(diǎn)存儲(chǔ)器數(shù)據(jù)結(jié)構(gòu)的一個(gè)實(shí)施例;以及圖21示出了條件-動(dòng)作規(guī)則存儲(chǔ)器數(shù)據(jù)結(jié)構(gòu)的一個(gè)實(shí)施例。詳細(xì)描述本文描述了用于跨分組邊界執(zhí)行串搜索的方法和裝置的實(shí)施例。在以下描述中,闡述了許多具體細(xì)節(jié)來(lái)提供對(duì)本發(fā)明的實(shí)施例的透徹的理解。然而,相關(guān)領(lǐng)域技術(shù)人員應(yīng)當(dāng)認(rèn)識(shí)到,在不具備具體細(xì)節(jié)的一個(gè)或多個(gè)、或者使用其它方法、組件、材料等的情況下,可實(shí)踐本發(fā)明。在其它示例中,未示出或未詳細(xì)描述眾所周知的結(jié)構(gòu)、材料或操作以避免淡化本發(fā)明的各個(gè)方面。本文中對(duì)"一個(gè)實(shí)施例"或"實(shí)施例"的引用表示結(jié)合該實(shí)施例描述的具體特征、結(jié)構(gòu)或特性被包括在本發(fā)明的至少一個(gè)實(shí)施例中。因而,在整個(gè)說(shuō)明書(shū)的各個(gè)位置的短語(yǔ)"在一個(gè)實(shí)施例中"或"在實(shí)施例中"的出現(xiàn)并非都指同一實(shí)施例。此外,具體特征、結(jié)構(gòu)或特性能以任意方法結(jié)合在一個(gè)或多個(gè)實(shí)施例中。根據(jù)本文所述的實(shí)施例的各個(gè)方面,公開(kāi)了易于跨分組邊界的內(nèi)容檢查同時(shí)保持線路速率速度并提供可縮放解決方案的機(jī)制。這些機(jī)制采用基于狀態(tài)的內(nèi)容檢査算法,該算法允許內(nèi)容檢查在分組邊界停止或重啟,同時(shí)保持與部分串搜索的結(jié)果相關(guān)的信息。同時(shí),這些機(jī)制可使用最小緩沖來(lái)實(shí)現(xiàn),同時(shí)支持使用NPU的線路速率速度。為了更好地理解和了解對(duì)現(xiàn)代網(wǎng)絡(luò)處理器實(shí)現(xiàn)的機(jī)制,首先描述典型的基于管線NPU處理操作。之后,將討論各個(gè)實(shí)施例的細(xì)節(jié)。諸如英特爾(Intel)⑧IXP2xxx網(wǎng)絡(luò)處理器系列的現(xiàn)代網(wǎng)絡(luò)處理器使用多個(gè)多線程處理元件(例如,微引擎(ME))以有助于線路速率分組處理操作。為了處理一個(gè)分組,網(wǎng)絡(luò)處理器(和/或使用網(wǎng)絡(luò)處理器的網(wǎng)絡(luò)設(shè)備)需要從指示該分組的目的地、服務(wù)類型等的分組報(bào)頭提取數(shù)據(jù)、將有效負(fù)載數(shù)據(jù)存儲(chǔ)在存儲(chǔ)器中、執(zhí)行分組分類和排隊(duì)操作、為該分組確定下一中繼段、選擇經(jīng)由其轉(zhuǎn)發(fā)該分組的適當(dāng)網(wǎng)絡(luò)端口等。這些操作通常稱為"分組處理"操作。針對(duì)分組的某些操作被明確定義,而且具有對(duì)其它功能的最少接口或嚴(yán)格次序?qū)崿F(xiàn)。示例包括分組狀態(tài)更新信息一諸如DRAM緩沖器中用于分組的順序段的分組數(shù)據(jù)的當(dāng)前地址、更新鏈表指針,同時(shí)入隊(duì)/出隊(duì)以發(fā)送、以及對(duì)連接流的分組進(jìn)行控制或作標(biāo)記。在這些情況中,可在預(yù)定的周期階段預(yù)算內(nèi)執(zhí)行這些操作。相反,在保持對(duì)嚴(yán)格次序的連續(xù)分組的操作并同時(shí)在許多階段實(shí)現(xiàn)周期預(yù)算時(shí),會(huì)引發(fā)難題。執(zhí)行這一類功能的代碼塊稱為上下文管(pipe)階段。如圖1中所示,在上下文管線中,隨著時(shí)間的前進(jìn),在不同的微引擎(ME)上執(zhí)行不同的功能,并且在功能或ME之間傳遞分組上下文。在所示配置中,z個(gè)ME100^用于分組處理操作,并且每個(gè)ME運(yùn)行w個(gè)線程。每個(gè)ME構(gòu)成與由該ME執(zhí)行的相應(yīng)功能相對(duì)應(yīng)的上下文管階段。級(jí)聯(lián)兩個(gè)或多個(gè)上下文管階段構(gòu)成上下文管線。同一上下文管線可由對(duì)穿過(guò)該管線的是該上下文的觀察結(jié)果來(lái)獲得。在上下文管線中,對(duì)ME中的每個(gè)線程分配一個(gè)分組,并且每個(gè)線程對(duì)不同的分組執(zhí)行相同的功能。當(dāng)分組到達(dá)時(shí),以嚴(yán)格次序?qū)⑺鼈兎峙涞組E線程。例如,通常在英特爾IXP2800ME上下文管階段中分配八個(gè)線程。被分配給八個(gè)線程的八個(gè)分組的每一個(gè)必須在所有八個(gè)分組的到達(dá)速率內(nèi)完成其第一管階段。在圖1中所示的命名法ME/j'中,/應(yīng)于第/個(gè)ME號(hào),而y對(duì)應(yīng)于在第/個(gè)ME上運(yùn)行的第y個(gè)線程。一種更高級(jí)的上下文管線化技術(shù)使用交錯(cuò)分階段管道化(interleavedphasedpiping)。這種技術(shù)在同一線程上以相隔八個(gè)分組的距離來(lái)交錯(cuò)多個(gè)分組。一個(gè)示例可以是ME0.1對(duì)分組l完成管階段O的工作,同時(shí)在分組9開(kāi)始管階段O的工作。類似地,ME0.2在分組2和IO上工作。實(shí)際上,將同時(shí)在一個(gè)管階段中處理16個(gè)分組。管階段0仍必須每8個(gè)分組到達(dá)速率地前進(jìn)。進(jìn)行交錯(cuò)的優(yōu)點(diǎn)是存儲(chǔ)器等待時(shí)間被完全的8個(gè)分組到達(dá)速率掩蓋。根據(jù)現(xiàn)在所述的實(shí)施例的各個(gè)方面,新穎內(nèi)容檢查方案和機(jī)制可使用采用了多個(gè)多線程處理元件的NPU來(lái)實(shí)現(xiàn)。這些方案可經(jīng)由上下文管線化技術(shù)來(lái)實(shí)現(xiàn),基于該技術(shù),使用在一個(gè)或多個(gè)計(jì)算引擎(例如微引擎)上執(zhí)行的不同指令線程來(lái)對(duì)分配給一公共流的各個(gè)分組執(zhí)行內(nèi)容檢查。為了方便這些方案,內(nèi)容檢查狀態(tài)信息被保持在指令線程和計(jì)算引擎可訪問(wèn)的數(shù)據(jù)結(jié)構(gòu)中。例如,在第一計(jì)算引擎上運(yùn)行的第一線程用于對(duì)多個(gè)分組的第一個(gè)執(zhí)行串搜索,這些分組共同包含與候選模式匹配、但不完全包含在單個(gè)分組內(nèi)的串(即,串的相應(yīng)部分包含在相應(yīng)的分組中)。第一線程保持與串搜索相關(guān)的狀態(tài)信息,并且當(dāng)遇到第一個(gè)分組的末端時(shí),相應(yīng)的信息標(biāo)識(shí)部分匹配。同時(shí),在同一或不同的計(jì)算引擎上執(zhí)行的第二線程用于對(duì)第二個(gè)分組執(zhí)行串搜索,該第二個(gè)分組在其開(kāi)始部分包含候選模式的剩余部分。第二線程使用由第一線程生成的狀態(tài)信息來(lái)在第一線程停止的點(diǎn)處繼續(xù)搜索。在標(biāo)識(shí)匹配后,可基于相應(yīng)的預(yù)定規(guī)則或動(dòng)作(又稱為"動(dòng)作目標(biāo)")來(lái)采取適當(dāng)?shù)膭?dòng)作。整個(gè)內(nèi)容檢查過(guò)程以與支持線路速率速度的常規(guī)NPU分組處理操作并行的方式執(zhí)行。此外,該機(jī)制可容易地縮放以支持較大數(shù)量的同步流。圖2示出了用于實(shí)現(xiàn)本文所述的分組處理操作的各方面的軟件架構(gòu)200的各個(gè)組件、數(shù)據(jù)結(jié)構(gòu)和進(jìn)程塊的高層視圖。組件包括深度分組檢査器(DPI)模塊202、流管理器模塊204、規(guī)則引擎模塊206、日志記錄器模塊208和目標(biāo)處理程序模塊210。數(shù)據(jù)結(jié)構(gòu)包括流表212和規(guī)則表214。進(jìn)程塊包括輸入驗(yàn)證塊216、流確認(rèn)塊218、規(guī)則匹配塊220、日志異常塊222、異常生成塊224、策略性能塊226和響應(yīng)生成塊228。如以下更詳細(xì)所述,深度分組檢查模塊202用來(lái)基于適用搜索模式執(zhí)行各種串搜索操作。流管理器204提供用以訪問(wèn)和管理流表212的API(應(yīng)用程序接口)。規(guī)則引擎206提供對(duì)規(guī)則表214的API,從而實(shí)現(xiàn)一級(jí)轉(zhuǎn)換。例如,用戶指定的規(guī)則在到達(dá)可由快速路徑(例如,計(jì)算引擎)處理代碼可用的形式之前將經(jīng)歷多級(jí)轉(zhuǎn)換。與體現(xiàn)為單個(gè)模塊(這里為了簡(jiǎn)便目的所示出的)不同,DPI模塊202應(yīng)當(dāng)被視為可經(jīng)由在NPU計(jì)算引擎上運(yùn)行的相應(yīng)線程來(lái)實(shí)現(xiàn)的各種協(xié)議專用功能的集合。日志記錄器模塊208管理日志記錄功能。此模塊可直接處理日志記錄,或者使用來(lái)自不同處理器(例如,NPU中的通用處理器或單獨(dú)計(jì)算機(jī)主機(jī)中的處理器)中的另一個(gè)組件的服務(wù)來(lái)執(zhí)行日志記錄功能。通常,防火墻中日志記錄功能的范圍可從單個(gè)基于文本的日志記錄到將數(shù)據(jù)轉(zhuǎn)儲(chǔ)到用于大量報(bào)告生成的關(guān)系數(shù)據(jù)庫(kù)。此模塊的復(fù)雜性將取決于所提供的功能而變化。當(dāng)分組進(jìn)入系統(tǒng)時(shí),首先通過(guò)輸入驗(yàn)證塊216對(duì)協(xié)議一致性、校驗(yàn)和等進(jìn)行驗(yàn)證。一旦執(zhí)行此明確的檢查,則流確認(rèn)塊218驗(yàn)證該分組是屬于已知的(例如,現(xiàn)有的)流還是需要新的流。如果分組不屬于任何已知的流,則新的條目被添加到流表212,并且分組的元數(shù)據(jù)(例如報(bào)頭數(shù)據(jù))被傳遞到規(guī)則匹配塊220。此塊將通過(guò)一組匹配結(jié)構(gòu)進(jìn)行迭代,從而為每個(gè)匹配評(píng)估條件。當(dāng)它們匹配時(shí),將目標(biāo)動(dòng)作編碼到分組元數(shù)據(jù)中。因而,分組可具有與其相關(guān)聯(lián)的多個(gè)目標(biāo)動(dòng)作。例如,可能需要將分組記入日志并將其轉(zhuǎn)發(fā)。一旦分組對(duì)照規(guī)則相匹配,則它被傳遞到目標(biāo)處理程序塊210作進(jìn)一步處理。此塊執(zhí)行與分組元數(shù)據(jù)相關(guān)聯(lián)的動(dòng)作。如果傳入分組屬于已知的流,則其不再對(duì)照存取規(guī)則來(lái)匹配。相反,將其直接傳遞到目標(biāo)處理程序模塊210,該模塊為適用動(dòng)作(多個(gè))執(zhí)行任何所需處理。需要對(duì)流的分組執(zhí)行的動(dòng)作被存儲(chǔ)起來(lái)或者另外由針對(duì)該流而存在的相應(yīng)流表?xiàng)l目來(lái)指向。參照?qǐng)D3的流程圖,在每個(gè)輸入分組的處理期間執(zhí)行以下操作。流程從框300開(kāi)始,在其中執(zhí)行流的分類。通常,流的分類可通過(guò)共同用于此目的的若干方案之一來(lái)執(zhí)行。通常,將基于ACL規(guī)則數(shù)據(jù)庫(kù)來(lái)對(duì)流進(jìn)行分類;然而,也可使用其它分類機(jī)制。流分類的目的是將分組分配到相應(yīng)流。通常,用于對(duì)消息(例如,分組)進(jìn)行分類的規(guī)則稱為過(guò)濾器(或者防火墻術(shù)語(yǔ)中的規(guī)則),并且分組或流的分類問(wèn)題是為網(wǎng)絡(luò)元件處的每個(gè)傳入消息確定最低成本匹配過(guò)濾器或規(guī)則。相關(guān)信息可包含在每個(gè)消息(分組)的K個(gè)不同的字段中。例如,IPv4分組的相關(guān)字段可包括目的地址(32位)、源地址(32位)、協(xié)議字段(8位)、目的端口(16位)、源端口(16位)以及可選的TCP標(biāo)志(8位)。因?yàn)闃?biāo)記的數(shù)量受到限制,所以在某些實(shí)現(xiàn)中,協(xié)議和標(biāo)記可被結(jié)合在一個(gè)字段中。圖4a示出了所用示例性分組結(jié)構(gòu),它示出了5元組流分類方案。通常,這種方案可對(duì)任意K元組分類擴(kuò)展。每個(gè)分組將在其報(bào)頭中包括各個(gè)字段,并且數(shù)量和特定字段取決于其傳輸機(jī)制(例如,TCP/IP分組將具有與UDP分組不同的字段)。通常也稱為分組數(shù)據(jù)或有效負(fù)載的分組有效負(fù)載數(shù)據(jù)跟隨在分組報(bào)頭數(shù)據(jù)之后??蛇x的分組腳注(footer)可包括在該分組的末端。在圖4a所示的示例中,選擇如由FLD1-5表示的五個(gè)字段來(lái)執(zhí)行分類。每個(gè)分組字段包含相應(yīng)的字段值(V1-VN)。FLDl-5表示諸如源和目的地址、源和目的端口、協(xié)議信息、檢錯(cuò)信息等的報(bào)頭信息。有效負(fù)載字段400定義了分組包含有效負(fù)載數(shù)據(jù)的分組的部分。在一些情況中,如由FLDN所示的腳注中的信息也可用于流分類。在大多數(shù)分類方案中,僅報(bào)頭信息用于執(zhí)行分類。然而,取決于特定ACL規(guī)則,可能需要包括包含在分組有效負(fù)載和/或腳注中的附加信息。為了簡(jiǎn)便起見(jiàn),以下討論僅基于報(bào)頭信息的分組分類。當(dāng)接收到分組時(shí),對(duì)其進(jìn)行解析以基于分類方案來(lái)從其報(bào)頭提取所選字段值。對(duì)于所示示例,這些可能是來(lái)自FLD1-5的值Vl-V5。然后,所提取的字段值用于搜索規(guī)則數(shù)據(jù)庫(kù)以確定該分組匹配的一組分類規(guī)則,并由此確定相關(guān)聯(lián)結(jié)果流組。如圖4b中所示,過(guò)濾器(ACL)數(shù)據(jù)庫(kù)由一組有限的過(guò)濾器//^、y&…////構(gòu)成,并且每個(gè)過(guò)濾器與相應(yīng)的分類規(guī)則及流相關(guān)聯(lián)。每個(gè)過(guò)濾器是K個(gè)值的組合,每個(gè)適用于分類方案的字段(或部分字段)一個(gè)值。允許過(guò)濾器中的每個(gè)字段進(jìn)行三種類型的匹配精確匹配、前綴匹配或范圍匹配。在精確匹配中,分組的報(bào)頭字段應(yīng)當(dāng)精確地與過(guò)濾器字段匹配。在前綴匹配中,過(guò)濾器字段應(yīng)當(dāng)是報(bào)頭字段的前綴。在范圍匹配中,報(bào)頭值應(yīng)當(dāng)類似地在由過(guò)濾器指定的范圍內(nèi)。每個(gè)過(guò)濾器y仏具有相關(guān)聯(lián)的指令(即,動(dòng)作),該指令指定了如何處理分組與過(guò)濾器的匹配。通常,分類規(guī)則匹配可使用許多已知的技術(shù)之一來(lái)執(zhí)行。例如,在一個(gè)實(shí)施例中,使用聚合位向量方案,其中每個(gè)字段值與標(biāo)識(shí)ACL表中的匹配規(guī)則的相應(yīng)位向量相關(guān)聯(lián)。(實(shí)際上,位向量使用聚合或分層方案來(lái)存儲(chǔ)以減小每個(gè)位向量的存儲(chǔ)大小,因?yàn)樵S多(如果不是大多數(shù))位將是指示不匹配的o值。)然后,位向量與標(biāo)識(shí)匹配規(guī)則的結(jié)果進(jìn)行邏輯與。然后,可容易地標(biāo)識(shí)最高優(yōu)先權(quán)的匹配規(guī)則。還可使用諸如但不限于的遞歸流分類(RFC)(潘卡吉,古普塔和尼克'麥吉伍恩的PacketClassificationonMultipleFields(基于多個(gè)字段的分組分類),ACMSIGCOMM1999)的其它方案。再次參看圖3,一旦分組已被分類到流,則在判定框302中作出相應(yīng)的流數(shù)據(jù)結(jié)構(gòu)(即,流表?xiàng)l目)是否存在于流表212中的判定。如果流表?xiàng)l目已存在,則該判定邏輯前進(jìn)到框304,其中對(duì)流數(shù)據(jù)結(jié)構(gòu)和相應(yīng)狀態(tài)進(jìn)行檢索。如果流表?xiàng)l目尚未存在,則將新的流結(jié)構(gòu)分配到流表中,并且初始化其狀態(tài),如框306中所示。將在以下描述流數(shù)據(jù)結(jié)構(gòu)和狀態(tài)信息的其它細(xì)節(jié)。在一個(gè)實(shí)施例中,流表?xiàng)l目被保持在使用雙重散列方案的散列表中。如圖5中所示,散列表被組織成兩個(gè)表一保持在SRAM(同步隨機(jī)存取存儲(chǔ)器)中的主表和保持在DRAM(動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器)中的次表。主表被劃分成一組槽(slot),而每個(gè)槽條目與次表中的流條目相對(duì)應(yīng)。主表通過(guò)兩個(gè)索引來(lái)進(jìn)行索弓l:第一個(gè)值標(biāo)識(shí)槽字(slotword)(—個(gè)槽為8位值一7位為特征(signature)以及l(fā)位為標(biāo)記),而第二個(gè)值(特征)被存儲(chǔ)在槽中并用于標(biāo)識(shí)該槽。次表中的流條目通過(guò)槽字索引以及具有匹配特征值的槽號(hào)來(lái)進(jìn)行索引。流表被保持成兩組散列表;如果在第一個(gè)表中對(duì)流條目的搜索失敗,則在第二個(gè)表中執(zhí)行對(duì)該條目的搜索。取決于相關(guān)聯(lián)的流,可能需要或不需要內(nèi)容檢査。例如,從"可信任"的源地址發(fā)送的或者被發(fā)送到特定目的端口的分組可被規(guī)則數(shù)據(jù)庫(kù)視為可靠的,并且被分配到具有相關(guān)聯(lián)"轉(zhuǎn)發(fā)"策略(即,動(dòng)作)的相應(yīng)可信任的流。相反,針對(duì)非可信任源地址發(fā)送的分組可被分配到具有相關(guān)聯(lián)的"丟棄"策略的非可信任流。在其它情況中,流可具有要求執(zhí)行內(nèi)容檢測(cè)的相關(guān)聯(lián)的"檢査內(nèi)容"策略。如判定框308所示的,如果要求內(nèi)容檢査,則在框312中使用所檢索的狀態(tài)信息來(lái)啟動(dòng)內(nèi)容檢査操作。對(duì)于不要求內(nèi)容檢査的分組,執(zhí)行分組處理的繼續(xù)部分,如繼續(xù)框310所示??偠灾阉鳈C(jī)制的實(shí)現(xiàn)涉及兩個(gè)階段構(gòu)建或預(yù)處理階段和運(yùn)行時(shí)階.段。在構(gòu)建階段期間,構(gòu)建各種數(shù)據(jù)結(jié)構(gòu)和表,并將它們保存以在稍后的相關(guān)聯(lián)初始化操作期間存儲(chǔ)在存儲(chǔ)器中。在通常進(jìn)行的運(yùn)行時(shí)階段,使用這些數(shù)據(jù)結(jié)構(gòu)和表對(duì)接收到的分組執(zhí)行搜索。在圖6中示出了構(gòu)建階段的一個(gè)實(shí)施例的細(xì)節(jié)。進(jìn)程從框600中開(kāi)始,其中定義了搜索準(zhǔn)則。這可以非常通用的方式表述為在另一個(gè)串(在此示例中為分組數(shù)據(jù))內(nèi)搜索一個(gè)模式(串)出現(xiàn)的問(wèn)題。此問(wèn)題與典型的串匹配問(wèn)題相同,這以正規(guī)術(shù)語(yǔ)表述為給定'n'個(gè)字符的文本串T和'm'個(gè)字符的模式串P,在T中査找所有P出現(xiàn)的位置。(G7ve"aW/"gTVc/zarac/e^s1a〃da/fl"er""rz'"g尸o/'m'在防火墻使用的上下文中,以上問(wèn)題可被映射到在分組數(shù)據(jù)中查找病毒或蠕蟲(chóng)特征、協(xié)議命令或已知可執(zhí)行文件的名稱的存在的問(wèn)題。通常,僅在T中搜索P的存在是足夠的,而非查找所有存在(如果從理論上說(shuō),査找第一次出現(xiàn)通常與査找多次出現(xiàn)一樣"難",這事實(shí)上未緩解問(wèn)題)。在大多數(shù)現(xiàn)實(shí)的防火墻和IDS應(yīng)用中,要搜索的特征串可能并非預(yù)先已知的;能做的最好是在特定流的上下文中將字段限制在要搜索的一組模式。因此,更通用的問(wèn)題是在給定的文本T中搜索一組模式(P)的任一個(gè)或所有的出現(xiàn)。有時(shí),要進(jìn)行匹配的精確串或串并非預(yù)先已知的。特征還可以變體形式出現(xiàn),其中變形通常是對(duì)原始模式的小變化。在此情況中,還需要處理串的近似匹配。有時(shí)還可能需要匹配正規(guī)表達(dá)式而非已知串。目前,所有這些的技術(shù)被用在數(shù)據(jù)挖掘和搜索應(yīng)用中。通常,這些算法比簡(jiǎn)單串搜索略為復(fù)雜,并且具有較高的存儲(chǔ)器和計(jì)算周期要求。在前述策略(條件)的上下文中,不同模式集(P)可應(yīng)用到不同策略。例13如,某些流可僅需要搜索特定模式集,而其它流可包括對(duì)更寬泛或完全不同的模式集的搜索。因此,對(duì)于每個(gè)策略,指定適當(dāng)?shù)哪J郊?。通常,并取決于所使用的搜索算法,模式集可包括精確匹配和/或近似匹配(例如,使用通配符來(lái)匹配)。接著,在框602,基于所選擇的要使用搜索算法來(lái)構(gòu)建數(shù)據(jù)結(jié)構(gòu)和相關(guān)表(統(tǒng)稱為模式數(shù)據(jù)結(jié)構(gòu)(DS))。將在以下進(jìn)一步描述此方面。如由判斷框604所示的,偏移量和深度信息還可與搜索準(zhǔn)則相關(guān)。時(shí)常,關(guān)于特定模式的信息知道得比包含該模式的字節(jié)的串的信息更多。這些信息可幫助縮小分組(或者相關(guān)聯(lián)的位流)中可能出現(xiàn)該模式的范圍。如本文所用的,此信息包括偏移量(Offset)和深度(Depth)。偏移量值表示在開(kāi)始搜索之前,可從分組(或位流)的開(kāi)始部分跳過(guò)的字節(jié)數(shù)。深度值表示分組需要被搜索的分組(或位流)內(nèi)以可能查找到該模式的最大字節(jié)數(shù)。偏移量和深度值也可稱為"標(biāo)記(Tag)"值。盡管當(dāng)涉及單個(gè)模式時(shí),這些信息是非常有用的,但是將其擴(kuò)展到其中每個(gè)模式可具有不同的偏移量和深度的多模式情況是有些困難的。使用此信息的原始方法僅僅是用于檢查這些標(biāo)記值,何處能到達(dá)適用狀態(tài)機(jī)中的接受狀態(tài),但是這可能是不充分且錯(cuò)誤的;如果當(dāng)?shù)竭_(dá)接受狀態(tài)時(shí),偏移量或深度不匹配,則由于在不同路徑(在機(jī)器中)上進(jìn)行而可能己潛在地錯(cuò)過(guò)其它(有效的)模式。因此,需要在算法的每個(gè)步驟結(jié)合偏移量和深度檢査,從而作出正確的狀態(tài)轉(zhuǎn)移。一種方法是通過(guò)將適當(dāng)?shù)臉?biāo)記值信息結(jié)合(或添加)到適用的模式數(shù)據(jù)結(jié)構(gòu)中來(lái)實(shí)現(xiàn),如框606中所示并將在以下進(jìn)一步詳細(xì)描述的那樣。在模式數(shù)據(jù)結(jié)構(gòu)被完全構(gòu)建之后,在框608將它們保存到文件等。在隨后初始化操作期間,模式數(shù)據(jù)結(jié)構(gòu)將被加載到存儲(chǔ)器和/或代碼存儲(chǔ)中,并且相應(yīng)的模式數(shù)據(jù)査找數(shù)據(jù)將被加載到存儲(chǔ)器中,如由相應(yīng)框610和612所示的。為了示出如何以及哪里可存儲(chǔ)此數(shù)據(jù),將注意力放在圖7所示的執(zhí)行環(huán)境。執(zhí)行環(huán)境涉及網(wǎng)絡(luò)線路卡700,該線路卡包括經(jīng)由SRAM接口(I/F)705耦合到SRAM存儲(chǔ)(SRAM)704、以及經(jīng)由DRAM接口707耦合到DRAM存儲(chǔ)(DRAM)706的NPU702。還對(duì)NPU702畫(huà)出所選擇的模塊,包括深度分組檢査模塊202、流管理器模塊204、隊(duì)列管理器模塊708、接收引擎710和緩沖器管理器712。在上述方式中,與這些模塊的每一個(gè)相關(guān)聯(lián)的操作可通過(guò)在ME714上執(zhí)行的相應(yīng)指令線程而變得更佳方便。在一個(gè)實(shí)施例中,指令線程最初被存儲(chǔ)在包括諸如閃存或大容量設(shè)備等的非易失性存儲(chǔ)設(shè)備的指令存儲(chǔ)715中。如圖7中所示,各種數(shù)據(jù)結(jié)構(gòu)和表被存儲(chǔ)在SRAM704中。這些包括流表212、策略數(shù)據(jù)結(jié)構(gòu)表716和模式數(shù)據(jù)結(jié)構(gòu)表718。而且,分組元數(shù)據(jù)720通常也被存儲(chǔ)在SRAM中。如以上參照?qǐng)D5所述的,流表的相應(yīng)部分被拆分到SRAM704與DRAM706之間;為了簡(jiǎn)便起見(jiàn),流表212的所有數(shù)據(jù)被示為在圖7中的SRAM中。通常,被頻繁訪問(wèn)以進(jìn)行分組處理的信息(例如,元數(shù)據(jù)720)將被存儲(chǔ)在SRAM中,而大量分組數(shù)據(jù)(或者整個(gè)分組或分組有效負(fù)載)將被存儲(chǔ)在DRAM中,并且后者具有較高的訪問(wèn)等待時(shí)間但是成本預(yù)算顯著較少。因此,在爽型的實(shí)現(xiàn)方案中,DRAM中可用的存儲(chǔ)器空間遠(yuǎn)大于SRAM存儲(chǔ)所提供的。如圖7的左下角所示,每個(gè)ME714包括本地存儲(chǔ)器722、本地寄存器724、分別的SRAM和DRAM讀和寫緩沖器726(為了方便起見(jiàn),示為單個(gè)塊)、代碼存儲(chǔ)728和計(jì)算核心(例如,算術(shù)邏輯單元(ALU))730。通常,信息可分別經(jīng)由SRAM和DRAM寫和讀緩沖器傳遞到ME或從其上傳出。另外,在一個(gè)實(shí)施例中,提供下一鄰接緩沖器(未示出)以使數(shù)據(jù)能夠有效地在被配置成鏈或集群的ME之間傳遞。如以下所述,每個(gè)模式數(shù)據(jù)結(jié)構(gòu)將提供用于實(shí)現(xiàn)相應(yīng)狀態(tài)機(jī)或基于表的機(jī)器的信息。各種模式數(shù)據(jù)結(jié)構(gòu)通常被存儲(chǔ)在模式數(shù)據(jù)結(jié)構(gòu)表718中,如圖7中所示。然而,可存在這樣的范例,所選擇的模數(shù)數(shù)據(jù)結(jié)構(gòu)被存儲(chǔ)在所選擇的、被配置成存儲(chǔ)指令代碼和數(shù)據(jù)的代碼存儲(chǔ)中。如以上針對(duì)圖6所述,除存儲(chǔ)模式數(shù)據(jù)結(jié)構(gòu)之外,相關(guān)聯(lián)的模式數(shù)據(jù)結(jié)構(gòu)查找數(shù)據(jù)也類似地被存儲(chǔ)在塊612中。在圖7中所示的實(shí)施例中,査找數(shù)據(jù)作為與策略數(shù)據(jù)結(jié)構(gòu)表716中的相應(yīng)策略相關(guān)聯(lián)的指針來(lái)存儲(chǔ)。還可使用其它方案。部分地使用模式數(shù)據(jù)結(jié)構(gòu)查找數(shù)據(jù)來(lái)用以下所述方式構(gòu)建流表?xiàng)l目。圖8a和8b中示出了運(yùn)行時(shí)內(nèi)容檢查階段期間所執(zhí)行的操作的概況,其中圖8a示出了在處理流中的第一個(gè)分組期間執(zhí)行的操作,而圖8b示出了在處理流中的任何后續(xù)分組(由產(chǎn)(第z'個(gè))分組來(lái)表示)期間執(zhí)行的操作。如圖8a和8b的框800中所示,響應(yīng)于接收到輸入分組,經(jīng)由在一個(gè)或多個(gè)ME714上執(zhí)行的一個(gè)或多個(gè)線程來(lái)執(zhí)行初始分組處理操作。為了將這些線程與用于內(nèi)容檢查的其它線程區(qū)分開(kāi)來(lái),在圖8a和8b中這些線程被標(biāo)示為預(yù)搜索線程。更詳細(xì)地,并參照?qǐng)D7,當(dāng)在線路卡700接收到輸入分組732時(shí),通過(guò)接收引擎710來(lái)對(duì)它們進(jìn)行處理,該引擎結(jié)合正進(jìn)行的上下文管線分組處理操作將它們暫時(shí)存儲(chǔ)在接收(Rx)緩沖器734。提取分組報(bào)頭,并且相對(duì)應(yīng)的分組元數(shù)據(jù)720被存儲(chǔ)在SRAM704中。這些分組還以上面討論的方式來(lái)分類,并將其分配該現(xiàn)有或新的流。每個(gè)流具有存儲(chǔ)在DRAM706中的相關(guān)聯(lián)隊(duì)列,如由流隊(duì)列736所示的。這些隊(duì)列通常由隊(duì)列管理器708和/或流管理器204來(lái)管理。在創(chuàng)建流隊(duì)列之后,相關(guān)聯(lián)的信息被添加到元數(shù)據(jù)720,從而可容易地為諸如出隊(duì)的隨后操作標(biāo)識(shí)隊(duì)列中的第一個(gè)(頭)和最后一個(gè)(尾)分組?;诹鞑呗院推渌鼫?zhǔn)則以及較少的可預(yù)測(cè)的網(wǎng)絡(luò)操作,以異步方式從各個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)接收分組流。結(jié)果,可以混合方式接收來(lái)自不同流的連續(xù)方式的分組,如圖7中所示。例如,使用F弁4來(lái)對(duì)輸入分組732的每一個(gè)加標(biāo)號(hào),其中F#標(biāo)識(shí)流,而-#標(biāo)識(shí)給定流的順序的分組。如應(yīng)當(dāng)理解的,分組不包含具體標(biāo)識(shí)對(duì)它們進(jìn)行指定的流,但是在流分類期間確定這些信息。然而,在諸如TCP報(bào)頭(例如,TCP分組序列^那樣適用的分組報(bào)頭中提供分組序列數(shù)據(jù)。在圖7中,流隊(duì)列736包含流(Flow)#1中的最初五個(gè)分組。如前所述,在框800中所執(zhí)行的隊(duì)列操作期間,在對(duì)它們進(jìn)行分類之后,將分組添加到相關(guān)聯(lián)的流隊(duì)列。在框800的操作之后,將執(zhí)行類似于圖3中所示的操作,從而導(dǎo)致需要內(nèi)容搜索。如上所述,如果分組被分配到新的流,則將在框306中創(chuàng)建相應(yīng)的流表?xiàng)l目。在圖7中所示的實(shí)施例中,每個(gè)流表?xiàng)l目包括流ID、緩沖器指針、策略指針、模式數(shù)據(jù)結(jié)構(gòu)指針、狀態(tài)信息和統(tǒng)計(jì)信息。(流表?xiàng)l目還可包括未示出的其它信息)。流ID用于流表?xiàng)l目査找,并且在一個(gè)實(shí)施例中包括根據(jù)圖5中所示流表索引方案的散列索引。在一個(gè)實(shí)施例中,緩沖器指針指向適用的元數(shù)據(jù)720,該元數(shù)據(jù)又包括指向與流表?xiàng)l目相關(guān)聯(lián)的流隊(duì)列中的頭分組和尾分組的指針。策略指針指向策略數(shù)據(jù)結(jié)構(gòu)表716中的策略數(shù)據(jù)結(jié)構(gòu)。如上所討論,每個(gè)流與一策略相關(guān)聯(lián)。在流分類期間,對(duì)策略進(jìn)行標(biāo)識(shí),并且向流管理器204提供相應(yīng)的策略指針。如上所討論的,要求內(nèi)容檢查的每個(gè)策略還與模式數(shù)據(jù)結(jié)構(gòu)相關(guān)聯(lián)。因而,在一個(gè)實(shí)施例中,可從策略數(shù)據(jù)結(jié)構(gòu)中提取模式數(shù)據(jù)結(jié)構(gòu)指針。狀態(tài)信息用于存儲(chǔ)由深度分組檢査模塊202使用的相應(yīng)算法狀態(tài)的狀態(tài),并且在以下進(jìn)一步詳細(xì)描述。統(tǒng)計(jì)信息用于各種目的,包括標(biāo)識(shí)對(duì)其完成內(nèi)容檢査的流中的最后分組的當(dāng)前序列號(hào)。以這樣的方式,可基于下一個(gè)分組相對(duì)于相關(guān)聯(lián)流隊(duì)列中的頭分組的相對(duì)位置,標(biāo)識(shí)針對(duì)給定流將被檢查的下一個(gè)分組。如圖8a的框802A中所示,如果分組是流中的第一個(gè)分組,則將在ME714上啟動(dòng)第一線程來(lái)鑒于適用模式集(P)對(duì)分組執(zhí)行模式搜索以標(biāo)識(shí)任何匹配。因此,由該線程讀取與針對(duì)此分組的新的流表?xiàng)l目相對(duì)應(yīng)的數(shù)據(jù),該數(shù)據(jù)包括指示狀態(tài)機(jī)處于初始狀態(tài)的狀態(tài)信息。在框804,使用緩沖器指針和元數(shù)據(jù)來(lái)標(biāo)識(shí)分組在相關(guān)聯(lián)流隊(duì)列中的位置,并且將該分組復(fù)制到ME的本地存儲(chǔ)器722中。在框806B中,從模式數(shù)據(jù)結(jié)構(gòu)表718檢索適用模式數(shù)據(jù)結(jié)構(gòu)(如由模式數(shù)據(jù)結(jié)構(gòu)指針標(biāo)識(shí)的),并將其復(fù)制到本地存儲(chǔ)器722中。將相應(yīng)搜索算法的現(xiàn)有狀態(tài)738初始化到初始狀態(tài),該狀態(tài)表示當(dāng)前不存在部分匹配。模式搜索操作在分組的起始處(例如,分組有效負(fù)載的起始處)開(kāi)始,并且以迭代方式執(zhí)行直至到達(dá)分組的結(jié)束處。如由起始和結(jié)束循環(huán)框806和816所示,取決于具體搜索算法,適用算法機(jī)器使用可包括一個(gè)或多個(gè)字符的搜索增量。響應(yīng)于每個(gè)增量,可以的話,更新機(jī)器的現(xiàn)有狀態(tài)738。在框812中,作出全匹配是否已由機(jī)器進(jìn)行標(biāo)識(shí)的判定。如果是,則執(zhí)行搜索條件的相關(guān)聯(lián)動(dòng)作,如由繼續(xù)框814所示,并且線程結(jié)束。通常,由在同一或不同ME上的同一或另一(更可能)線程執(zhí)行相關(guān)聯(lián)動(dòng)作??蛇x地可通過(guò)NPU的通用處理器(為了清晰起見(jiàn),圖中未示出)來(lái)執(zhí)行相關(guān)聯(lián)動(dòng)作。在匹配串標(biāo)識(shí)惡意蠕蟲(chóng)等存在的情況下,相關(guān)聯(lián)動(dòng)作通常丟棄流中的所有剩余分組,以及可能地針對(duì)源地址更新ACL數(shù)據(jù)庫(kù)動(dòng)作。丟棄剩余分組可通過(guò)更新在相關(guān)聯(lián)的流表?xiàng)l目中的策略指針來(lái)完成,從而對(duì)該流的策略有效地從"內(nèi)容檢查"切換到"丟棄"。一旦模式搜索算法到達(dá)分組的結(jié)束處(沒(méi)有匹配),則在框818中更新相關(guān)聯(lián)的流表?xiàng)l目中的狀態(tài)和統(tǒng)計(jì)學(xué)信息。這時(shí),結(jié)束執(zhí)行第一線程。參看圖8b,在接收到被分類到同一流的后繼分組之后,如圖8a和8b中類似附圖標(biāo)記的框所示的,執(zhí)行類似的操作。在框802B中,在同一或另一ME174上執(zhí)行第/個(gè)線程,其中/表示分組序號(hào)(根據(jù)報(bào)頭中的真實(shí)序號(hào)進(jìn)行校正)。在處理了第一個(gè)分組之后,被讀取的流表?xiàng)l目將是包括由前一個(gè)分組更新的現(xiàn)有狀態(tài)的現(xiàn)有條目。如前所述,包括統(tǒng)計(jì)信息的流表?xiàng)l目信息用于分組定位在17流隊(duì)列中的分組,由此在框804中,分組被復(fù)制到ME的本地存儲(chǔ)器722。在框806B,適用模式數(shù)據(jù)結(jié)構(gòu)通過(guò)ME以類似于圖8a的框806A的方式來(lái)檢索。然而,作為處理前一個(gè)分組(例如,第一個(gè)分組)的結(jié)果,機(jī)器的狀態(tài)將被初始化到由前一個(gè)分組更新的現(xiàn)有狀態(tài)。如果在前一個(gè)分組結(jié)束時(shí)存在部分匹配,則機(jī)器中的現(xiàn)有狀態(tài)多少不同于初始狀態(tài)(例如,0)。如果沒(méi)有部分匹配,則現(xiàn)有狀態(tài)將是初始狀態(tài)。以類似于應(yīng)用到第一個(gè)的方式執(zhí)行框808、810、812、814和816的模式搜索操作,不同之處僅在于機(jī)器的初始狀態(tài)。因此,如果在前一個(gè)分組結(jié)束時(shí)存在部分匹配,則在狀態(tài)機(jī)停止時(shí),模式搜索開(kāi)始尋找第二部分(剩余匹配部分)—模式集(P)中的一個(gè)或多個(gè)串(取決于現(xiàn)有狀態(tài))。如前所述,如果標(biāo)識(shí)全匹配,則在繼續(xù)框814中,執(zhí)行相關(guān)聯(lián)動(dòng)作。如上所討論,搜索準(zhǔn)則可指定相應(yīng)模式串的偏移量和深度值。在此情況中,模式搜索處理被增強(qiáng)以考慮此附加搜索信息。如圖9中所述,從分組的起始處開(kāi)始,并且已執(zhí)行了圖8a和8b(適當(dāng)?shù)?的先前操作。在框900中,跳過(guò)分組的一部分以到達(dá)偏移量,在此處開(kāi)始搜索。在以下將進(jìn)一步討論的細(xì)節(jié)中,可基于單個(gè)模式搜索來(lái)實(shí)現(xiàn)此操作,從而當(dāng)使用多模式搜索時(shí),某些模式偏移到不同于其它模式的點(diǎn)。如果分組是流中的第一個(gè)分組,則從該分組的開(kāi)始處跳過(guò)與偏移量相對(duì)應(yīng)的字節(jié)數(shù)。理論上,一個(gè)或多個(gè)搜索模式的偏移量大于該第一個(gè)分組的整個(gè)長(zhǎng)度是可能的。因此,在此情況中,針對(duì)這些搜索模式,跳過(guò)整個(gè)分組,并且從偏移量值減去第一個(gè)分組的長(zhǎng)度,從而針對(duì)下一個(gè)分組將跳過(guò)的偏移量的部分,將考慮已跳過(guò)多少位流。例如,考慮其中對(duì)特定搜索模式的偏移量大于給定協(xié)議的分組有效負(fù)載的最大大小的情況。對(duì)于這種特定搜索模式,將跳過(guò)整個(gè)第一個(gè)分組,并且將在第二個(gè)分組中的一個(gè)偏移量處開(kāi)始搜索,該偏移量等于原始偏移量與第一個(gè)分組大小之間的差值。在一個(gè)實(shí)施例中,多分組偏移量方案可通過(guò)更新在相關(guān)聯(lián)的流表?xiàng)l目中的適當(dāng)統(tǒng)計(jì)信息而易于進(jìn)行,如以下參照框920所討論的。如由開(kāi)始和結(jié)束循環(huán)框902和914所示的,模式搜索涉及對(duì)分組有效負(fù)載數(shù)據(jù)的迭代,并且數(shù)據(jù)中的位置向前進(jìn)由搜索算法使用的適用搜索增量。對(duì)模式集(P)中每個(gè)搜索模式的起始點(diǎn)將是對(duì)該搜索模式的有效偏移量。響應(yīng)于移動(dòng)每個(gè)搜索增量,在框904中更新機(jī)器狀態(tài)。如由判斷框卯6所示的,如果機(jī)器指示搜索串匹配,則在繼續(xù)框908中執(zhí)行相關(guān)聯(lián)的動(dòng)作。如果不存在匹配,則邏輯前進(jìn)到判斷框910以確定是否己到達(dá)適用搜索串的深度。如果到達(dá),則對(duì)該串的搜索完成,如結(jié)束框912所示的。如果未到達(dá),則進(jìn)程返回開(kāi)始循環(huán)框902以開(kāi)始下一迭代。在到達(dá)分組的結(jié)束處之后,取決于實(shí)現(xiàn),可引發(fā)兩個(gè)動(dòng)作,如判斷框916所示。對(duì)于僅搜索流中的第一個(gè)分組的實(shí)施例中,針對(duì)流的搜索進(jìn)程完成,并且未發(fā)現(xiàn)匹配。結(jié)果,在框918中更新流表?xiàng)l目中的策略指針以指向不執(zhí)行內(nèi)容搜索的策略,從而不對(duì)流中的剩余的分組執(zhí)行搜索。如果支持多分組搜索(關(guān)于偏移量方面),則在流表?xiàng)l目中更新統(tǒng)計(jì)信息以考慮在要用于下一個(gè)分組的偏移量中分組已跳過(guò)分組的大小,如框920中所示。在一個(gè)實(shí)施例中,用于給定搜索模式的有效深度可被調(diào)節(jié)成支持多分組搜索。例如,考慮其中偏移量小于第一個(gè)分組的大小而深度大于該第一個(gè)分組的大小的情形。這種情形可通過(guò)將要應(yīng)用到第二個(gè)分組的深度值減少第一個(gè)分組的大小來(lái)處理。還可在框920中執(zhí)行此操作。還要注意在此情況中,也在流表?xiàng)l目中更新?tīng)顟B(tài)信息以在第一個(gè)分組的結(jié)束處以上面討論的方式反映狀態(tài)機(jī)的狀態(tài)。在一個(gè)實(shí)施例中,經(jīng)由包含在適用模式數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)來(lái)提供用于實(shí)現(xiàn)偏移量和深度操作的機(jī)制。因此,在圖9中包括框922來(lái)示出模式數(shù)據(jù)結(jié)構(gòu)被調(diào)節(jié)成在多分組實(shí)現(xiàn)中考慮偏移量和/或深度。此操作通過(guò)使用在框920中更新的統(tǒng)計(jì)信息的另一線程(被啟動(dòng)來(lái)處理流中的下一個(gè)分組)來(lái)執(zhí)行。多模式搜索算法對(duì)多個(gè)模式的存在進(jìn)行搜索的最簡(jiǎn)單的方法是通過(guò)對(duì)每個(gè)模式迭代應(yīng)用若干公知單模式算法的任一個(gè)。從20世紀(jì)70年代后期已提出了若干多模式算法。FSM(有限狀態(tài)機(jī))算法在傳統(tǒng)上是研究的焦點(diǎn),但是如吳和曼伯提出了不使用FSM的其它有效算法。FSM算法是基于以下考慮。給定有限字母和模式,有可能以可處理文本串的有效方式構(gòu)建有限狀態(tài)自動(dòng)機(jī)以返回該模式的出現(xiàn)。機(jī)器中的每個(gè)狀態(tài)(由數(shù)字表示)對(duì)應(yīng)于目前為止已匹配的模式的最長(zhǎng)前綴。這具有需要精確地一次掃描文本中的每個(gè)字符的特性。預(yù)處理主要涉及計(jì)算機(jī)器的轉(zhuǎn)移函數(shù)。算法的運(yùn)行涉及將搜索文本饋送到FSM作為輸入。只要到達(dá)接受狀態(tài),就檢測(cè)到P的出現(xiàn)。通常,可對(duì)由本文所述的實(shí)施例所使用的模式搜索實(shí)現(xiàn)任何類型的FSM算法。為了更好地理解FSM算法如何操作,現(xiàn)在將討論眾所周知的Aho陽(yáng)Corasick(AC)算法(A.V.阿霍,M.考拉思克,"Efficientstringmatching:anaidtobibliographicsearch(有效串匹配對(duì)文獻(xiàn)搜索的幫助)",ACM通信,第18巻(1975)333—340)的簡(jiǎn)要描述。以下描述摘錄自前述文獻(xiàn)。假設(shè)《=^,少2—,>^為稱為關(guān)鍵字的有限串集,并假設(shè)^為稱為文本串的任意串。我們的問(wèn)題是定位和標(biāo)識(shí)為K中的關(guān)鍵字的所有x的子串。子串可彼此交疊。針對(duì)AT的模式匹配機(jī)是將文本串;c作為輸入并產(chǎn)生尺的關(guān)鍵字作為子串出現(xiàn)的;c中的位置作為輸出的程序。模式匹配機(jī)由一組狀態(tài)構(gòu)成。每個(gè)狀態(tài)由數(shù)字來(lái)表示。機(jī)器通過(guò)順序讀取x中的符號(hào)、進(jìn)行狀態(tài)轉(zhuǎn)移和偶爾發(fā)出輸出來(lái)處理文本串x。模式匹配機(jī)的這些行為由三個(gè)函數(shù)來(lái)支配跳轉(zhuǎn)函數(shù)g、失敗函數(shù)/和輸出函數(shù)OW0W。圖10示出了對(duì)于關(guān)鍵字集(he,she,his,hers)由模式匹配機(jī)使用的函數(shù),其中狀態(tài)為0,1....,9。跳轉(zhuǎn)函數(shù)g將由狀態(tài)和輸入符號(hào)構(gòu)成的對(duì)映射到狀態(tài)或消息/m7(失敗)。有向圖表示跳轉(zhuǎn)函數(shù)。例如,標(biāo)號(hào)為h的從0到l的邊(edge)表示g(0,h)4。缺少箭頭表示/"http://。因而,對(duì)于不是e或i的所有輸入符號(hào)0,^(1,0)=>7。所有模式匹配機(jī)具有對(duì)于所有輸入符號(hào)0而言^(1,0>>7的屬性。跳轉(zhuǎn)函數(shù)在狀態(tài)0的這種屬性確保在每個(gè)機(jī)器周期由機(jī)器處理一個(gè)輸入符號(hào)。失敗函數(shù)/將狀態(tài)映射到狀態(tài)。只要跳轉(zhuǎn)函數(shù)報(bào)告失敗,失敗函數(shù)就進(jìn)行査閱。某些狀態(tài)被指定為表示已找到關(guān)鍵字集的輸出狀態(tài)。輸出函數(shù)通過(guò)使關(guān)鍵字集(可能為空)與每個(gè)狀態(tài)關(guān)聯(lián)來(lái)公式化這種概念。模式匹配機(jī)的操作周期定義如下。假設(shè)s是機(jī)器的當(dāng)前狀態(tài)且a是輸入串;c的當(dāng)前符號(hào)。1.如果g(s,a)w',則機(jī)器作出跳轉(zhuǎn)轉(zhuǎn)移(gofofra^m'o")。它進(jìn)入狀態(tài)?并且;c的下一個(gè)符號(hào)變成當(dāng)前輸入符號(hào)。另外,如果o"0"^')"m;^(空),則機(jī)器發(fā)出集合oi^""/)連同當(dāng)前輸入符號(hào)的位置?,F(xiàn)在操作周期完成。2.如果gO,a)=,則機(jī)器査閱失敗函數(shù)/并被說(shuō)成作出失敗轉(zhuǎn)移(加w/"o")。如果/0)w",則以^作為當(dāng)前狀態(tài)而a作為當(dāng)前輸入符號(hào)機(jī)器重復(fù)該周期。最初,機(jī)器的當(dāng)前狀態(tài)是起始狀態(tài)而文本串的第一個(gè)符號(hào)是當(dāng)前輸入符號(hào)。然后,通過(guò)對(duì)文本串的每個(gè)符號(hào)進(jìn)行一個(gè)操作周期來(lái)處理文本串。DAWG匹配實(shí)現(xiàn)在一個(gè)實(shí)施例中,使用稱為DAWG匹配算法的基于FSM算法(M.科羅凱默、A.庫(kù)瑪、L.蓋恩尼克、T.萊可羅、W.普蘭多士基和W.里特的"快速實(shí)現(xiàn)多模式匹配",/w/尸roce^丄e".,71((3-4)):107-119,1999)。此算法結(jié)合阿霍-考拉思克和波耶-莫爾的思想以獲得更好的平均運(yùn)行時(shí)間。它需要計(jì)算AC狀態(tài)以及對(duì)給定模式集的反相模式的DAWG(有向無(wú)環(huán)字圖)。雖然計(jì)算AC狀態(tài)機(jī)的轉(zhuǎn)移函數(shù),但是還計(jì)算移位表,該移位表在保證跳躍區(qū)中的不出現(xiàn)模式的特定狀態(tài)存儲(chǔ)最大移位(該狀態(tài)對(duì)應(yīng)于至今為止與所掃描的文本的后綴匹配的模式的最長(zhǎng)前綴);此函數(shù)對(duì)應(yīng)于波特里可-吉恩卡羅(Apostolico-Giancarlo)跳躍(skip)函數(shù)。在算法的步驟中,DAWG用于從右到左掃的第一次掃描直至失配,在此之后AC機(jī)用于從左到右掃描來(lái)識(shí)別前綴,并且對(duì)移位值作出決定。如果使用DAWG匹配的字符集與在前一階段中由AC匹配的前綴重疊,則報(bào)告匹配。以下呈現(xiàn)DAWG匹配算法的模式數(shù)據(jù)結(jié)構(gòu)的一個(gè)實(shí)施例,并且在圖11中示出相應(yīng)的存儲(chǔ)器數(shù)據(jù)結(jié)構(gòu)。structPattern{char*string;intlengthyintoffset;intdepthjcharfcase;/*指向字節(jié)串的指針*//*串中的字節(jié)數(shù)*//*在文本的第一偏移量字節(jié)內(nèi)不出現(xiàn)串MUSTNOT"/*在文本的第一深度字節(jié)內(nèi)出現(xiàn)串MUST*//*標(biāo)記(0=大小寫無(wú)關(guān);1=大小寫相關(guān))/*指向前一模式的指針(對(duì)于條件搜索;structPattern*prev;僅當(dāng)已找到prev時(shí)才搜索串*/structPattern*next;/*指向下一個(gè)模式的指針(為了條件滿足(或者更改RegEx)"exf必須跟隨在文本中的串之后*/intprev_pat—num;/*預(yù)排序表中的prev的模式號(hào)(Patternumber)*/intnext_pat_num;/*預(yù)抖一序表中的wexf的模式號(hào)*/intdistance;/*與offset同義;文本的起始位置是/7wv結(jié)束之后的第一個(gè)字節(jié)(如果找到)*/intwithin;/*與depth同義;文本的起始位置是結(jié)束之后的第一個(gè)字節(jié)(如果找到)*/intexact;/*串在文本中的精確起始位置*/intrelative;/*與exact同義;文本的起始位置是結(jié)束之后的第一個(gè)字節(jié)(如果找到)*/};如果未定義,則iVev和A^;cf值將是NULL。除非明確定義,q/^"和A'Wa"ce的默認(rèn)值將是0。除非明確定義,^;^、w/f/z/"、exa"和"/af/ve的默認(rèn)值是-1。對(duì)于預(yù)處理,使用指針值/^ev和"e^。對(duì)于微代碼中的算法實(shí)現(xiàn),當(dāng)模式索引值被更普遍地使用時(shí),采用/"vjar一""m和we^_jflr_""/77(因?yàn)槟J浇Y(jié)構(gòu)是恒定大小,實(shí)際模式地址可從這些值來(lái)計(jì)算)。在圖11的存儲(chǔ)器映射數(shù)據(jù)結(jié)構(gòu)中,地址被對(duì)齊到字(4個(gè)字節(jié))邊界。實(shí)際模式串是在數(shù)據(jù)結(jié)構(gòu)的第一字段中指示的字節(jié)地址開(kāi)始的字節(jié)序列。實(shí)際上,在最后模式數(shù)據(jù)結(jié)構(gòu)結(jié)束之后,模式串被連續(xù)并立即存儲(chǔ)。這使得能夠在預(yù)處理期間預(yù)分配存儲(chǔ)器、計(jì)算相對(duì)地址,并且僅需要保持一個(gè)指針(第一模式結(jié)構(gòu)的地址)。AC機(jī)器使用確定性有限狀態(tài)自動(dòng)機(jī)(2、S、/、,r),其中2是狀態(tài)集,5是轉(zhuǎn)移函數(shù),/是失敗函數(shù),s。是開(kāi)始狀態(tài),而r是接受狀態(tài)集。對(duì)給定輸入,轉(zhuǎn)移函數(shù)確定從一給定輸入上的特定狀態(tài)轉(zhuǎn)移到哪個(gè)狀態(tài)。針對(duì)未被轉(zhuǎn)移函數(shù)定義的(狀態(tài),輸入)對(duì),失敗函數(shù)指示異常轉(zhuǎn)移。AC機(jī)器被構(gòu)造成節(jié)點(diǎn)的特里結(jié)構(gòu)(trie),并且可僅通過(guò)指向開(kāi)始狀態(tài)的指針來(lái)指定。在一個(gè)實(shí)施例中,使用以下的數(shù)據(jù)結(jié)構(gòu),同時(shí)在圖12中示出了相應(yīng)的存儲(chǔ)器數(shù)據(jù)結(jié)構(gòu)。structtransition{charinput;/*觸發(fā)狀態(tài)轉(zhuǎn)移的字節(jié)值*/structAC—node*destination;/*指向destination(目的)AC機(jī)器狀態(tài)(節(jié)點(diǎn))的指針*/};22structAC_node{intnode_id;intshift;匹配)Shift是可跳過(guò)的最小距離:intoffset;intdepth;structAC—node*fail;intnum一transitions^structtransition*next;charfaccepting;intnum—outputs;structPattern"output;int*pattern—numbers;/*作為狀態(tài)id的唯一整數(shù)"/*最大安全s/uyK移位)值(對(duì)于DAWG并且保證在所跳過(guò)的區(qū)域內(nèi)不出現(xiàn)模式*//*由此狀態(tài)指示的前綴必須在文本的第一0」^^字節(jié)處或之后結(jié)束*//*由此狀態(tài)指示的前綴必須在文本的&/^字節(jié)內(nèi)結(jié)束*//*指向失敗狀態(tài)的指針*//*從此狀態(tài)開(kāi)始的轉(zhuǎn)移的數(shù)量*//*從此狀態(tài)開(kāi)始的轉(zhuǎn)移列表,按輸入字節(jié)的ASCII值排序*//*標(biāo)記(1=接受;0=不接受)*//H只別到的模式的數(shù)量,如果狀態(tài)是接受的*//H只別到的模式,如果狀態(tài)是接受的*//H只別到的模式的列表,作為模式的預(yù)排序列表中的索引值*/o,"、/aceep〃wg、.wwm」mm7'"om1禾口wwm一ow/^MG的默認(rèn)"f直為0,除非明確定義或被計(jì)算。depth的默認(rèn)值為-1,除非明確定義或被計(jì)算。僅在預(yù)處理(機(jī)器的計(jì)算)期間對(duì)^^"如'o"、/"i/和ow^^使用指針。微代碼的實(shí)現(xiàn)使用狀態(tài)的pa"""—"wm6e^和"ocfe—W(從這些來(lái)計(jì)算實(shí)際存儲(chǔ)器地址)。在一個(gè)實(shí)施例中,使用AC機(jī)器索引結(jié)構(gòu),如圖13中所示。盡管索引和AC機(jī)器節(jié)點(diǎn)的每一個(gè)被設(shè)計(jì)成可在存儲(chǔ)器中獨(dú)立再定位,以按狀態(tài)ID排序的連續(xù)方式來(lái)存儲(chǔ)這些狀態(tài)信息、以及將這些結(jié)構(gòu)信息緊跟在索引之后存儲(chǔ)是有益的。這允許在預(yù)處理期間計(jì)算不同的地址(相對(duì))、將要保持的指針的數(shù)目減少到l(索引結(jié)構(gòu)的基地址)、以及使得能夠預(yù)分配存儲(chǔ)器。有向無(wú)環(huán)字圖或后綴自動(dòng)機(jī)識(shí)別在給定集中的模式的所有后綴(DAWG匹配算法采取反相模式作為輸入)。DAWG不具有失敗函數(shù),并且狀態(tài)無(wú)需具有與它們相關(guān)聯(lián)的輸出模式。以下給出DAWG數(shù)據(jù)結(jié)構(gòu)的一個(gè)實(shí)施例,而在圖14中示出了相應(yīng)的存儲(chǔ)器數(shù)據(jù)結(jié)構(gòu):structsuf_transition{charinput;charflag;structDAWG_node*destination;/*觸發(fā)狀態(tài)轉(zhuǎn)移的字節(jié)值*//*Flag(0=主邊(edge);1=次邊)*//忖旨向目的DAWG狀態(tài)(節(jié)點(diǎn))的指針承/structDAWG—node{intnode一id;/*作為狀態(tài)id的唯一整數(shù)Vintnum_transitions;/*從此狀態(tài)開(kāi)始的轉(zhuǎn)移的數(shù)量*/structsufjransition*next;/*從此狀態(tài)開(kāi)始的轉(zhuǎn)移列表,按輸入字節(jié)的ASCII值排序*/structDAWG—node*suffix_pointer;/*指向用于計(jì)算DAWG的虛擬樹(shù)中的父節(jié)點(diǎn)的指針*/};/7ag和"wm」ra似Wow的默認(rèn)值為0,除非明確定義或被計(jì)算。/7ag僅用于構(gòu)造DAWG,并且在實(shí)際串匹配中不發(fā)揮作用。僅在預(yù)處理(機(jī)器的計(jì)算)期間對(duì)^Wm^'o"使用指針。微代碼的實(shí)現(xiàn)使用狀態(tài)的m^ejcK從這些來(lái)計(jì)算實(shí)際存儲(chǔ)器地址)。DAWG機(jī)器索引結(jié)構(gòu)與AC機(jī)器索引結(jié)構(gòu)相同。以類似于上述針對(duì)AC機(jī)器所討論的方式來(lái)連續(xù)存儲(chǔ)DAWG索引和結(jié)構(gòu)。類似于DAWG的后綴樹(shù)識(shí)別在給定集中的模式的所有后綴(AC后綴樹(shù)算法采用反相模式作為輸入)。此結(jié)構(gòu)實(shí)質(zhì)上是未拆分成樹(shù)的DAWG,從而具有從源到任何其它狀態(tài)的唯一路徑。在以下提供后綴樹(shù)數(shù)據(jù)結(jié)構(gòu)的一個(gè)實(shí)施例的細(xì)節(jié),同時(shí)在圖15中示出了相應(yīng)存儲(chǔ)器數(shù)據(jù)結(jié)構(gòu)structtree—transition{charinput;/*觸發(fā)狀態(tài)轉(zhuǎn)移的字節(jié)值*/structsuffix—node*destination;/*指向destination后綴樹(shù)(suffixtree)狀態(tài)(節(jié)點(diǎn))的指針*/structsuffix—node{intnode—id;intnum」ransitions;structtreetransition*next;/*作為狀態(tài)id的唯一整數(shù)V/*從此狀態(tài)開(kāi)始的轉(zhuǎn)移的數(shù)量*//*從此狀態(tài)開(kāi)始的轉(zhuǎn)移列表,按輸入字節(jié)的ASCII值排序*//*其中掃描將結(jié)束的AC機(jī)器狀態(tài),從structAC—node*ACnode;由此后綴樹(shù)狀態(tài)識(shí)別為輸入的模式的源和反相開(kāi)始V};"謂jra"化/o似的默認(rèn)值為0,除非明確定義或被計(jì)算。ACnode是不同于DAWG和后綴樹(shù)的。在后者中,每個(gè)狀態(tài)經(jīng)由從開(kāi)始狀態(tài)開(kāi)始的唯一字節(jié)路徑(模式的子串)到達(dá)。因此,每個(gè)狀態(tài)具有表示該遍歷過(guò)的串的唯一AC機(jī)器節(jié)點(diǎn)。例如,假設(shè)后綴樹(shù)中的狀態(tài)^可從開(kāi)始狀態(tài)經(jīng)由串qC2C3…Cn到達(dá)。假定此串被提供作為AC機(jī)器的輸入。如果AC機(jī)器掃描停止在狀態(tài)c/,則^:^C"o^的值將被設(shè)置成^。僅在預(yù)處理(機(jī)器的計(jì)算)期間對(duì)cfe幼'"a"o"和XC"oA使用指針。微代碼的實(shí)現(xiàn)使用狀態(tài)的朋&—W(從這些來(lái)計(jì)算實(shí)際存儲(chǔ)器地址)。后綴樹(shù)機(jī)器使用與AC機(jī)器索引結(jié)構(gòu)相同的索引結(jié)構(gòu),同時(shí)以類似于上述針對(duì)AC機(jī)器所討論的方式來(lái)連續(xù)存儲(chǔ)后綴樹(shù)索引和結(jié)構(gòu)。在用于構(gòu)建模式數(shù)據(jù)結(jié)構(gòu)的預(yù)處理操作期間,對(duì)大小寫無(wú)關(guān)的模式掃描模式列表。為了保持狀態(tài)機(jī)的確定性以及能夠識(shí)別這些模式,無(wú)論它們出現(xiàn)在(在分組有效負(fù)載內(nèi))何種大小寫組合中,在一個(gè)實(shí)施例中產(chǎn)生該特定模式可發(fā)生的字節(jié)串的所有組合。所有這些新的組合被添加到模式列表,但是;wv指針用于指向初始模式,從而在存儲(chǔ)這些呈指數(shù)增加的數(shù)目的新模式時(shí)不浪費(fèi)存儲(chǔ)器空間。實(shí)際上,可使用人工或編程選擇操作來(lái)生成和/或移除大小寫無(wú)關(guān)模式。例如,雖然使用全部小寫以及大寫和僅首字母大寫的形式存儲(chǔ)基本相同的字符串的組合可能是合理的,但是生成包括隨機(jī)大寫的字符串的形式通常是十分不利的。如由阿霍和考拉斯克提出且參照以上說(shuō)明前述實(shí)現(xiàn)方案提供了對(duì)基本AC機(jī)器構(gòu)造算法的若干添加的功能,包括幼訴(移位)計(jì)算如由科羅凱默等人提出的這對(duì)于DAWG匹配算法是必需的;Q/^W(偏移量)和£>WAf深度)計(jì)算如果模式具有與分組的默認(rèn)的開(kāi)始和終點(diǎn)不相等的相關(guān)聯(lián)的偏移量和深度,則需要計(jì)算每個(gè)狀態(tài)的值。如果不對(duì)每個(gè)狀態(tài)計(jì)算這些值,可能作出非必要的狀態(tài)轉(zhuǎn)移;僅當(dāng)找到接受狀態(tài)時(shí),才了解輸出模式是否有效,以及在該進(jìn)程中是否錯(cuò)過(guò)某些有效模式;以及結(jié)合大小寫無(wú)關(guān)模式(/"cor;ora"wgcasezWe/ewde^/a〃ems):通過(guò)對(duì)大小寫無(wú)關(guān)模式計(jì)算串的所有可能組合,確??偸悄茏R(shí)別大小寫無(wú)關(guān)模式。在一個(gè)實(shí)施例中,在任意接受狀態(tài)的輸出被標(biāo)記為初始模式,而不是必須存儲(chǔ)模式的非必要組合??紤]圖6、7、8a、8b和9中所示的實(shí)施例以及上述的討論,DAWG和后綴樹(shù)算法可經(jīng)由在選擇的ME上執(zhí)行微代碼線程來(lái)實(shí)現(xiàn)。除上述描述之外,操作被概括為如下。首先,試圖將模式集(P)中的任何模式的可能的最長(zhǎng)前綴匹配到T的后綴。對(duì)于上述DAWG和后綴樹(shù)算法,前綴值可通過(guò)識(shí)別集(P)中的模式的AC機(jī)器的等效狀態(tài)來(lái)表示。對(duì)于流中的第一個(gè)分組,在前一模式中所匹配的模式的前綴是空串,所以pwv—W^e輸入將是AC機(jī)器的開(kāi)始狀態(tài)。對(duì)于任何分組,如果此值不等于開(kāi)始狀態(tài),則AC機(jī)器用于從由;^ev一WWe開(kāi)始在前向方向的第一字符掃描T,一直掃到獲得合適的移位值,而且DAWG可開(kāi)始其掃描。在循環(huán)迭代期間,向著分組的末端掃描,分組內(nèi)容中擬由DAWG掃描的子串將越過(guò)分組的末端(即,pw>=分組的大小)。當(dāng)發(fā)生這種情況時(shí),需要跳出循環(huán)并在AC機(jī)器離開(kāi)前一次循環(huán)迭代的地方、即在分組中同一狀態(tài)及同一字符位置處,重新開(kāi)始對(duì)分組進(jìn)行掃描。AC機(jī)器可繼續(xù)掃描直至到達(dá)分組的末端,這時(shí),將AC機(jī)器的狀態(tài)作為prev一^^e記錄在相關(guān)聯(lián)流表?xiàng)l目中,該條目用于初始化狀態(tài)以處理序列中的下一個(gè)分組。僅當(dāng)流的分組順序到達(dá)時(shí),用于檢測(cè)跨越多個(gè)分組的模式的這種機(jī)制才起作用。僅當(dāng)當(dāng)前分組具有比流中先前已到達(dá)的分組的序號(hào)大1時(shí),;7wv—wwe才有意義。如果分組并非按次序到達(dá)(這被應(yīng)用于TCP和其它面向連接的協(xié)議),則這種模式檢測(cè)無(wú)法僅通過(guò)在流條目中存儲(chǔ)p"v—來(lái)實(shí)現(xiàn)。對(duì)于某些情形,這些問(wèn)題通過(guò)存儲(chǔ)這些狀態(tài)值以及相關(guān)聯(lián)的分組序號(hào)的多個(gè)實(shí)例來(lái)解決。然而,如果分組到達(dá)而按序的前一個(gè)分組還未被掃描,則這種解決方案不起作用(這是因?yàn)闄C(jī)器數(shù)據(jù)結(jié)構(gòu)的特性使得難以在分組的起始處檢測(cè)模式后綴;相比之下,在分組的末端檢測(cè)模式前綴較為容易)。另一種方法將是使用緩沖和存儲(chǔ)數(shù)據(jù)值的組合。在這種實(shí)現(xiàn)方案中,如果分組不按次序到達(dá),則其將被緩存直至按序的前一個(gè)分組到達(dá)并被掃描。如上所討論的,可提供偏移量和深度標(biāo)記值以減少需要搜索的分組的部分或多個(gè)分組。這種思想是在AC機(jī)器掃描的每個(gè)步驟期間,應(yīng)當(dāng)能夠依照要掃描的字符位置來(lái)檢查偏移量和深度值,并且確定是否正在正確的路徑上進(jìn)行。如果與當(dāng)前狀態(tài)相關(guān)聯(lián)的值與當(dāng)前文本位置不符,則作出失敗轉(zhuǎn)移。AC機(jī)器狀態(tài)表示正在搜索的模式的一個(gè)或多個(gè)前綴。因此,為了確保不錯(cuò)過(guò)任何模式,必須對(duì)該狀態(tài)設(shè)置最保守的偏移量和深度值。如科羅凱默等人以及上述預(yù)處理算法中所描述的,對(duì)其使用的公式是與用于計(jì)算移位值的那些相同。無(wú)論何時(shí)模式被處理,分別基于從開(kāi)始狀態(tài)的距離和直到模式末端的距離來(lái)計(jì)算狀態(tài)的偏移量和深度。當(dāng)在處理后續(xù)模式期間,再次到達(dá)該狀態(tài),則計(jì)算偏移量作為當(dāng)前所計(jì)算值和預(yù)置值的最小值;計(jì)算深度作為當(dāng)前所計(jì)算值和預(yù)置值的最大值(未指定深度將是無(wú)窮大一高于所有指定值的一個(gè)值)。在失敗狀態(tài)計(jì)算期間,無(wú)需改變偏移量和深度;如果在分組掃描期間碰到具有無(wú)效的偏移量或深度,則自動(dòng)跳轉(zhuǎn)到失敗狀態(tài)。前述方案對(duì)其中單個(gè)分組被搜索的情形起作用。如以上所討論,在一個(gè)實(shí)施例中,提供了對(duì)其中跨分組應(yīng)用偏移量和/或深度的情形的處理。為了實(shí)現(xiàn)此方案,一旦應(yīng)用模式數(shù)據(jù)結(jié)構(gòu)被復(fù)制到本地存儲(chǔ)器,就需要對(duì)其進(jìn)行更改,以調(diào)節(jié)偏移量和/或深度值。同時(shí),相應(yīng)數(shù)據(jù)需要存儲(chǔ)在相關(guān)聯(lián)流表?xiàng)l目(例如,在統(tǒng)計(jì)信息中)中以反映1)需要對(duì)該模式數(shù)據(jù)結(jié)構(gòu)進(jìn)行調(diào)節(jié);以及2)這些調(diào)節(jié)需要是哪些。在大多數(shù)示例中,無(wú)需跨多個(gè)分組執(zhí)行偏移量和深度搜索。在適用模式集包括大量搜索串的情況,在統(tǒng)計(jì)信息中為每個(gè)模式保持偏移量和/或深度狀態(tài)信息通常是不切實(shí)際的。同時(shí),偏移量和深度搜索通常用于查找特定特征(或僅少數(shù)特征)。結(jié)果,與該(這些)特征相對(duì)應(yīng)的統(tǒng)計(jì)信息可被保持在流表?xiàng)l目中而不用消耗過(guò)多的存儲(chǔ)器??缭椒纸M的偏移量和深度搜索是否要被支持留待具體實(shí)現(xiàn)。吳-曼伯(Wu-Manber)算法實(shí)現(xiàn)在某些實(shí)施例中,采用基于吳-曼伯算法的搜索方案([WM92]S.吳、U.曼伯的"FastTextSearchingAllowingErrors(允許誤差的快速文本搜索)",ACM通信,35(10):83-91(1992);以及[WM94]S.吳和U.曼伯的"Afastalgorithmformulti-patternsearching(多模式搜索的快速算法)"。技術(shù)報(bào)告TR-94-17,亞利桑那大學(xué),1994)。吳和曼伯根據(jù)基于以上所述算法的狀態(tài)機(jī)來(lái)采取十分不同方法。這些算法還在每次匹配字符塊而非單個(gè)字符的方面彼此不同。如果所有模式的總長(zhǎng)度是M,則推薦的塊大小(B)為log^2M。該算法預(yù)計(jì)算稱為SHIFT(移位)、HASH(散列)和PREFIX(前綴)的三個(gè)查找表。SHIFT表由為一個(gè)字符塊的散列映射的整數(shù)來(lái)進(jìn)行索引;此表等效于眾所周知的波耶-莫爾(Boyer-Moore)算法中的壞字符表(波耶和J.莫爾的"Afaststringsearchingalgorithm(快速串搜索算法)",ACM通信,20:762-772,1977)。多個(gè)模式共用的子串的條目包含一較為保守的最小可能移位值。對(duì)于較大的B值,表可通過(guò)將若干串映射到同一位置、在每種情形中設(shè)置最小移位值來(lái)進(jìn)行壓縮。用于對(duì)SHIFT進(jìn)行索引的整數(shù)還用于對(duì)HASH進(jìn)行索引,該HASH存儲(chǔ)指向映射到該整數(shù)的串的指針。PREFIX表包含對(duì)每個(gè)模式的前綴的散列值,前綴的大小是與實(shí)現(xiàn)方案相關(guān)。在每個(gè)算法步驟中,B個(gè)字符的集合(文本子串的右端被掃描)被散列成一個(gè)整數(shù),該整數(shù)用于査找SHIFT值。如果該值大于O,則對(duì)文本進(jìn)行移位。否則,計(jì)算此串(大小為^,其中m,為最短模式的長(zhǎng)度)的前綴的散列,并且將與相應(yīng)HASH條目中的每個(gè)串的前綴匹配(使用PREFIX表)。如果前綴匹配,則發(fā)生實(shí)際文本匹配。此算法取決于大部分是均勻的模式大小,因?yàn)樵谄ヅ淦陂g僅考慮最短模式長(zhǎng)度。模式數(shù)據(jù)結(jié)構(gòu)及其相應(yīng)的存儲(chǔ)器數(shù)據(jù)結(jié)構(gòu)與用于DAWG匹配算法的那些相同。對(duì)模式數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化使得易于擴(kuò)展內(nèi)容檢查框架并實(shí)現(xiàn)不同的搜索算法。移位表被構(gòu)造成兩維整型數(shù)組S[n][4]。如圖16以及以下的示例性移位表存儲(chǔ)器數(shù)據(jù)結(jié)構(gòu)中所示的,每個(gè)表?xiàng)l目S[k]包括指向整型數(shù)組的指針,該數(shù)組具有如下結(jié)構(gòu)S[k]:int;/*主移位值*/S[k][l]:int;/*次移位值*/S[k][2]:int;/*偏移量*/S[k][3]:int;/*深度*/}1'是用于對(duì)移位表進(jìn)行索引的值(通常為長(zhǎng)整型)。如果字母表的大小是A而用作散列值的子串(串塊)的大小為B,則表的最大大小為AB。是從B個(gè)字符的塊獲得的(單一)散列值(最簡(jiǎn)單的散列函數(shù)將塊考慮成以A為基的有B個(gè)位的數(shù))。主移位指掃描位置必須向右移動(dòng)的距離。僅當(dāng)所掃描的子串與模式之一中的合適位置處的子串相匹配時(shí),此值才為0。次移位指僅當(dāng)主值為0時(shí),掃描位置必須向右移動(dòng)的距離。在針對(duì);Wmao;j/ny^O處理了文本位置之后,此移位值替代默認(rèn)移位值1。此值總是大于O(因此,當(dāng)戶n'm^y_57折等于0時(shí),大于一ma^。偏移量是從分組內(nèi)容的起始處開(kāi)始的最小距離,其中(假設(shè)所有模式被截?cái)喑勺钚∧J酱笮?可能存在以所考慮的當(dāng)前子串結(jié)束的有效模式。深度是從分組內(nèi)容的起始處開(kāi)始的最大距離,其中(假設(shè)所有模式被截?cái)喑勺钚∧J酱笮?以所考慮的當(dāng)前子串結(jié)束的有效模式必須在該分組內(nèi)容之內(nèi)結(jié)束。僅當(dāng)主移位(pWmflo^/nyi)值為0時(shí),即,當(dāng)文本(分組內(nèi)容)中的子串與所考慮的模式之一的末端匹配時(shí),偏移量、深度和(次—移位)值有意義并被使用。HASH表被構(gòu)造成一維指針數(shù)組H[n]。如圖17的示例性HASH表存儲(chǔ)器數(shù)據(jù)結(jié)構(gòu)中所示,每個(gè)表?xiàng)l目H[k]包括指向模式數(shù)據(jù)結(jié)構(gòu)的指針。對(duì)表的索引與移位表的相同。模式(截?cái)喑勺钚∧J酱笮?按其末端的B個(gè)字符的塊的散列值來(lái)存儲(chǔ)。H[k]的值是具有大于或等于的散列值的在此分類表中的第一個(gè)模式。因?yàn)槟J綌?shù)據(jù)結(jié)構(gòu)具有固定大小,所以可以隨機(jī)方式從存儲(chǔ)器中訪問(wèn)它們。因此,模式數(shù)據(jù)結(jié)構(gòu)的地址可使用模式在數(shù)組中的序號(hào)來(lái)計(jì)算。因而,存儲(chǔ)在存儲(chǔ)器的HASH表中的值包括模式索引號(hào)(從0到肌mZ)"一o/》a"ems-l(模式的數(shù)量-l))而非實(shí)際地址,以便于使模式可再定位。PREFIX表被構(gòu)造成一維整型數(shù)組(通常使用長(zhǎng)整型)。表的大小等于在模式集中的模式的數(shù)量,并且模式(或模式索引號(hào))被用作對(duì)前綴表的任何條目的索引。值Prefix[k]是模式號(hào)(k,('k,從0到"ww6er—o/_jfl"enw-l)中的第一個(gè)B'個(gè)字符的散列值。通常以與對(duì)移位表進(jìn)行計(jì)算的相同的方式來(lái)計(jì)算散列(通過(guò)將前綴考慮成由B'個(gè)位構(gòu)成的以A為基的數(shù)字)。在存儲(chǔ)器表示中(在圖18中示出其一個(gè)實(shí)施例),每個(gè)表?xiàng)l目是未更改的前綴值,因?yàn)橐褂玫淖帜副戆ㄕ麄€(gè)ASCII集。SHIFT和HASH表兩者包含大量冗余信息。這些表的大小是指數(shù)的,而模式集可能在數(shù)量上較少。因此,希望大多數(shù)SHIFT表值等于默認(rèn)值。類似地,大量HASH表?xiàng)l目將包含從不查找的無(wú)用信息。另一方面,存儲(chǔ)器的顯著浪費(fèi)通過(guò)以固定時(shí)間査找信息的性能受益來(lái)補(bǔ)償。對(duì)于較大的B值(3或更大),存儲(chǔ)器使用成為阻礙,所以使用B+樹(shù)作為壓縮數(shù)據(jù)結(jié)構(gòu),并且對(duì)獲取任何信息塊需要相對(duì)較小的查找次數(shù)。此B+樹(shù)被構(gòu)造成節(jié)點(diǎn)樹(shù),其中每個(gè)葉節(jié)點(diǎn)具有從根開(kāi)始的固定距離。盡管葉節(jié)點(diǎn)的數(shù)量可以任意的,但是將深度選擇為二,這對(duì)大多數(shù)實(shí)際目的是足夠的。每個(gè)子節(jié)點(diǎn)是以下結(jié)構(gòu)的數(shù)組structPattern*patlist—start;/*指向模式列表的開(kāi)始的指針(HASH表?xiàng)l目)*/structPattern*patlist—end;/*指向模式列表的末端的指針(下一HASH表?xiàng)l目)*/圖19中示出了根節(jié)點(diǎn)的示例性存儲(chǔ)器結(jié)構(gòu)。根具有'A'個(gè)欣""free—m^e類型的元素,其中A是字母表的大小(在ASII集的情形中為256)。structhash—record{longkey_value;intprimary—shift;intsecondary_shift;intoffset;intdepth;鄺Hash值(對(duì)SHIFT和HASH表的索引)*//*主移位(如在SHIFT中)*//*次移位(如在SHIFT中)*//*Offset(偏移量)(如在SHIFT中)*//*Depth(深度)(如在SHIFT中)*/intpstart;/*jua^w—WaW的分類表中的模式數(shù)量*/intpend;/*的分類表中的模式數(shù)量*/根節(jié)點(diǎn)是特殊節(jié)點(diǎn)且是固定大小數(shù)組,每個(gè)元素構(gòu)造成如下structbplus—tree—node{structhash—record*list;/*指向子節(jié)點(diǎn)的指針*/intnum—elements;(列表)中的元素的數(shù)量V};structbplus_tree_noderoot[A];考慮SHIFT表。如果索引值是B個(gè)字符c,C2.XB的塊(chunk)的散列,根的每個(gè)元素可通過(guò)計(jì)算該塊Cl的最高有效字節(jié)的散列值來(lái)隨機(jī)地訪問(wèn)。該塊(c2.xB)的剩余部分被映射到子節(jié)點(diǎn)的元素的&;;一va/we(關(guān)鍵一值)。每個(gè)子節(jié)點(diǎn)(列表)不需要包含對(duì)大小B-1的串的所有可能散列值的條目;它僅包含不具有相關(guān)聯(lián)默認(rèn)主移位值(它等于M/"/mwmj加em—Wze-B+1)的那些元素的條目。為了訪問(wèn)放置在SHIFT—table[dC2,.CB]中的信息,查找rao《"7.//W&」(其中//W向指0^(/.//^向中具有關(guān)鍵值=02..化的散列值的元素)。以相同方式查找HASH表。前述結(jié)構(gòu)中每個(gè)條目的含義通常是自明(self-evident)的。;a〃/Wj"d和;em/參數(shù)不引用從特定HASH表?xiàng)l目獲得的模式列表的中的最后模式;而是引用由下一HASH條目的指向的模式,或者引用全局分類模式列表中跟隨在此模式列表之后的模式。圖20示出了子節(jié)點(diǎn)存儲(chǔ)器數(shù)據(jù)結(jié)構(gòu)的一個(gè)實(shí)施例。盡管根節(jié)點(diǎn)和子節(jié)點(diǎn)的每一個(gè)都被設(shè)計(jì)成在存儲(chǔ)器中可獨(dú)立再定位,但是圖20的實(shí)施例被實(shí)現(xiàn)為子節(jié)點(diǎn)緊跟在根結(jié)構(gòu)之后。而且子節(jié)點(diǎn)以連續(xù)方式寫入到存儲(chǔ)器中,按父元素的索引值來(lái)排序。連續(xù)存儲(chǔ)此數(shù)據(jù)使得易于存儲(chǔ)器預(yù)分配,并且僅需要顯式指定一個(gè)指針(根的第一個(gè)字的地址)。吳-曼伯算法假設(shè)所有模式的長(zhǎng)度相等;其正確操作依賴于該假設(shè)。因?yàn)檫@并非實(shí)際的假設(shè),所以需要將所有串截?cái)喑勺疃棠J?。在算法運(yùn)行期間,當(dāng)找到候選位置時(shí),匹配完整模式。對(duì)傳遞到所有預(yù)處理函數(shù)的模式進(jìn)行截?cái)?。在本說(shuō)明書(shū)最后的附錄中提供了用于構(gòu)建SHIFT、HASH、PREFIX、和B+樹(shù)的偽代碼的示例。另外,同樣在附錄中提供了用于實(shí)現(xiàn)吳-曼伯算法的變體的偽代碼。附錄中的吳-曼伯算法顯著不同于[WM94]中所述的。該算法支持模式的額外特征,諸如偏移量、深度和大小寫無(wú)關(guān)。在基本算法中還存在另一個(gè)不同點(diǎn),該不同點(diǎn)是次移位值。在由吳和曼伯的[WM94]提出的初始算法中,若主移位值結(jié)果為0,則跳躍值被強(qiáng)制為1。這必定確保正確操作,但是跳躍值為1過(guò)于保守。次移位表示為了匹配所考慮的子串(大小為B的塊)必需要跳過(guò)的最小距離。此跳躍的最大安全值是在SHIFT表的計(jì)算期間計(jì)算的第二小移位,這恰恰是次移位的定義。如從吳-曼伯算法描述顯而易見(jiàn),當(dāng)對(duì)下一分組執(zhí)行算法時(shí)將與前一分組的末端(后綴)匹配的任一模式的最大前綴提供給該算法作為輸入。此信息以兩個(gè)部分來(lái)提供Fe/b^。A/MM,其前綴被匹配的模式串的第一字節(jié)的地址;以及廠e/bc—/wgA,前綴的大小(或者被成功匹配的模式的字節(jié)的數(shù)量)。對(duì)于流中的第一個(gè)分組,在前一個(gè)模式中被匹配的模式的前綴是空串,所以;^e/bc一/e"gA參數(shù)值將是0,并且prey:c—afiWreM未被初始化。在循環(huán)迭代期間,向分組的末端掃描,用作對(duì)表?xiàng)l目的索引的塊將跨越分組的末端(即,位置(pow/o")>=分組的大小)。當(dāng)發(fā)生這種情況時(shí),必須部分地返回到原始的串匹配算法。雖然在分組的末端仍剩一些已被檢査的字符,但是這些與在模式集中的每個(gè)模式的(相同大小的)前綴匹配。一旦獲得匹配,則該匹配的長(zhǎng)度和地址被分別記錄到;reyx_/egA和^eyk_aaW"^中。當(dāng)要掃描序列中下一個(gè)分組時(shí),此被匹配前綴被添加到分組的內(nèi)容并以常規(guī)方式進(jìn)行掃描。當(dāng)分組不按次序到達(dá)時(shí),用于匹配跨越多個(gè)分組的模式的這種技術(shù)失敗。在分組開(kāi)始處匹配任意后綴、希望分組它是在從前一個(gè)分組中開(kāi)始的模式的一部分將不起作用。如DAWG匹配情形所述的,緩沖和狀態(tài)保持的組合可提供全面的解決方案。在某些實(shí)施例中,前述吳-曼伯算法還可用于偏移量/深度搜索。雖然試圖匹配模式,但是還必須確保滿足偏移量和深度的限制,并且不浪費(fèi)計(jì)算周期來(lái)嘗試匹配可能存在但結(jié)果具有無(wú)效的極限值的模式。因此,使有效偏移量和深度值與每個(gè)SHIFT表?xiàng)l目關(guān)聯(lián)。以與設(shè)置移位值相同的方式設(shè)置偏移量和深度值,即通過(guò)選擇最安全的可能值。如果字節(jié)塊S用于對(duì)SHIFT表進(jìn)行索引,則相應(yīng)的偏移量被設(shè)置成以此塊結(jié)束的任意模式的最小偏移量(該模式首先被截?cái)喑勺疃棠J介L(zhǎng)度)。類似地,深度被設(shè)置成(depth-length+minimum_pattern—size(深度-長(zhǎng)度+最大_模式_大小))的最大值,這指示經(jīng)截?cái)嗟哪J奖仨氃谖谋緝?nèi)結(jié)束。在分組掃描期間,當(dāng)觀測(cè)到主移位值為0時(shí),首先檢查偏移量和深度(從表中查找)并將它們與當(dāng)前文本位置相匹配。僅當(dāng)滿足限制時(shí),才通過(guò)由HASH表指示的模式的列表進(jìn)行循環(huán)。在此過(guò)程期間,在前綴表匹配成功之后以及在試圖逐字節(jié)進(jìn)行整個(gè)模式匹配之前,與模式自身相關(guān)聯(lián)的偏移量和深度與當(dāng)前文本位置相匹配。如果當(dāng)前位置在邊界內(nèi),則嘗試完整的模式匹配。如果上述偏移量和深度檢査的任一個(gè)失敗,則將位置遞增等于次移位的值,并繼續(xù)搜索。幸運(yùn)地是,與DAWG匹配算法相比,大小寫無(wú)關(guān)可通過(guò)吳-曼伯算法以高得多的存儲(chǔ)效率來(lái)處理。要進(jìn)行的額外工作被轉(zhuǎn)移到預(yù)處理階段。在更新SHIFT表時(shí),如果處理大小寫無(wú)關(guān)模式,則計(jì)算所考慮的B長(zhǎng)度塊的所有大小寫相關(guān)的組合的并且調(diào)節(jié)與這些組合的每一個(gè)相對(duì)應(yīng)的SHIFT表?xiàng)l目。對(duì)于HASH和PREFIX表,從大小寫無(wú)關(guān)模式的小寫等效物來(lái)計(jì)算索引和前綴值。在分組掃描期間,SHIFT表查找是直接的,并且不需要對(duì)由吳和曼伯所提出的初始算法有任何添加,因?yàn)閷?duì)所有可能的大小寫組合都存在有效SHIFT條目。但是對(duì)于HASH表査找,需要計(jì)算兩個(gè)單獨(dú)的索引值正常索引,使用塊照其原樣的字符;以及小寫索引,通過(guò)將B塊中的所有大寫字符轉(zhuǎn)換成小寫。當(dāng)僅從小寫字符計(jì)算大小寫無(wú)關(guān)的模式的HASH條目時(shí),需要第二索引。在檢査前綴的整個(gè)周期之后,對(duì)完整模式進(jìn)行兩次匹配,一次以正常索引值進(jìn)行而另一次以小寫索引值進(jìn)行。類似地,計(jì)算模式前綴的正常和小寫版本。如果所考慮的模式是大小寫無(wú)關(guān)的,則匹配小寫前綴,否則匹配正常前綴。一旦進(jìn)到逐字節(jié)地將模式與分組內(nèi)容進(jìn)行匹配,則大小寫無(wú)關(guān)匹配將變得直接。在一個(gè)實(shí)施例中,內(nèi)容檢查框架被設(shè)計(jì)成可插入到先前實(shí)現(xiàn)的帶狀態(tài)防火墻框架中的模塊。在英特爾IXP處理模型中,內(nèi)容檢查框架可作為單個(gè)微塊(microblock)插入到任何分組處理管線中。在一個(gè)實(shí)施例中,防火墻使用CA(條件動(dòng)作)對(duì)來(lái)進(jìn)行規(guī)則處理。例如,某些CA規(guī)則可與內(nèi)容檢查相關(guān),如對(duì)具有分組內(nèi)容的特定侵入模式進(jìn)行檢查(條件),如果檢測(cè)到該模式則丟棄該分組(動(dòng)作)。圖21中示出了用于典型的內(nèi)容檢查CA規(guī)則的存儲(chǔ)器映射。保存最初兩個(gè)字(或第一個(gè)長(zhǎng)整型字),并且實(shí)際信息從8字節(jié)偏移量處開(kāi)始。這些字段的每一個(gè)的含義如下1.算法代碼這表示要使用的搜索算法的類型。1=DAWG—匹配算法2=后綴樹(shù)一匹配算法3=吳-曼伯算法4=使用B+樹(shù)結(jié)構(gòu)的吳-曼伯算法以替代SHIFT和HASH表5=給定精確開(kāi)始位置的匹配模式(即,假定模式從指定位置開(kāi)始,或者完全不存在)示用于模式搜索的數(shù)據(jù)結(jié)構(gòu)的地址(或指向地址索引的指針)。對(duì)于最初4個(gè)算法,此地址指向主索引的第一個(gè)字;這包含與用于檢査的各種數(shù)據(jù)結(jié)構(gòu)的地址相關(guān)的信息。3.'跨越模式檢查'策略對(duì)于最初4中算法代碼,這僅是具有值為0(表示不對(duì)可跨越多個(gè)分組的模式作出檢查)或者為1(表示必須作出這種檢查)的標(biāo)記。對(duì)于精確位置匹配,此字段表示其中執(zhí)行模式匹配的分組內(nèi)容中的位置(作為從第一個(gè)字節(jié)開(kāi)始的偏移量)。為了對(duì)跨越多個(gè)分組的模式進(jìn)行檢査,必須存儲(chǔ)部分匹配信息(DAWG匹配的AC狀態(tài),吳-曼伯的模式地址和前綴長(zhǎng)度)以及流表中與當(dāng)前流相對(duì)應(yīng)的條目。當(dāng)要處理的下一個(gè)分組到達(dá)時(shí),還需要存儲(chǔ)與所存儲(chǔ)的信息的有效性相關(guān)的某些信息。因此,對(duì)于TCP流,存儲(chǔ)下一個(gè)預(yù)期的偏移量的序號(hào)以及狀態(tài)信息。可為任何其它面向連接的協(xié)議存儲(chǔ)類似種類的序列信息。在流表?xiàng)l目的一個(gè)實(shí)施例中,此信息以下面方式來(lái)存儲(chǔ)第一個(gè)字是下一個(gè)分組中的第一個(gè)字節(jié)的預(yù)期的序號(hào),第二個(gè)字是來(lái)自前一次掃描的末端AC機(jī)狀態(tài)(對(duì)于算法代碼1和2)或前綴長(zhǎng)度(算法代碼3和4)的前綴長(zhǎng)度,而第三個(gè)字是部分匹配的模式地址(僅用于算法代碼3和4)。初始化和代碼加載回到圖7,在網(wǎng)絡(luò)線路卡或網(wǎng)絡(luò)設(shè)備的初始化期間,本文所述的有助于各種分組處理和內(nèi)容檢查功能以及操作的編碼指令(例如微代碼)被加載到所選擇的ME的控制存儲(chǔ)728中。通常,可從包括諸如閃存設(shè)備的非易失性存儲(chǔ)設(shè)備的指令存儲(chǔ)715加載指令。非易失性存儲(chǔ)的其它示例包括只讀存儲(chǔ)器(ROM)、可編程ROM(PROM)和電可擦PROM(EEPROM)。除從本地存儲(chǔ)設(shè)備(到線路卡700的)加載指令之外,可從外部源加載指令。例如,在一個(gè)實(shí)施例中,指令可被存儲(chǔ)在由另一個(gè)線路卡(未示出)作為宿主的磁盤驅(qū)動(dòng)器上或另外由其中安裝了線路卡700的網(wǎng)絡(luò)元件提供。在又一個(gè)實(shí)施例中,經(jīng)由諸如載波的網(wǎng)絡(luò)從遠(yuǎn)程服務(wù)器等下載指令。通常,在附圖中示出以及本文所討論的功能塊的每一個(gè)可經(jīng)由在一個(gè)或多個(gè)計(jì)算引擎上執(zhí)行的相應(yīng)線程使用硬件中的可編程邏輯、固件/軟件中的可編程邏輯,或者兩組的組合來(lái)實(shí)現(xiàn)。例如,在一個(gè)實(shí)施例中,對(duì)于深度分組檢査模塊202、流管理器204、隊(duì)列管理器708和接收引擎710的每一個(gè)所示的操作通過(guò)在NPU中的一個(gè)或多個(gè)計(jì)算引擎上執(zhí)行的相應(yīng)指令線程以結(jié)合到用于分組處理的上下文管線的方式而易于進(jìn)行。可選地,由前述功能塊所提供的各個(gè)操作的全部或一部分可通過(guò)嵌入在NPU等上的適當(dāng)編程的邏輯來(lái)實(shí)現(xiàn)。因而,本發(fā)明的實(shí)施例可用作或用于支持在某種方式的處理核心上執(zhí)行的,或者在機(jī)器可讀介質(zhì)之上或之內(nèi)實(shí)現(xiàn)的固件/軟件模塊和/或程序。機(jī)器可讀介質(zhì)包括用于以可通過(guò)機(jī)器(例如,計(jì)算機(jī))讀取的形式存儲(chǔ)或發(fā)送信息的任何機(jī)制。例如,機(jī)器可讀介質(zhì)可包括諸如只讀存儲(chǔ)器(ROM);隨機(jī)存取存儲(chǔ)器(RAM);磁盤存儲(chǔ)介質(zhì);光學(xué)存儲(chǔ)介質(zhì);以及閃存設(shè)備等。另外,機(jī)器可讀介質(zhì)可包括傳播信號(hào),諸如電學(xué)、光學(xué)、聲學(xué)或其它形式的傳播信號(hào)(例如載波、紅外信號(hào)、數(shù)字信號(hào)等)。以上所示本發(fā)明的實(shí)施例的描述一包括在摘要中所述的一并非旨在窮舉的或?qū)⒈景l(fā)明限制在所公開(kāi)的精確形式。雖然出于示例性目的,這里描述了本發(fā)明的特定實(shí)施例或其示例,但是本領(lǐng)域技術(shù)人員應(yīng)當(dāng)認(rèn)識(shí)到,落在本發(fā)明的范圍內(nèi)的各種等效更改是可能的。依照以上詳細(xì)描述,能夠?qū)Ρ景l(fā)明作出的這些更改。在以下權(quán)利要求中所用的術(shù)語(yǔ)不應(yīng)當(dāng)解釋成將本發(fā)明限于說(shuō)明書(shū)和附圖所公開(kāi)的實(shí)施例。相反,本發(fā)明的范圍應(yīng)當(dāng)完全由以下權(quán)利要求來(lái)確定,這些權(quán)利要求根據(jù)權(quán)利要求說(shuō)明所建立的原則來(lái)解釋。附錄l.下面以偽-C代碼給出構(gòu)建SHIFT表的算法。輸入模式數(shù)組、用于散列到表(B)的塊大小、字母表大小(A)輸出指向SHIFT表的指針int**build_SHIFT_table(Wrwcf*尸,/"fwww_paf,Z"f5,/*初始化*/table—size=AB;min_pattern—size=minimum(Pi,length);default—offset=minimum(Pi.offset);default—depth=minimumCPi.depth);for(SHIFT—table的每一條目,i:0到table—size-1)/*在模式處理之前將每個(gè)條目初始化到默認(rèn)值*/SHIFT—table[O][O]=min_pattern_size-B+l;SHIFTtable[O][l]=min_pattern—size-B+1;SHIFT—table[2]=defaultoffset;SHIFT—table[3]=default—depth;/*處理模式并更新SHIFTjable值Vfor(每一模式Pj,i:0至ijnum_pat-l)for(每一子串S=Pi.string[j...j+B-1],j:0到min_pattem—size國(guó)B)/*計(jì)算對(duì)SHIFT—table進(jìn)行索引的散列值*/Sval=HASH—value(S);/H十算主移位作為從子串的開(kāi)始位置到模式末端的最小偏移量*/SHIFT一table[Sval][O]=minimum(SHIFT—table[Sval][O],min_pattern_size-j-B);/*計(jì)算次移位作為特定子串的第二最小移位值*/SHIFT—table[Sval][l]=(min—size-j-B)嚴(yán)格大于SHIFT—table[SvaI][O]的最小值;/*計(jì)算偏移量作為包含此子串的所有模式中的最小偏移量*/SHIFT—table[Sva1][2]=minimum(SHIFT—table[Sval][2],P;.offset);/*計(jì)算深度作為包含此子串的所有模式中的最大深度*/SHIFT—table[Sva1][3]=maximum(SHIFT一table[Sval][3],Pi.depth-Pi.length+min_pattern—size);/*更新大小寫無(wú)關(guān)模式的SHIFT—table*/if(P"fcase==0)for(S的每種可能的大小寫組合)val=HASH—value(S的實(shí)例);/*更新所有四個(gè)字段以與上述相同的方式更新兩個(gè)移位、偏移量和深度*/update(SHIFT_table同);}returnSHIFT—table;2.下面以偽-C代碼給出構(gòu)建HASH表的算法。輸入模式數(shù)組、用于散列到表(B)的塊大小、字母表大小(A)輸出指向HASH表的指針structPattern**build—HASH_table(Wrw"尸a"erw*尸,/wfwwm5,/wf々/*初始化*/table—size=AB;min_pattern—size=minimum(Pi.length);sort(P,以基于從每個(gè)Pi.string[min_pattern—size-B...minjattern一size-l]計(jì)算的散歹U值的升序);/*初始化指向HASH_table的索引值*/index=0;for(每一模式Pi,i:0到num_pat-l)"獲得各個(gè)模式以其為末端的B個(gè)字符的子串"S=Pi.string[min_pattern—size-B...min_pattern—size-l];/*如果模式是大小寫無(wú)關(guān)的,則將其映射到其小寫等效物*/if(P"fcase==0)S=convert一toJower一case(S);Sval=HASH一value(S);while(Sval<count)/*持續(xù)更新表值和指針直至散列值足夠大*/HASH一table[index]=P;;HASH—tablejpattern—number[index]=i;index++;}/*對(duì)于較大的索引值,使用空指針填充條目;這是無(wú)關(guān)緊要的,因?yàn)閺牟粫?huì)查找這些索引值*/for(每個(gè)i:index至!jtable—size-l)HASH—table[index]=Pnum_pat;HASH—table_pattern—number[index]=num_pat;returnHASH一table;3.下面以偽-C代碼給出構(gòu)建PREFIX表的算法。輸入模式數(shù)組、前綴的大小(B')、字母表大小(A)輸出指向PREFIX表的指針longint*build一PREFIX—table(sfrw",wwmfwW,/*初始化*/table_size=num_pat;for(每一模式Pi,i:0到num_pat-l)/H十算前綴值的散列;如果模式是大小寫無(wú)關(guān)的,則將前綴轉(zhuǎn)換成小寫并計(jì)算散列*/S=Pi.string;if(P,'.fcase==0)S=convert一toJower一case(S);PREFIX—table[i]=HASH—value(S);returnPREFIXtable;4.下面以偽-C代碼給出構(gòu)建B+樹(shù)的算法。輸入按散列值(以與SHIFT和HASH相同的方式來(lái)計(jì)算散列)排序的模式的數(shù)組、前綴的大小(B')、字母表大小(A)、SHIFT表、HASH表輸出指向B+樹(shù)的根的指針sturctbplus—tree—node*build—Bplus—tree(z'wf*W/Fr」。6/e,"rw"尸a"em/加/H十算默認(rèn)主移位;這些是將刪去的條目*/min_pattern—size=minimum(Pj.length);default_primary—shift=min_pattern—size-B+1;start=0;/*初始化SHIFT表要開(kāi)始掃描的條目位置*//*每次迭代生成子節(jié)點(diǎn)*/for(i:OtoA-l)39/*在每次循環(huán)迭代期間處理ab"shift和hash表的條目以及對(duì)具有非默認(rèn)的主移位的每個(gè)條目生成散列記錄*/counter=0;for(j:starttostart+AB")if(SHIFT一table。]!=default_primary—shift)/*添加所有SHIFT和HASH表信息以及設(shè)置關(guān)鍵〃root[i].list[counter].primary—shift=SHIFT_table[j][O];root[i].list[coimter].secondary—shift=SHIFT一table[j]root[i].list[counter].offset-SHIFT一table[j][2];root[i],list[counter].depth=SHIFT一table[j][3];root[i].list[counter].patlist—start=HASH—table[j];root[i],list[counter].patlist—end=HASH一table[j+l];root[i].list[counter].pstart=HASH_table_pattern—numberroot[i].list[counter].pend=HASH—table_pattern—number[jroot[i].list[counter].key—value=j-start;counter++;root[i].num_elements=count;start=start+AB";returnroot;如果所有記錄(包括具有默認(rèn)移位值的記錄)被添加,則字段實(shí)際上是虻^7ecoW結(jié)構(gòu)列表的索引。因此,以上算法確保list(每個(gè)樹(shù)的孩子節(jié)點(diǎn))按fe_y_va/"e的升序進(jìn)行排序。吳-曼伯算法輸入分組內(nèi)容(字節(jié)串)T[O...n-l]、SHIFT表、HASH表、PREFIX表、最短模式的長(zhǎng)度、模式的數(shù)量、塊的大小(B)、前綴的大小(B')、指示是否需要對(duì)跨越分組邊界的模式進(jìn)行檢査的標(biāo)記(策略)。在前一個(gè)分組的末端匹配的模式前綴的長(zhǎng)度、其前綴在前一個(gè)分組的末端匹配的模式串的地址輸出被檢測(cè)模式的身份(或者如果未檢測(cè)到,則為-l),模式的開(kāi)始位置作為從串T的開(kāi)始部分起的偏移量。在下面以偽-C代碼描述該算法。WU—Manber(**甜釘」。地W度f(wàn)Pa"em*,跟」"地/owg/"f/*將位置初始化到經(jīng)截?cái)嗟哪J降淖钤缈赡艿哪┒宋恢?/position=MIN—PATTERN一SIZE-1;/*如果模式重疊檢查需要進(jìn)行,則將在前一個(gè)分組中匹配的前綴添加到分組內(nèi)容的起始處*/if(span_policy==CHECK—SPANNING—PATTERN)S=Prefix(地址prefix—address處的模式,length=prefix—len)T=append(S到T的開(kāi)頭);while(position<PACKET—SIZE)"使得塊在'position'處結(jié)束并計(jì)算表索引值Vchunk=T[position-B.....position];chunk—val=HASH—value(chunk);/*轉(zhuǎn)換成小寫并計(jì)算索引;這將在稍后使用*/chunk—lower—case=convert—to_lower—case(chunk);chunk_val_lower_case=HASH—value(chunk—lower_case);if(SHIFT一table[chunk—va1]>0){/*在此位置未找到模式,所以移位并試圖在下一個(gè)位置匹配*/position=position+SHIFT_table[chimk_val];continue;/*主移位值為0,所以在,position-MIN—PATTERN—SIZE+1,處開(kāi)始有可能的匹配*//*檢查候選位置的偏移量*/if(position掘N—PATTERN一SIZE+l<SHIFT—table[2])/*在當(dāng)前位置沒(méi)有以塊結(jié)束的模式滿足偏移量極限,所以跳過(guò)使用次移位值并試圖在下一個(gè)位置匹配*/position=position+SHIFT一table[chunk一val][l];continue;/*檢査候選位置的深度*/if(position>=SHIFT—table[3])/*在當(dāng)前位置沒(méi)有以塊結(jié)束的模式滿足深度極限,所以跳過(guò)使用次移位值并試圖在下一個(gè)位置匹配*/position=position+SHIFT—table[chunk—val][l];continue;/*對(duì)候選串計(jì)算前綴值(正常和小寫)*/prefix=T[position掘N—PATTERN—SIZE+L.-position-MIN—PATTERN一SIZE+B'];prefix—val=HASH—value(prefix);prefix_lower—case—val=HASH—value(convert_to_lower—case(prefix));/*候選模式指向模式的指針按升序方式*/for(每一模式Pi:HASH—table[chunk—val]<=Pj<HASH—table[chunk_val+l])if(Pi.fcase==0&&prefix」ower一case一val==PREFIX一TABLE[i])/*將要匹配的兩個(gè)串轉(zhuǎn)換成小寫*/Stringl=convert一to—lower一case(Pi.string);String2=convert—to—lower—case(T[position-MIN—PATTERN—SIZE+1........position-MIN_PATTERN_SIZE+Pi.length);if(Stringl==String2)記錄Pi;/*模式匹配*/記錄'position';取決于策略,返回或繼續(xù)掃描T;elseif(P"fcase==1&&prefix—val==PREFIX—TABLE[i])if(Pi.string==T[position-MIN—PATTERN_SIZE+1.....position-MIN—PATTERN—SIZE+P;.length記錄Pi;/*模式匹配*/記錄'position';取決于策略,返回或繼續(xù)掃描T;/*現(xiàn)在使用其小寫等效物來(lái)替代匹配到指向SHIFT—table的索引的塊*/Repeat('for'循環(huán)以上的,用'chunk—val—lower—case'替換'chunk—val');/*跳過(guò)使用次移位值并繼續(xù)掃描*/position=position+SHIFT_table[chunk—val][l];/*如果無(wú)需檢查模式是否可能跨越多個(gè)分組,則返回*/if(span_policy==CHECK—SPANNING—PATTERN)return;/*計(jì)算可能溢出到下一個(gè)分組的候選模式的開(kāi)始位置*/position=position-MIN—PATTERN—SIZE+1;while(position<PACKETSIZE)for(每一模式Pi,i:0到num_pat){/*分組內(nèi)容的長(zhǎng)度保持成可與模式之一的前綴匹配*/length=PACKET_SIZE-position+l;/*在試圖完整匹配之前,從PREFIX表匹配前綴*/i奶.fcase==0)if(length>=B')if(PREFIX一table[i]!=T[position....position+B'-l])continue;if(T[position....PACKET—SIZE-1]==Pi.string[O....length-1])記錄prefix_length=length;記錄prefix_address=Pj.string;returnjIf模式Pi是大小寫無(wú)關(guān)的,以大小寫無(wú)關(guān)方式嘗試以上匹配;記錄prefix—length==0;rsturn;使用B+樹(shù)的吳-曼伯算法輸入分組內(nèi)容(字節(jié)串)T[O...n-l]、B+樹(shù)根指針、PREFIX表、最短模式的長(zhǎng)度、模式的數(shù)量、塊的大小(B)、前綴的大小(B')、指示是否需要對(duì)跨越分組邊界的模式進(jìn)行檢査的標(biāo)記(策略)。在前一個(gè)分組的末端匹配的模式前綴分組的長(zhǎng)度、其前綴在前一個(gè)分組的末端匹配的模式串的地址輸出被檢測(cè)模式的身份(或者如果未檢測(cè)到,則為-l),模式的開(kāi)始位置作為從串T的開(kāi)始處起的偏移量。除移位值和指針査找所用的數(shù)據(jù)結(jié)構(gòu)之外,算法與前面所述的吳-曼伯算法相同?,F(xiàn)在替代SHIFT表從B+樹(shù)子條目(從/zw/^wcoW結(jié)構(gòu))查找主和次移位以及偏移量和深度值。還替代HASH表從同一B+樹(shù)子節(jié)點(diǎn)條目獲得指向在給定位置上可能存在的候選模式的指針。但與SHIFT或HASH表不同,這些值無(wú)法直接查找(以固定時(shí)間)。順序掃描的效率可能是過(guò)低的。因此,使用二分搜索來(lái)定位適當(dāng)?shù)挠涗?;在以下描述查找步驟1.獲得用于計(jì)算散列值的塊(子串)Clc2.xB。2.使用最高有效字節(jié)(Cl)來(lái)定位適當(dāng)?shù)淖庸?jié)點(diǎn)指針以及孩子節(jié)點(diǎn)的數(shù)量(roof禾卩roof/"cj."wm—e/emewto)。3.使用映射到整數(shù)的剩下的&.."來(lái)定位適當(dāng)?shù)膔ecor"結(jié)構(gòu)。此整數(shù)將是任何匹配結(jié)構(gòu)的^y一^/we。因?yàn)樗薪Y(jié)構(gòu)基于以^;;一va/we的升序方式存儲(chǔ),所以簡(jiǎn)單二分搜索將返回所需的數(shù)據(jù)。對(duì)于大小為256的字母表,需要最多8次查找來(lái)定位記錄。除數(shù)據(jù)査找以外的所有算法步驟都與上述吳-曼伯算法相同。B的實(shí)際值將為2和3(B=l時(shí)將達(dá)不到構(gòu)建樹(shù)的目的,雖然它仍可起作用)。B'的實(shí)際值可為4或更小。B和B'都必須小于最短模式的長(zhǎng)度。權(quán)利要求1.一種方法,包括跨多個(gè)分組執(zhí)行內(nèi)容檢查以標(biāo)識(shí)具有在一較早的分組中的第一部分和在一隨后的分組中的第二部分的搜索串,其中所述內(nèi)容檢查經(jīng)由多個(gè)指令線程的執(zhí)行來(lái)進(jìn)行。2.如權(quán)利要求1所述的方法,其特征在于,所述內(nèi)容檢查包括對(duì)多個(gè)不同串進(jìn)行并發(fā)搜索。3.如權(quán)利要求2所述的方法,其特征在于,所述內(nèi)容檢查經(jīng)由基于DAWG(有向無(wú)環(huán)字圖)匹配算法的串搜索算法的計(jì)算機(jī)實(shí)現(xiàn)來(lái)執(zhí)行。4.如權(quán)利要求2所述的方法,其特征在于,所述內(nèi)容檢查經(jīng)由基于吳-曼伯算法的串搜索算法的計(jì)算機(jī)實(shí)現(xiàn)來(lái)執(zhí)行。5.如權(quán)利要求l所述的方法,其特征在于,還包括接收第一分組;對(duì)所述第一分組進(jìn)行分類以將其分配到一個(gè)流;在分配到所述流的分組中標(biāo)識(shí)要搜索的一個(gè)或多個(gè)串;使用第一指令線程來(lái)對(duì)所述第一個(gè)分組采用內(nèi)容檢查;檢測(cè)朝向所述第一分組的末端定位的一個(gè)或多個(gè)搜索串之一的部分匹配;保存與所述部分匹配相對(duì)應(yīng)的串搜索狀態(tài)信息;接收第二分組;對(duì)所述第二分組進(jìn)行分類以將其分配到所述流;檢索所述串搜索狀態(tài)信息;使用所述串搜索狀態(tài)信息來(lái)檢測(cè)所述搜索串的第二部分,所述搜索串的第二部分朝向所述第二分組的開(kāi)始處開(kāi)始。6.如權(quán)利要求5所述的方法,其特征在于,還包括標(biāo)識(shí)已發(fā)生了一個(gè)串匹配條件;以及對(duì)所述條件執(zhí)行相關(guān)聯(lián)動(dòng)作以處理分配到所述流的隨后接收到的分組。7.如權(quán)利要求l所述的方法,其特征在于,還包括對(duì)至少一個(gè)搜索串使用一偏移量機(jī)制,所述偏移量機(jī)制跳過(guò)第一分組中被定義為相關(guān)聯(lián)搜索串的偏移量的第一部分。8.如權(quán)利要求1所述的方法,其特征在于,還包括對(duì)至少一個(gè)搜索串使用一深度機(jī)制,所述深度機(jī)制跟蹤在分組中搜索的深度,并在到達(dá)對(duì)相關(guān)聯(lián)搜索串所定義的深度后停止所述搜索。9.如權(quán)利要求1所述的方法,其特征在于,還包括對(duì)大小寫無(wú)關(guān)的串執(zhí)行多分組搜索。10.如權(quán)利要求1所述的方法,其特征在于,所述內(nèi)容檢查包括在被執(zhí)行以在網(wǎng)絡(luò)設(shè)備處理分組的操作的上下文管線中的一操作,所述操作的上下文管線經(jīng)由在多個(gè)計(jì)算弓I擎上執(zhí)行多個(gè)指令線程來(lái)執(zhí)行。11.一種提供指令的機(jī)器可讀介質(zhì),所述指令在多線程網(wǎng)絡(luò)處理器上執(zhí)行的情況下執(zhí)行以下操作跨多個(gè)分組執(zhí)行內(nèi)容檢查以標(biāo)識(shí)具有在一較早的分組中的第一部分和在一隨后的分組中的第二部分的搜索串,其中對(duì)給定分組的內(nèi)容檢査通過(guò)指令線程的單獨(dú)實(shí)例的執(zhí)行來(lái)進(jìn)行。12.如權(quán)利要求11所述的機(jī)器可讀介質(zhì),其特征在于,所述指令的執(zhí)行還執(zhí)行以下操作對(duì)接收的第一分組進(jìn)行分類以將其分配到一個(gè)流;在分配到所述流的分組中標(biāo)識(shí)要搜索的一個(gè)或多個(gè)串;使用第一指令線程來(lái)對(duì)所述第一分組采用內(nèi)容檢査;檢測(cè)朝向所述第一分組的末端定位的一個(gè)或多個(gè)搜索串之一的部分匹配;保存與所述部分匹配相對(duì)應(yīng)的串搜索狀態(tài)信息;對(duì)接收的第二分組進(jìn)行分類以將其分配到所述流;檢索所述串搜索狀態(tài)信息;以及使用所述搜索串搜索狀態(tài)信息來(lái)檢測(cè)所述搜索串的第二部分,所述搜索串的第二部分朝向所述第二分組的開(kāi)始處開(kāi)始。13.如權(quán)利要求11所述的機(jī)器可讀介質(zhì),其特征在于,所述指令的執(zhí)行還執(zhí)行以下操作在至少一個(gè)共享存儲(chǔ)器資源中維護(hù)一流表,所述流表包括與一相應(yīng)的流相關(guān)聯(lián)的多個(gè)條目,每個(gè)流表?xiàng)l目包括標(biāo)識(shí)用于與所述相應(yīng)的流相關(guān)聯(lián)的多模式搜索的模式數(shù)據(jù)結(jié)構(gòu)的信息;以及標(biāo)識(shí)所述多模式搜索的狀態(tài)的狀態(tài)信息;對(duì)接收一分組作出響應(yīng),將所述分組分類到一個(gè)流;將所述分組入隊(duì)到分配給所述流的流隊(duì)列;定位與所述流相對(duì)應(yīng)的流表?xiàng)l目;將所述分組復(fù)制到所述網(wǎng)絡(luò)處理器上的計(jì)算引擎的本地存儲(chǔ)器中;將由所述流表?xiàng)l目標(biāo)識(shí)的模式數(shù)據(jù)結(jié)構(gòu)復(fù)制到所述計(jì)算引擎的本地存儲(chǔ)器中;以及使用所述模式數(shù)據(jù)結(jié)構(gòu)在所述計(jì)算引擎上對(duì)所述分組執(zhí)行多模式串搜索。14.如權(quán)利要求13的所述機(jī)器可讀介質(zhì),其特征在于,所述指令的執(zhí)行還執(zhí)行以下操作將所述分組分類到一新的流;以及在與所述新的流相對(duì)應(yīng)的流表中生成一新的條目。15.如權(quán)利要求11所述的機(jī)器可讀介質(zhì),其特征在于,所述內(nèi)容檢查經(jīng)由基于DAWG(有向無(wú)環(huán)字圖)匹配算法的串搜索算法的計(jì)算機(jī)實(shí)現(xiàn)來(lái)執(zhí)行。16.如權(quán)利要求11所述的機(jī)器可讀介質(zhì),其特征在于,所述內(nèi)容檢査經(jīng)由基于吳-曼伯算法的串搜索算法的計(jì)算機(jī)實(shí)現(xiàn)來(lái)執(zhí)行。17.—種網(wǎng)絡(luò)線路卡,包括具有多個(gè)多線程計(jì)算引擎的網(wǎng)絡(luò)處理器單元(NPU);通信地耦合到所述NPU的動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器(DRAM)存儲(chǔ);通信地耦合到所述NPU的靜態(tài)隨機(jī)存取存儲(chǔ)器(SRAM)存儲(chǔ);以及通信地耦合到所述NPU的存儲(chǔ)設(shè)備,所述存儲(chǔ)設(shè)備中存儲(chǔ)有要在所述NPU上執(zhí)行以執(zhí)行以下操作的指令將接收到的分組分類到各相關(guān)聯(lián)的流;以及對(duì)給定流,跨多個(gè)分組執(zhí)行內(nèi)容檢查,以在經(jīng)由所述多個(gè)分組傳輸?shù)臄?shù)據(jù)流中標(biāo)識(shí)具有在一對(duì)順序的分組中的相應(yīng)部分的搜索串。18.如權(quán)利要求17所述的網(wǎng)絡(luò)線路卡,其特征在于,所述NPU包括基于英特爾IPX的NPU。19.如權(quán)利要求17所述的網(wǎng)絡(luò)線路卡,其特征在于,所述內(nèi)容檢查是經(jīng)由基于DAWG(有向無(wú)環(huán)字圖)匹配算法的串搜索算法的計(jì)算機(jī)實(shí)現(xiàn)來(lái)執(zhí)行的。20.如權(quán)利要求17所述的網(wǎng)絡(luò)線路卡,其特征在于,所述內(nèi)容檢査是經(jīng)由基于吳-曼伯算法的串搜索算法的計(jì)算機(jī)實(shí)現(xiàn)來(lái)執(zhí)行的。全文摘要用于使用帶狀態(tài)分組內(nèi)容匹配機(jī)制來(lái)跨越分組邊界執(zhí)行內(nèi)容檢測(cè)的方法和裝置。模式分組數(shù)據(jù)結(jié)構(gòu)用于幫助串搜索算法機(jī)器。傳入分組被分類到流,并被存儲(chǔ)到相應(yīng)的流隊(duì)列中。流表?xiàng)l目用于標(biāo)識(shí)給定數(shù)據(jù)流的模式數(shù)據(jù)結(jié)構(gòu)。在內(nèi)容檢測(cè)期間,所述算法機(jī)器更新?tīng)顟B(tài)信息以標(biāo)識(shí)部分或所有匹配。當(dāng)向著前一個(gè)分組的末端檢測(cè)到部分匹配時(shí),更新流表中的分組狀態(tài)信息以反映狀態(tài),從而下一個(gè)分組的內(nèi)容檢測(cè)從該狀態(tài)開(kāi)始。結(jié)果,支持跨越分組邊界的內(nèi)容檢測(cè)。這些技術(shù)還可用在的分組處理上下文內(nèi)容管線階段中。文檔編號(hào)H04L29/06GK101258721SQ200680024231公開(kāi)日2008年9月3日申請(qǐng)日期2006年6月30日優(yōu)先權(quán)日2005年6月30日發(fā)明者S·巴拉克里希納,V·拉瑪克里什納申請(qǐng)人:英特爾公司