專利名稱:基于共享內(nèi)存實現(xiàn)的數(shù)據(jù)包捕獲方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計算機網(wǎng)絡(luò)流量監(jiān)測分析、網(wǎng)卡驅(qū)動及操作系統(tǒng)內(nèi)存管理等技術(shù)領(lǐng)域,特別涉及一種基于內(nèi)核空間和用戶空間共享內(nèi)存的方式應(yīng)用通用硬件平臺和開源軟件實現(xiàn)的數(shù)據(jù)包捕獲方法。
背景技術(shù):
流量指標是網(wǎng)絡(luò)運行和維護過程中最重要的指標之一,它是網(wǎng)絡(luò)規(guī)劃設(shè)計、協(xié)議設(shè)計、業(yè)務(wù)部署、流量工程實施、攻擊檢測與故障診斷的基礎(chǔ)。通過對網(wǎng)絡(luò)流量的監(jiān)測和分析可以獲得網(wǎng)絡(luò)性能信息、網(wǎng)絡(luò)服務(wù)狀況以及網(wǎng)絡(luò)中存在的攻擊或者弱點。流量監(jiān)測和分析技術(shù)被廣泛應(yīng)用到防火墻、入侵檢測(如snort、Bro等)和協(xié)議解碼以及流量監(jiān)測(如ethereal、tcpflow、ntop等)系統(tǒng)中。數(shù)據(jù)包捕獲是流量監(jiān)測和分析的前提和第一步驟,它決定了基于流量監(jiān)測和分析的系統(tǒng)的性能。目前絕大部分的流量監(jiān)測和分析系統(tǒng)都是借助libpcap等函數(shù)庫完成數(shù)據(jù)包捕獲,在低速鏈路情況下其可滿足需求。
然而,隨著技術(shù)和需求的發(fā)展,網(wǎng)絡(luò)鏈路速率迅猛增長,已經(jīng)開始從Mbit/s邁向Gbit/s,不久的將來可能還會發(fā)展至40Gbit/s甚至Tbit/s。千兆網(wǎng)卡和千兆交換機已經(jīng)開始逐步進入主流市場,幾乎每個新的局域網(wǎng)用戶都會采用此項技術(shù),一個普通的家庭用戶所能夠獲得的帶寬比兩年前一個公司獲得的帶寬還要大。網(wǎng)絡(luò)應(yīng)用的普及與網(wǎng)絡(luò)技術(shù)的發(fā)展,導(dǎo)致網(wǎng)絡(luò)流量也日益龐大。面對高速鏈路,流量監(jiān)測和分析技術(shù)所依賴的傳統(tǒng)的數(shù)據(jù)包捕獲方法開始受到諸多條件的限制,如PCI總線吞吐量、存儲容量、內(nèi)存訪問速度、磁盤陣列訪問速率、內(nèi)存拷貝開銷、系統(tǒng)調(diào)用開銷、中斷開銷以及操作系統(tǒng)中的任務(wù)調(diào)度機制等都對數(shù)據(jù)包在高速鏈路條件下的捕獲產(chǎn)生影響。由于這些條件的限制,使得可滿足低速鏈路流量監(jiān)測和分析要求的傳統(tǒng)的數(shù)據(jù)包捕獲技術(shù)很難適用于高速鏈路的網(wǎng)絡(luò)環(huán)境。
圖2為現(xiàn)有的一種分布式流量監(jiān)測分析系統(tǒng)的結(jié)構(gòu)圖,在該流量監(jiān)測分析系統(tǒng)中,網(wǎng)卡有兩種端口,分別為監(jiān)測端口和控制端口。其中的控制端口接收與該端口的IP地址相符合的數(shù)據(jù)包,監(jiān)測端口接收網(wǎng)卡所能收到的所有數(shù)據(jù)包。當監(jiān)測端口接收到數(shù)據(jù)包以后,由網(wǎng)卡驅(qū)動程序轉(zhuǎn)發(fā)到位于操作系統(tǒng)內(nèi)核的TCP/IP協(xié)議棧中排隊等待處理,流量檢測分析程序中的各種應(yīng)用程序通過操作系統(tǒng)提供的socket套接字接口提取數(shù)據(jù)包進行解碼和分析。在上述數(shù)據(jù)包的接收過程中,不僅要為數(shù)據(jù)包動態(tài)的分配和釋放緩存,更重要的是需要將數(shù)據(jù)包從操作系統(tǒng)的內(nèi)核空間拷貝到用戶空間,這些操作都將耗費大量的開銷,因此該流量監(jiān)測分析系統(tǒng)很難適用于高速鏈路的網(wǎng)絡(luò)環(huán)境下。
目前,為了克服操作系統(tǒng)、PCI總線帶寬和系統(tǒng)資源所帶來的性能限制,一些研究人員和硬件生產(chǎn)廠商已經(jīng)開始進行了一番探索。首先,采用網(wǎng)絡(luò)處理器替代通用硬件平臺來實現(xiàn)數(shù)據(jù)包捕獲并完成部分的進行流量監(jiān)測和分析功能,但是通常采用網(wǎng)絡(luò)處理器的方法價格非常昂貴,且開發(fā)和升級的周期較長,大量部署不太現(xiàn)實;其次,試圖通過專用硬件來實現(xiàn)數(shù)據(jù)包捕獲進而完成被動流量監(jiān)測和分析,如OCX3MON項目即通過Endace公司的DAG系列監(jiān)測板卡完成對骨干鏈路的流量監(jiān)測和分析,然而基于專用硬件的實現(xiàn)方式價格昂貴,且系統(tǒng)缺乏足夠的靈活性,很難跟上當今瞬息萬變的網(wǎng)絡(luò)發(fā)展現(xiàn)狀和流量監(jiān)測和分析需求。
流量監(jiān)測和分析,尤其是高速鏈路下的流量監(jiān)測分析正逐漸成為一個熱門領(lǐng)域。有關(guān)流量監(jiān)測分析的一些新的研究項目也正在如火如荼的展開,如歐洲的SCAMP項目設(shè)計了一種數(shù)據(jù)包捕獲的體系結(jié)構(gòu);MAGNet則可以進行應(yīng)用流的監(jiān)測;CoralReef是由著名的CAIDA組織開發(fā)實現(xiàn)的一種收集和分析Internet被動流量監(jiān)測信息的重要工具之一,等等。數(shù)據(jù)包捕獲是這些的前提和基礎(chǔ)。
因此,一種可在通用硬件平臺上實現(xiàn)、能夠達到更高性能、可滿足高速網(wǎng)絡(luò)鏈路環(huán)境的數(shù)據(jù)包捕獲方法在流量監(jiān)測和分析技術(shù)中具有重要的應(yīng)用價值。
發(fā)明內(nèi)容
本發(fā)明的目的是為了克服在高速網(wǎng)絡(luò)鏈路環(huán)境下,針對基于專用硬件實現(xiàn)的流量監(jiān)測分析系統(tǒng)價格昂貴,且缺乏足夠的靈活性的缺陷,提出一種基于通用硬件平臺的數(shù)據(jù)包捕獲效率高、系統(tǒng)資源占用少的數(shù)據(jù)包捕獲方法。
為了實現(xiàn)上述目的,本發(fā)明提供了一種基于共享內(nèi)存實現(xiàn)的數(shù)據(jù)包捕獲方法,包括以下步驟
步驟1)、網(wǎng)卡加載并初始化網(wǎng)卡驅(qū)動程序后,流量監(jiān)測分析程序向網(wǎng)卡驅(qū)動程序注冊自身信息;所述的網(wǎng)卡驅(qū)動程序初始化時,向操作系統(tǒng)申請一塊內(nèi)存空間作為共享內(nèi)存空間,所述共享內(nèi)存空間分為數(shù)據(jù)信息域和管理信息域;所述數(shù)據(jù)信息域被分割成等長的數(shù)據(jù)包緩存單元,每個數(shù)據(jù)包緩存單元緩存一個數(shù)據(jù)包;所述管理信息域用來存放數(shù)據(jù)信息域中的數(shù)據(jù)包所對應(yīng)的全局索引數(shù)組信息和流量監(jiān)測分析程序的注冊信息;步驟2)、網(wǎng)卡驅(qū)動程序創(chuàng)建一個字符設(shè)備,在字符設(shè)備中設(shè)置mmap內(nèi)存映射接口;步驟3)、將監(jiān)測端口的網(wǎng)卡設(shè)置為混雜模式;步驟4)、網(wǎng)卡依次接收網(wǎng)絡(luò)鏈路上偵聽到的數(shù)據(jù)包,并將其存放入板載緩存中,然后判斷數(shù)據(jù)包的接收端口,若數(shù)據(jù)包來自監(jiān)測端口,則執(zhí)行下一步,否則,執(zhí)行步驟7);步驟5)、網(wǎng)卡驅(qū)動程序?qū)?shù)據(jù)包送入共享內(nèi)存的數(shù)據(jù)信息域中,并對共享內(nèi)存管理信息域的管理單元填充管理信息,然后執(zhí)行下一步;步驟6)、運行流量監(jiān)測分析程序,該程序從共享內(nèi)存的數(shù)據(jù)信息域中讀取所存放的數(shù)據(jù)包,并對數(shù)據(jù)包執(zhí)行解碼、統(tǒng)計運算的分析處理,同時更新所述管理信息域的管理單元中的管理信息;當數(shù)據(jù)信息域中所保存的數(shù)據(jù)包處理完畢,則執(zhí)行步驟4),繼續(xù)接收數(shù)據(jù)包;步驟7)、數(shù)據(jù)包按照正常的處理流程交給操作系統(tǒng),由操作系統(tǒng)和上層的網(wǎng)絡(luò)應(yīng)用程序進行正常的處理,然后轉(zhuǎn)向步驟4),繼續(xù)接收數(shù)據(jù)。
上述技術(shù)方案中,所述的步驟5)包括5-1)、網(wǎng)卡驅(qū)動程序檢查位于所述共享內(nèi)存中的管理信息域,判斷當前的數(shù)據(jù)包是否能夠安全寫入數(shù)據(jù)信息域中,若能,則網(wǎng)卡驅(qū)動程序?qū)?shù)據(jù)包通過DMA通道從網(wǎng)卡的板載緩存輸送到共享內(nèi)存數(shù)據(jù)信息域的緩存單元中,然后執(zhí)行下一步;否則,轉(zhuǎn)向步驟5-3);5-2)、在步驟5-1)中將數(shù)據(jù)包送入緩存單元后,對管理信息域中與緩存單元所對應(yīng)的管理單元填充相應(yīng)的信息,然后執(zhí)行步驟6);5-3)、流量監(jiān)測分析程序的處理能力不足,導(dǎo)致共享內(nèi)存數(shù)據(jù)信息域溢出,網(wǎng)卡驅(qū)動程序?qū)G棄后繼收到的數(shù)據(jù)包,返回步驟4)。
上述技術(shù)方案中,所述的步驟6)包括;6-1)、運行流量監(jiān)測分析程序,該程序向流量監(jiān)測分析系統(tǒng)注冊自身信息,并向網(wǎng)卡驅(qū)動下達數(shù)據(jù)包查看請求;6-2)、由流量監(jiān)測分析程序打開步驟2)中創(chuàng)建的字符設(shè)備,調(diào)用字符設(shè)備的mmap內(nèi)存映射接口,獲取指向共享內(nèi)存的指針;6-3)、根據(jù)步驟6-2)中獲得的指針,從數(shù)據(jù)信息域中提取出一個數(shù)據(jù)包;6-4)、在步驟6-3)提取數(shù)據(jù)包后,檢查數(shù)據(jù)包對應(yīng)管理單元中的全局引用計數(shù)和訪問標識字段,若全局引用計數(shù)值不為0且標識字段中有標識為未被處理的位,則執(zhí)行下一步,若全局引用計數(shù)值為0,則忽略該數(shù)據(jù)包,轉(zhuǎn)向步驟6-6);6-5)、流量監(jiān)測分析程序讀取數(shù)據(jù)包信息,執(zhí)行解碼、統(tǒng)計運算的分析處理過程,然后將全局引用計數(shù)值減1,同時將該流量監(jiān)測分析程序所對應(yīng)的訪問標識字段的標識位設(shè)置為已處理,轉(zhuǎn)向步驟6-3);6-6)、掛起流量監(jiān)測分析程序,等待更多的數(shù)據(jù)包進入共享內(nèi)存,然后轉(zhuǎn)向步驟4)。
上述技術(shù)方案中,所述的所述數(shù)據(jù)信息域在邏輯上形成一個環(huán)形緩存區(qū),可循環(huán)存放接收到的數(shù)據(jù)包。
上述技術(shù)方案中,所述的管理信息域有四個數(shù)據(jù)成員信息,其中的數(shù)據(jù)成員app_count表示目前系統(tǒng)中已注冊并運行的流量監(jiān)測分析程序數(shù)目;appname表示目前系統(tǒng)中已注冊并運行的流量監(jiān)測分析程序名稱;skb_cnt_index表示數(shù)據(jù)信息域中數(shù)據(jù)包全局引用計數(shù),該計數(shù)器初始化為app_count中的值,此后由流量監(jiān)測分析程序遞減該計數(shù)器到0;skb_label_index表示數(shù)據(jù)信息域中數(shù)據(jù)包訪問標識字段,該字段初始化為0,此后由流量監(jiān)測分析程序?qū)⒃撟侄蔚膶?yīng)標識位置1;所述的skb_cnt_index和skb_label_index合稱為全局索引數(shù)組信息,所述的app_count和appname合稱為流量監(jiān)測分析程序的注冊信息。
在所述的步驟5-1)中,所述的判斷當前的數(shù)據(jù)包是否可以安全寫入數(shù)據(jù)信息域的判斷標準是如果當前需要寫入的數(shù)據(jù)包緩存單元的全局引用計數(shù)為0,則該緩存單元可以安全覆蓋,所述數(shù)據(jù)包就可安全寫入數(shù)據(jù)信息域中。
在所述的步驟5-2)中,所述的對管理信息域中與緩存單元所對應(yīng)的管理單元填充相應(yīng)的信息包括(1)、根據(jù)當前系統(tǒng)中已注冊的上層流量監(jiān)測分析應(yīng)用的個數(shù)初始化全局引用計數(shù)數(shù)組中的對應(yīng)元素;(2)、將訪問標識字段數(shù)組中的對應(yīng)元素進行置位。
本發(fā)明的優(yōu)點在于1、本發(fā)明的基于共享內(nèi)存實現(xiàn)的數(shù)據(jù)包捕獲方法能夠完全消除內(nèi)存拷貝開銷,減少系統(tǒng)調(diào)用次數(shù),節(jié)省CPU資源,提高數(shù)據(jù)包捕獲的效率和性能;2、本發(fā)明的基于共享內(nèi)存實現(xiàn)的數(shù)據(jù)包捕獲方法采用基于通用硬件平臺和開源軟件的實現(xiàn)方式,相比采用專用硬件設(shè)備而言,大大降低了成本,有利于開拓市場,適合大量部署。
圖1為基于本發(fā)明的方法實現(xiàn)的流量監(jiān)測分析程序的系統(tǒng)結(jié)構(gòu)圖;圖2為現(xiàn)有的一種分布式流量監(jiān)測分析系統(tǒng)的結(jié)構(gòu)圖;圖3為一個實施例中的共享內(nèi)存空間的組成圖;圖4為本發(fā)明方法的流程圖。
具體實施例方式
下面結(jié)合附圖和具體實施方式
對本發(fā)明的方法作進一步的描述。
在一個實施例中,本發(fā)明的基于共享內(nèi)存實現(xiàn)的數(shù)據(jù)包捕獲方法在寶德2U刀片服務(wù)器上實現(xiàn),在服務(wù)器的CPU主頻為雙XEON 3.2G,PCI-X插槽主頻為133MHz,內(nèi)存為1GB,網(wǎng)卡型號為IntelPRO/1000MT Server Adapter。該服務(wù)器的操作系統(tǒng)為Fedora Core 3,內(nèi)核版本號為linux-2.6.9SMP;網(wǎng)卡驅(qū)動程序版本為Intel e1000-6.3.9。
在上述硬件平臺上,如圖4所示,本發(fā)明的方法包括以下步驟步驟10、網(wǎng)卡開始工作,加載修改后的網(wǎng)卡驅(qū)動程序,并初始化該驅(qū)動程序。在初始化的過程中,所述的網(wǎng)卡驅(qū)動程序向操作系統(tǒng)申請一塊連續(xù)的物理內(nèi)存空間作為共享內(nèi)存空間,然后將這塊共享內(nèi)存空間劃分為數(shù)據(jù)信息域和管理信息域,并對數(shù)據(jù)信息域和管理信息域進行初始化,其中的數(shù)據(jù)信息域用來緩存數(shù)據(jù)包,管理信息域則對數(shù)據(jù)信息域進行管理。此外,流量監(jiān)測分析程序還需向網(wǎng)卡驅(qū)動程序注冊自身信息。
申請物理內(nèi)存空間作為共享內(nèi)存空間時,經(jīng)過修改后的網(wǎng)卡驅(qū)動程序在啟動時自動加載共享內(nèi)存實現(xiàn)模塊,該模塊的功能是從操作系統(tǒng)頁表中查找連續(xù)的空閑內(nèi)存頁面,從查找到的多段連續(xù)空閑內(nèi)存中選擇一個內(nèi)存段,選擇策略可以按操作系統(tǒng)的內(nèi)存分配方法實現(xiàn)為最佳匹配、最大匹配和最快匹配等,從選出的內(nèi)存段中再劃分出用戶指定數(shù)量的頁面,在操作系統(tǒng)頁表中將這些內(nèi)存頁面標記為reserved,此后這些標記頁面就不會被操作系統(tǒng)的內(nèi)存調(diào)度程序交換出物理內(nèi)存,在網(wǎng)卡驅(qū)動程序退出時主動釋放這些頁面,清空頁面的reserved標記,將共享內(nèi)存交還操作系統(tǒng)。
圖3顯示了一種共享內(nèi)存空間的實現(xiàn)方式,該共享內(nèi)存空間共132M,其中128M為數(shù)據(jù)信息域,4M為管理信息域,其中的數(shù)據(jù)信息域可被分割成等長的數(shù)據(jù)包緩存單元,每個數(shù)據(jù)包緩存單元緩存一個數(shù)據(jù)包。在邏輯上,所述數(shù)據(jù)信息域形成一個環(huán)形緩存區(qū),可循環(huán)存放接收到的數(shù)據(jù)包。管理信息域用來存放數(shù)據(jù)信息域中的數(shù)據(jù)包所對應(yīng)的全局索引數(shù)組信息和流量監(jiān)測分析程序的注冊信息,共包含有四個數(shù)據(jù)成員信息,如表1所示,其中的數(shù)據(jù)成員app_count表示目前系統(tǒng)中已注冊并運行的流量監(jiān)測分析程序數(shù)目;appname[8][20]表示目前系統(tǒng)中已注冊并運行的流量監(jiān)測分析程序名稱;skb_cnt_index[53430]表示數(shù)據(jù)信息域中數(shù)據(jù)包全局引用計數(shù),該計數(shù)器初始化為app_count中的值,此后由流量監(jiān)測分析程序遞減該計數(shù)器到0;skb_label_index[53430]表示數(shù)據(jù)信息域中數(shù)據(jù)包訪問標識字段,該字段初始化為0,此后由流量監(jiān)測分析程序?qū)⒃撟侄蔚膶?yīng)標識位置1。其中,skb_cnt_index和skb_label_index合稱為全局索引數(shù)組信息,app_count和appname合稱為流量監(jiān)測分析程序的注冊信息。
表1
在本步驟中,共享內(nèi)存空間的建立是本發(fā)明的一個重要技術(shù)特征。如圖1所示,在系統(tǒng)中申請一塊連續(xù)的內(nèi)存區(qū)域作為共享內(nèi)存空間后,該共享內(nèi)存空間可以脫離操作系統(tǒng)內(nèi)存調(diào)度程序的管轄,直接由網(wǎng)卡驅(qū)動和流量監(jiān)測分析程序操縱并管理。其中,網(wǎng)卡驅(qū)動負責(zé)寫入數(shù)據(jù)包到共享內(nèi)存,流量監(jiān)測分析程序讀取數(shù)據(jù)包并做分析和統(tǒng)計,這二者可視為簡單的生產(chǎn)者消費者問題,通過位于共享內(nèi)存管理信息域的數(shù)據(jù)包全局索引數(shù)組信息進行生產(chǎn)者和消費者之間的同步和互斥。通過網(wǎng)卡驅(qū)動向共享內(nèi)存數(shù)據(jù)區(qū)順序循環(huán)寫入數(shù)據(jù),可以避免將數(shù)據(jù)包送到操作系統(tǒng)內(nèi)核數(shù)據(jù)結(jié)構(gòu)和隊列中所造成的維護和管理開銷,同時可實現(xiàn)數(shù)據(jù)包零拷貝和消除系統(tǒng)調(diào)用目的,達到一步到位的數(shù)據(jù)包訪問。
在本步驟中,還對所述的網(wǎng)卡驅(qū)動程序進行了修改,與現(xiàn)有的網(wǎng)卡驅(qū)動程序相比,修改后的網(wǎng)卡驅(qū)動程序新增了以下功能1)在網(wǎng)卡驅(qū)動程序初始化過程中加載共享內(nèi)存實現(xiàn)模塊,并初始化申請到的共享內(nèi)存空間;該功能在本步驟即已實現(xiàn)。
2)區(qū)分監(jiān)測端口和控制端口接收到的數(shù)據(jù)包,監(jiān)測端口數(shù)據(jù)包送到共享內(nèi)存的數(shù)據(jù)信息域單元中緩存,控制端口數(shù)據(jù)包按照正常的數(shù)據(jù)包處理流程,送入操作系統(tǒng)內(nèi)核協(xié)議棧中處理;該功能在后續(xù)的步驟40中實現(xiàn)。
3)在網(wǎng)卡驅(qū)動程序初始化過程中創(chuàng)建一個字符設(shè)備,在字符設(shè)備中實現(xiàn)mmap內(nèi)存映射接口方法,該接口方法將提供給流量監(jiān)測分析程序使用。該功能在下面的步驟20中實現(xiàn)。
步驟20、網(wǎng)卡驅(qū)動程序在初始化過程中創(chuàng)建一個字符設(shè)備,在字符設(shè)備中實現(xiàn)mmap內(nèi)存映射接口方法,該接口方法將提供給流量監(jiān)測分析程序使用。所述字符設(shè)備的作用是使在內(nèi)核空間中所創(chuàng)建的共享內(nèi)存能夠在用戶空間中被使用。
步驟30、設(shè)置監(jiān)測端口網(wǎng)卡為混雜模式。在正常情況下(也就是非混雜模式),網(wǎng)卡硬件會偵聽并比較網(wǎng)絡(luò)鏈路上正在傳輸?shù)腗AC幀的目的地址,如果偵聽到目的MAC地址是廣播地址,或者是網(wǎng)卡自身的MAC地址,就接收該MAC幀到網(wǎng)卡的板載緩存中,否則停止接收。本步驟中,將網(wǎng)卡設(shè)置為混雜模式后,網(wǎng)卡硬件將不再比較網(wǎng)絡(luò)鏈路上正在傳輸?shù)腗AC幀的目的地址,直接接收MAC幀到網(wǎng)卡的板載緩存中。
步驟40、網(wǎng)卡依次接收網(wǎng)絡(luò)鏈路上偵聽到的數(shù)據(jù)包,并將其存放入板載緩存中,然后判斷數(shù)據(jù)包的接收端口,若數(shù)據(jù)包來自監(jiān)測端口,則執(zhí)行下一步,否則,執(zhí)行步驟140;步驟50、網(wǎng)卡驅(qū)動程序檢查位于共享內(nèi)存中的管理信息域,讀取全局索引數(shù)組信息,判斷當前的數(shù)據(jù)包是否可以安全寫入數(shù)據(jù)信息域中,判斷方法是如果當前需要寫入的數(shù)據(jù)包緩存單元的全局引用計數(shù)為0,說明該緩存單元可以安全覆蓋,則網(wǎng)卡驅(qū)動程序?qū)?shù)據(jù)包通過DMA通道從網(wǎng)卡的板載緩存搬運到共享內(nèi)存的數(shù)據(jù)信息域中,然后轉(zhuǎn)向步驟下一步;否則,轉(zhuǎn)向步驟70;步驟60、初始化管理信息域中與緩存單元所對應(yīng)的管理單元,包括(1)、根據(jù)當前系統(tǒng)中已注冊的上層流量監(jiān)測分析應(yīng)用的個數(shù)初始化全局引用計數(shù)數(shù)組中的對應(yīng)元素,即skb_cnt_index[i]=app_count;(2)、將訪問標識字段數(shù)組中的對應(yīng)元素進行置位,即skb_label_index[i]=0x00;完成上述初始化操作后,執(zhí)行步驟80。
步驟70、上層流量監(jiān)測分析程序的處理能力不足,導(dǎo)致共享內(nèi)存數(shù)據(jù)信息域溢出,網(wǎng)卡驅(qū)動程序?qū)G棄后繼收到的數(shù)據(jù)包,返回步驟40。
步驟80、運行流量監(jiān)測分析程序,該程序向流量監(jiān)測分析系統(tǒng)注冊自身信息,并向網(wǎng)卡驅(qū)動下達數(shù)據(jù)包查看請求。
步驟90、在流量監(jiān)測分析程序中打開步驟20中創(chuàng)建的字符設(shè)備,調(diào)用字符設(shè)備的mmap內(nèi)存映射方法,獲取指向共享內(nèi)存的指針。
步驟100、根據(jù)步驟90中獲得的指針,從數(shù)據(jù)信息域中提取出一個數(shù)據(jù)包。
步驟110、檢查數(shù)據(jù)包對應(yīng)管理單元中的全局引用計數(shù)和訪問標識字段,若全局引用計數(shù)值不為0且標識字段中有標識為未被處理的位,則執(zhí)行下一步;若全局引用計數(shù)值為0,則忽略該數(shù)據(jù)包,轉(zhuǎn)向步驟130;步驟120、流量監(jiān)測分析程序讀取數(shù)據(jù)包信息,執(zhí)行解碼、統(tǒng)計運算等分析處理,然后將全局引用計數(shù)值減1,同時將該流量監(jiān)測分析程序所對應(yīng)的訪問標識字段設(shè)置為已處理,轉(zhuǎn)向步驟100;步驟130、掛起流量監(jiān)測分析程序,等待更多的數(shù)據(jù)包進入共享內(nèi)存,轉(zhuǎn)向步驟40;步驟140、數(shù)據(jù)包按照正常的處理流程交給操作系統(tǒng),由操作系統(tǒng)和上層的網(wǎng)絡(luò)應(yīng)用程序進行正常的處理,然后轉(zhuǎn)向步驟40,繼續(xù)接收數(shù)據(jù)。
下面結(jié)合一個具體的實例,對本發(fā)明的方法進行說明。
假設(shè)系統(tǒng)中正在運行的兩個流量監(jiān)測分析程序為snort和ethereal,網(wǎng)卡成功接收到10個數(shù)據(jù)包,分別順序存儲到數(shù)據(jù)信息域中標識為slot 1~slot 10的緩存單元中,并在管理信息域中注冊相關(guān)的信息。管理信息域中相應(yīng)信息在接收數(shù)據(jù)包前后的變化如表2所示
表2表中i的取值為slot 1~slot 10,app_count、appname
和appname[1]存儲的是流量監(jiān)測分析程序的注冊信息,其取值不會隨接收數(shù)據(jù)包而改變。
流量監(jiān)測分析程序?qū)?shù)據(jù)信息域中的信息進行分析處理的過程如下1、首先,snort(ethereal)程序檢查skb_cnt_index[i]取值是否為0,如果不為0則轉(zhuǎn)向步驟2,否則轉(zhuǎn)向步驟5;2、繼續(xù)判斷skb_label_index[i]中的特定標識位是否標識為未處理skb_label_index[i]&=(1<<(skb_cnt_index[i]-1))(每一個注冊的流量監(jiān)測程序都有自己特定的標識位,用以相互區(qū)別,標識位位置由skb_cnt_index[i]的值動態(tài)決定),如果為未處理則轉(zhuǎn)向步驟3,否則轉(zhuǎn)向步驟5;3、將數(shù)據(jù)包返回給snort(ethereal)程序處理,轉(zhuǎn)向步驟4;4、snort(ethereal)程序處理完數(shù)據(jù)包信息,遞減skb_cnt_index[i]的值,將skb_label_index[i]的特定標識位置為已處理skb_label_index[i]|=(1<<skb_cnt_index[i]),將i自加1移動到下一個數(shù)據(jù)緩沖單元,轉(zhuǎn)向步驟1;5、沒有數(shù)據(jù)包可供處理,暫時掛起snort(ethereal)程序等待后繼數(shù)據(jù)包進入共享內(nèi)存,將i自加1移動到下一個數(shù)據(jù)緩沖單元,轉(zhuǎn)向步驟1。
根據(jù)以上步驟,詳細描述流量監(jiān)測分析程序snort、ethereal并行運行時分別處理位于數(shù)據(jù)信息域slot 1緩存單元的數(shù)據(jù)包過程中,對應(yīng)管理信息域中的數(shù)據(jù)取值變化情況,假設(shè)由snort程序和ethereal程序先后進行處理,這兩個程序都必須嚴格按照上述流程中的五個步驟執(zhí)行,每執(zhí)行完一個步驟,管理信息域中數(shù)據(jù)的取值情況如下首先snort程序訪問共享內(nèi)存數(shù)據(jù)信息域中的第i=slot 1個數(shù)據(jù)包緩存單元snort執(zhí)行步驟1之前i=slot 1,skb_cnt_index[i]=2,skb_label_index[i]=0x00;snort執(zhí)行步驟2之前i=slot 1,skb_cnt_index[i]=2,skb_label_index[i]=0x00;snort執(zhí)行步驟3之前i=slot 1,skb_cnt_index[i]=2,skb_label_index[i]=0x00;snort執(zhí)行步驟4之前i=slot 1,skb_cnt_index[i]=2,skb_label_index[i]=0x00;snort執(zhí)行步驟5之前i=slot 2,skb_cnt_index[i]=1,skb_label_index[i]=0x02;snort執(zhí)行步驟5之后i=slot 2,skb_cnt_index[i]=0或者(skb_label_index[i]&0x02)=0x02;接著ethereal程序訪問共享內(nèi)存數(shù)據(jù)信息域中的第j=slot 1個數(shù)據(jù)包緩存單元ethereal執(zhí)行步驟1之前j=slot 1,skb_cnt_index[j]=1,skb_label_index[j]=0x02;ethereal執(zhí)行步驟2之前同上;ethereal執(zhí)行步驟3之前同上;ethereal執(zhí)行步驟4之前同上;ethereal執(zhí)行步驟5之前j=slot 2,skb_cnt_index[j]=0,skb_label_index[j]=0x03;ethereal執(zhí)行步驟5之后j=slot 2,skb_cnt_index[j]=0或者(skb_label_index[j]&0x01)=0x01;app_count、appname
和appname[1]存儲的是流量監(jiān)測分析程序的注冊信息,其取值不會隨數(shù)據(jù)包的處理過程而改變,只有當有新的流量監(jiān)測分析程序需要注冊或者注銷snort(ethereal)程序時其取值才可能發(fā)生變化。
權(quán)利要求
1.一種基于共享內(nèi)存實現(xiàn)的數(shù)據(jù)包捕獲方法,包括以下步驟步驟1)、網(wǎng)卡加載并初始化網(wǎng)卡驅(qū)動程序后,流量監(jiān)測分析程序向網(wǎng)卡驅(qū)動程序注冊自身信息;所述的網(wǎng)卡驅(qū)動程序初始化時,向操作系統(tǒng)申請一塊內(nèi)存空間作為共享內(nèi)存空間,所述共享內(nèi)存空間分為數(shù)據(jù)信息域和管理信息域;所述數(shù)據(jù)信息域被分割成等長的數(shù)據(jù)包緩存單元,每個數(shù)據(jù)包緩存單元緩存一個數(shù)據(jù)包;所述管理信息域用來存放數(shù)據(jù)信息域中的數(shù)據(jù)包所對應(yīng)的全局索引數(shù)組信息和流量監(jiān)測分析程序的注冊信息;步驟2)、網(wǎng)卡驅(qū)動程序創(chuàng)建一個字符設(shè)備,在字符設(shè)備中設(shè)置mmap內(nèi)存映射接口;步驟3)、將監(jiān)測端口的網(wǎng)卡設(shè)置為混雜模式;步驟4)、網(wǎng)卡依次接收網(wǎng)絡(luò)鏈路上偵聽到的數(shù)據(jù)包,并將其存放入板載緩存中,然后判斷數(shù)據(jù)包的接收端口,若數(shù)據(jù)包來自監(jiān)測端口,則執(zhí)行下一步,否則,執(zhí)行步驟7);步驟5)、網(wǎng)卡驅(qū)動程序?qū)?shù)據(jù)包送入共享內(nèi)存的數(shù)據(jù)信息域中,并對共享內(nèi)存管理信息域的管理單元填充管理信息,然后執(zhí)行下一步;步驟6)、運行流量監(jiān)測分析程序,該程序從共享內(nèi)存的數(shù)據(jù)信息域中讀取所存放的數(shù)據(jù)包,并對數(shù)據(jù)包執(zhí)行解碼、統(tǒng)計運算的分析處理,同時更新所述管理信息域的管理單元中的管理信息;當數(shù)據(jù)信息域中所保存的數(shù)據(jù)包處理完畢,則執(zhí)行步驟4),繼續(xù)接收數(shù)據(jù)包;步驟7)、數(shù)據(jù)包按照正常的處理流程交給操作系統(tǒng),由操作系統(tǒng)和上層的網(wǎng)絡(luò)應(yīng)用程序進行正常的處理,然后轉(zhuǎn)向步驟4),繼續(xù)接收數(shù)據(jù)。
2.根據(jù)權(quán)利要求1所述的基于共享內(nèi)存實現(xiàn)的數(shù)據(jù)包捕獲方法,其特征在于,所述的步驟5)包括5-1)、網(wǎng)卡驅(qū)動程序檢查位于所述共享內(nèi)存中的管理信息域,判斷當前的數(shù)據(jù)包是否能夠安全寫入數(shù)據(jù)信息域中,若能,則網(wǎng)卡驅(qū)動程序?qū)?shù)據(jù)包通過DMA通道從網(wǎng)卡的板載緩存輸送到共享內(nèi)存數(shù)據(jù)信息域的緩存單元中,然后執(zhí)行下一步;否則,轉(zhuǎn)向步驟5-3);5-2)、在步驟5-1)中將數(shù)據(jù)包送入緩存單元后,對管理信息域中與緩存單元所對應(yīng)的管理單元填充相應(yīng)的信息,然后執(zhí)行步驟6);5-3)、流量監(jiān)測分析程序的處理能力不足,導(dǎo)致共享內(nèi)存數(shù)據(jù)信息域溢出,網(wǎng)卡驅(qū)動程序?qū)G棄后繼收到的數(shù)據(jù)包,返回步驟4)。
3.根據(jù)權(quán)利要求1所述的基于共享內(nèi)存實現(xiàn)的數(shù)據(jù)包捕獲方法,其特征在于,所述的步驟6)包括6-1)、運行流量監(jiān)測分析程序,該程序向流量監(jiān)測分析系統(tǒng)注冊自身信息,并向網(wǎng)卡驅(qū)動下達數(shù)據(jù)包查看請求;6-2)、由流量監(jiān)測分析程序打開步驟2)中創(chuàng)建的字符設(shè)備,調(diào)用字符設(shè)備的mmap內(nèi)存映射接口,獲取指向共享內(nèi)存的指針;6-3)、根據(jù)步驟6-2)中獲得的指針,從數(shù)據(jù)信息域中提取出一個數(shù)據(jù)包;6-4)、在步驟6-3)提取數(shù)據(jù)包后,檢查數(shù)據(jù)包對應(yīng)管理單元中的全局引用計數(shù)和訪問標識字段,若全局引用計數(shù)值不為0且標識字段中有標識為未被處理的位,則執(zhí)行下一步,若全局引用計數(shù)值為0,則忽略該數(shù)據(jù)包,轉(zhuǎn)向步驟6-6);6-5)、流量監(jiān)測分析程序讀取數(shù)據(jù)包信息,執(zhí)行解碼、統(tǒng)計運算的分析處理過程,然后將全局引用計數(shù)值減1,同時將該流量監(jiān)測分析程序所對應(yīng)的訪問標識字段的標識位設(shè)置為已處理,轉(zhuǎn)向步驟6-3);6-6)、掛起流量監(jiān)測分析程序,等待更多的數(shù)據(jù)包進入共享內(nèi)存,然后轉(zhuǎn)向步驟4)。
4.根據(jù)權(quán)利要求1所述的基于共享內(nèi)存實現(xiàn)的數(shù)據(jù)包捕獲方法,其特征在于,所述的數(shù)據(jù)信息域在邏輯上形成一個環(huán)形緩存區(qū),可循環(huán)存放接收到的數(shù)據(jù)包。
5.根據(jù)權(quán)利要求1所述的基于共享內(nèi)存實現(xiàn)的數(shù)據(jù)包捕獲方法,其特征在于,所述的管理信息域有四個數(shù)據(jù)成員信息,其中的數(shù)據(jù)成員app_count表示目前系統(tǒng)中已注冊并運行的流量監(jiān)測分析程序數(shù)目;appname表示目前系統(tǒng)中已注冊并運行的流量監(jiān)測分析程序名稱;skb_cnt_index表示數(shù)據(jù)信息域中數(shù)據(jù)包全局引用計數(shù),該計數(shù)器初始化為app_count中的值,此后由流量監(jiān)測分析程序遞減該計數(shù)器到0;skb_label_index表示數(shù)據(jù)信息域中數(shù)據(jù)包訪問標識字段,該字段初始化為0,此后由流量監(jiān)測分析程序?qū)⒃撟侄蔚膶?yīng)標識位置1;所述的skb_cnt_index和skb_label_index合稱為全局索引數(shù)組信息,所述的app_count和appname合稱為流量監(jiān)測分析程序的注冊信息。
6.根據(jù)權(quán)利要求2所述的基于共享內(nèi)存實現(xiàn)的數(shù)據(jù)包捕獲方法,其特征在于,在所述的步驟5-1)中,所述的判斷當前的數(shù)據(jù)包是否可以安全寫入數(shù)據(jù)信息域的判斷標準是如果當前需要寫入的數(shù)據(jù)包緩存單元的全局引用計數(shù)為0,則該緩存單元可以安全覆蓋,所述數(shù)據(jù)包就可安全寫入數(shù)據(jù)信息域中。
7.根據(jù)權(quán)利要求2所述的基于共享內(nèi)存實現(xiàn)的數(shù)據(jù)包捕獲方法,其特征在于,在所述的步驟5-2)中,所述的對管理信息域中與緩存單元所對應(yīng)的管理單元填充相應(yīng)的信息包括(1)、根據(jù)當前系統(tǒng)中已注冊的上層流量監(jiān)測分析應(yīng)用的個數(shù)初始化全局引用計數(shù)數(shù)組中的對應(yīng)元素;(2)、將訪問標識字段數(shù)組中的對應(yīng)元素進行置位。
全文摘要
本發(fā)明公開了一種基于共享內(nèi)存實現(xiàn)的數(shù)據(jù)包捕獲方法,包括網(wǎng)卡加載并初始化驅(qū)動程序;創(chuàng)建字符設(shè)備;設(shè)置監(jiān)測端口網(wǎng)卡為混雜模式;接收數(shù)據(jù)包,判斷接收端口,若為監(jiān)測端口,執(zhí)行下一步,否則將數(shù)據(jù)包交給操作系統(tǒng);判斷數(shù)據(jù)包可否寫入數(shù)據(jù)信息域中,若可以,則輸送到緩存單元中,執(zhí)行下一步;否則,丟棄數(shù)據(jù)包;初始化管理信息域中的管理單元;運行流量監(jiān)測分析程序;打開字符設(shè)備,獲取指針;提取數(shù)據(jù)包;若全局引用計數(shù)值不為0且標識字段中有標識為未被處理的位,執(zhí)行下一步,若全局引用計數(shù)值為0,忽略數(shù)據(jù)包,掛起流量監(jiān)測分析程序;執(zhí)行流量監(jiān)測分析程序,改變?nèi)忠糜嫈?shù)值,同時訪問標識字段的標識位設(shè)置為已處理,重新提取數(shù)據(jù)包。
文檔編號H04L12/26GK1925465SQ200610113329
公開日2007年3月7日 申請日期2006年9月22日 優(yōu)先權(quán)日2006年9月22日
發(fā)明者張敦行, 張廣興, 楊建華, 謝高崗 申請人:中國科學(xué)院計算技術(shù)研究所