網(wǎng)絡(luò)數(shù)據(jù)捕獲方法和系統(tǒng)的制作方法
【專利摘要】本發(fā)明實(shí)施例提供一種網(wǎng)絡(luò)數(shù)據(jù)捕獲方法和系統(tǒng)。該方法包括:網(wǎng)卡捕獲數(shù)據(jù)包,并緩存至網(wǎng)卡的接收先入先出隊列中;通過PCI DMA控制器將隊列中的數(shù)據(jù)包傳輸至內(nèi)核態(tài)驅(qū)動中的預(yù)配置循環(huán)緩存區(qū);基于預(yù)設(shè)中斷觸發(fā)策略,向內(nèi)核態(tài)驅(qū)動發(fā)送中斷請求;內(nèi)核態(tài)驅(qū)動根據(jù)中斷請求,停止接收所述網(wǎng)卡發(fā)送的新的中斷請求,并更新循環(huán)緩存區(qū)的描述符,以及恢復(fù)接收所述網(wǎng)卡發(fā)送的新的中斷請求;用戶態(tài)數(shù)據(jù)分析裝置根據(jù)循環(huán)緩存區(qū)的當(dāng)前描述符,判斷到循環(huán)緩存區(qū)有數(shù)據(jù)包時,提取數(shù)據(jù)包,并更新循環(huán)緩存區(qū)的描述符,實(shí)現(xiàn)了整個傳輸過程零拷貝,且無需系統(tǒng)調(diào)用,節(jié)約了CPU資源,提高了數(shù)據(jù)包的傳輸效率。
【專利說明】網(wǎng)絡(luò)數(shù)據(jù)捕獲方法和系統(tǒng)
【技術(shù)領(lǐng)域】
[0001]本發(fā)明實(shí)施例涉及計算機(jī)操作系統(tǒng)領(lǐng)域,尤其涉及一種網(wǎng)絡(luò)數(shù)據(jù)捕獲方法和系統(tǒng)。
【背景技術(shù)】
[0002]隨著計算機(jī)和通信技術(shù)的發(fā)展,網(wǎng)絡(luò)的應(yīng)用迅速普及,與此同時,網(wǎng)絡(luò)的安全性和可靠性日益受到人們的重視,安全性主要指網(wǎng)絡(luò)上的信息不被竊取、泄露及破壞;可靠性主要指網(wǎng)絡(luò)系統(tǒng)能夠持續(xù)、穩(wěn)定、可靠地運(yùn)行,網(wǎng)絡(luò)服務(wù)不被中斷和破壞。網(wǎng)絡(luò)數(shù)據(jù)包捕獲、監(jiān)聽和分析技術(shù)是網(wǎng)絡(luò)安全維護(hù)的一個基礎(chǔ)技術(shù),在當(dāng)前流行的大多數(shù)網(wǎng)絡(luò)流量及內(nèi)容分析系統(tǒng)中,幾乎都離不開網(wǎng)絡(luò)數(shù)據(jù)的捕獲。
[0003]網(wǎng)絡(luò)數(shù)據(jù)捕獲是指將通信數(shù)據(jù)通過分光或者鏡像得到一份副本,然后經(jīng)過以太網(wǎng)卡(以下簡稱為網(wǎng)卡)將數(shù)據(jù)捕獲進(jìn)入到數(shù)據(jù)分析裝置中。
[0004]請參閱圖1,為現(xiàn)有技術(shù)中一種網(wǎng)絡(luò)數(shù)據(jù)捕獲系統(tǒng)的結(jié)構(gòu)示意圖。該系統(tǒng)包括:網(wǎng)卡11、內(nèi)核緩存區(qū)12、內(nèi)核協(xié)議棧13、應(yīng)用緩存區(qū)14和數(shù)據(jù)分析裝置15,其中,應(yīng)用緩存區(qū)14和數(shù)據(jù)分析裝置15屬于應(yīng)用態(tài)?,F(xiàn)有的網(wǎng)絡(luò)數(shù)據(jù)捕獲技術(shù),一般是由網(wǎng)卡11捕獲數(shù)據(jù)包,并通過數(shù)據(jù)拷貝將數(shù)據(jù)包傳輸?shù)絻?nèi)核緩存區(qū)12中;內(nèi)核緩存區(qū)12中的數(shù)據(jù)包利用內(nèi)核協(xié)議棧13,通過多次數(shù)據(jù)拷貝逐級往上傳遞,具體地通過內(nèi)核協(xié)議棧13的數(shù)據(jù)包套接字(packet socket)將數(shù)據(jù)包拷貝一份,并將數(shù)據(jù)包逐級往上傳遞;數(shù)據(jù)分析裝置15通過系統(tǒng)調(diào)用,將傳遞到上層的內(nèi)存緩存區(qū)12中的數(shù)據(jù)包拷貝至應(yīng)用緩存區(qū)14中。
[0005]上述網(wǎng)絡(luò)數(shù)據(jù)捕獲技術(shù)存在的缺陷在于:從網(wǎng)卡捕獲到數(shù)據(jù)包,并將數(shù)據(jù)包傳遞到數(shù)據(jù)分析裝置的過程中,不僅存在多次數(shù)據(jù)拷貝,而且還需要系統(tǒng)調(diào)用,導(dǎo)致降低了數(shù)據(jù)包的傳輸效率,增加了系統(tǒng)和CPU (Central Processing Unit,中央處理器)資源開銷。
【發(fā)明內(nèi)容】
[0006]本發(fā)明實(shí)施例提供一種網(wǎng)絡(luò)數(shù)據(jù)捕獲方法和系統(tǒng),以減少系統(tǒng)和CPU資源開銷,并提高數(shù)據(jù)包的傳輸效率。
[0007]第一方面,本發(fā)明實(shí)施例提供了一種網(wǎng)絡(luò)數(shù)據(jù)捕獲方法,包括:
[0008]網(wǎng)卡捕獲數(shù)據(jù)包,并將所述數(shù)據(jù)包緩存至網(wǎng)卡的接收先入先出隊列中;
[0009]所述網(wǎng)卡通過外設(shè)部件互連接口直接內(nèi)存訪問PCI DMA控制器將所述接收先入先出隊列中的數(shù)據(jù)包傳輸至內(nèi)核態(tài)驅(qū)動中的預(yù)配置循環(huán)緩存區(qū);
[0010]所述網(wǎng)卡基于預(yù)設(shè)中斷觸發(fā)策略,向所述內(nèi)核態(tài)驅(qū)動發(fā)送中斷請求;
[0011]所述內(nèi)核態(tài)驅(qū)動根據(jù)所述中斷請求,停止接收所述網(wǎng)卡發(fā)送的新的中斷請求,以使在所述內(nèi)核態(tài)驅(qū)動根據(jù)所述中斷請求進(jìn)行中斷響應(yīng)的過程中,不被所述網(wǎng)卡發(fā)送的新的中斷請求再次中斷;并更新所述循環(huán)緩存區(qū)的描述符;以及恢復(fù)接收所述網(wǎng)卡發(fā)送的新的中斷請求,在接收到新的中斷請求時,返回根據(jù)所述新的中斷請求執(zhí)行所述中斷響應(yīng)操作;
[0012]用戶態(tài)數(shù)據(jù)分析裝置根據(jù)所述循環(huán)緩存區(qū)的當(dāng)前描述符,判斷所述循環(huán)緩存區(qū)是否有數(shù)據(jù)包;
[0013]若是,則所述用戶態(tài)數(shù)據(jù)分析裝置從所述循環(huán)緩存區(qū)中提取數(shù)據(jù)包,并更新所述循環(huán)緩存區(qū)的描述符;
[0014]其中,所述內(nèi)核態(tài)驅(qū)動和所述用戶態(tài)數(shù)據(jù)分析裝置通過內(nèi)存映射技術(shù)共享所述循環(huán)緩存區(qū);基于原子變量和原子操作的數(shù)據(jù)同步技術(shù)互斥使用所述循環(huán)緩存區(qū)。
[0015]第二方面,本發(fā)明實(shí)施例提供了一種網(wǎng)絡(luò)數(shù)據(jù)捕獲系統(tǒng),所述系統(tǒng)包括:網(wǎng)卡、內(nèi)核態(tài)驅(qū)動和用戶態(tài)數(shù)據(jù)分析裝置;
[0016]所述網(wǎng)卡用于捕獲數(shù)據(jù)包,并將所述數(shù)據(jù)包緩存至網(wǎng)卡的接收先入先出隊列中;還用于通過外設(shè)部件互連接口直接內(nèi)存訪問PCI DMA控制器將所述接收先入先出隊列中的數(shù)據(jù)包傳輸至內(nèi)核態(tài)驅(qū)動中的預(yù)配置循環(huán)緩存區(qū);還用于基于預(yù)設(shè)中斷觸發(fā)策略,向所述內(nèi)核態(tài)驅(qū)動發(fā)送中斷請求;
[0017]所述內(nèi)核態(tài)驅(qū)動用于預(yù)先配置循環(huán)緩存區(qū);還用于根據(jù)所述網(wǎng)卡發(fā)送的所述中斷請求,停止接收所述網(wǎng)卡發(fā)送的新的中斷請求,以使在所述內(nèi)核態(tài)驅(qū)動根據(jù)所述中斷請求進(jìn)行中斷響應(yīng)的過程中,不被所述網(wǎng)卡發(fā)送的新的中斷請求再次中斷;并更新所述循環(huán)緩存區(qū)的描述符;
[0018]所述用戶態(tài)數(shù)據(jù)分析裝置用于根據(jù)所述循環(huán)緩存區(qū)的當(dāng)前描述符,判斷所述循環(huán)緩存區(qū)是否有數(shù)據(jù)包;若是,則從所述循環(huán)緩存區(qū)中提取數(shù)據(jù)包,并更新所述循環(huán)緩存區(qū)的描述符;以及恢復(fù)接收所述網(wǎng)卡發(fā)送的新的中斷請求,在接收到新的中斷請求時,返回根據(jù)所述新的中斷請求執(zhí)行所述中斷響應(yīng)操作;
[0019]其中,所述內(nèi)核態(tài)驅(qū)動和所述用戶態(tài)數(shù)據(jù)分析裝置通過內(nèi)存映射技術(shù)共享所述循環(huán)緩存區(qū);基于原子變量和原子操作的數(shù)據(jù)同步技術(shù)互斥使用所述循環(huán)緩存區(qū)。
[0020]本發(fā)明實(shí)施例提供的網(wǎng)絡(luò)數(shù)據(jù)捕獲方法和系統(tǒng),通過外設(shè)部件互連接口為網(wǎng)卡提供連接接口,基于直接內(nèi)存訪問技術(shù),將網(wǎng)卡的接收先入先出隊列中數(shù)據(jù)包傳輸至內(nèi)核態(tài)驅(qū)動中的預(yù)配置循環(huán)緩存區(qū),僅需事先安排的少量CPU資源即可自動完成數(shù)據(jù)包從網(wǎng)卡到內(nèi)核態(tài)驅(qū)動的傳輸,因此在大量數(shù)據(jù)包傳輸過程中節(jié)約了大量的CPU資源;通過內(nèi)核態(tài)驅(qū)動和用戶態(tài)數(shù)據(jù)分析裝置共享及互斥使用循環(huán)緩存區(qū),一方面,實(shí)現(xiàn)用戶態(tài)和內(nèi)核態(tài)之間共享循環(huán)緩存區(qū)以及循環(huán)緩存區(qū)的描述符,避免數(shù)據(jù)從內(nèi)核態(tài)拷貝到用戶態(tài)的大量拷貝過程,從而進(jìn)一步節(jié)約了大量CPU資源,另一方面,保證用戶態(tài)和內(nèi)核態(tài)在循環(huán)緩存區(qū)的描述符的操作上是同步的,因此,解決了數(shù)據(jù)的生產(chǎn)和消費(fèi)之間的同步問題,并且在數(shù)據(jù)包從網(wǎng)卡到內(nèi)核態(tài)控制器的循環(huán)緩存區(qū),以及從循環(huán)緩存區(qū)到用戶態(tài)數(shù)據(jù)分析裝置的整個過程中零拷貝,用戶態(tài)不需要系統(tǒng)調(diào)用就可以訪問到內(nèi)核態(tài)捕獲到的數(shù)據(jù)包,從而避免了不必要的系統(tǒng)調(diào)用和由內(nèi)核同時服務(wù)于多個網(wǎng)卡時產(chǎn)生的上下文切換開銷,同時提高了數(shù)據(jù)包的傳輸效率。
【專利附圖】
【附圖說明】
[0021]為了更清楚地說明本發(fā)明,下面將對本發(fā)明中所需要使用的附圖做一簡單地介紹,顯而易見地,下面描述中的附圖是本發(fā)明的一些實(shí)施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
[0022]圖1為現(xiàn)有技術(shù)中一種網(wǎng)絡(luò)數(shù)據(jù)捕獲系統(tǒng)的結(jié)構(gòu)示意圖;
[0023]圖2a為本發(fā)明實(shí)施例一提供的一種網(wǎng)絡(luò)數(shù)據(jù)捕獲方法的流程圖;
[0024]圖2b為本發(fā)明實(shí)施例一提供的網(wǎng)絡(luò)數(shù)據(jù)捕獲方法中一種用戶態(tài)數(shù)據(jù)分析裝置從所述循環(huán)緩存區(qū)中提取數(shù)據(jù)包,并更新所述循環(huán)緩存區(qū)的描述符的方法流程圖;
[0025]圖2c為本發(fā)明實(shí)施例一提供的一種網(wǎng)卡、內(nèi)核態(tài)驅(qū)動和用戶態(tài)數(shù)據(jù)分析裝置共享循環(huán)緩存區(qū)的示意圖;
[0026]圖3為本發(fā)明實(shí)施例二提供的一種網(wǎng)絡(luò)數(shù)據(jù)捕獲方法的流程圖;
[0027]圖4為本發(fā)明實(shí)施例三提供的一種網(wǎng)絡(luò)數(shù)據(jù)捕獲系統(tǒng)的結(jié)構(gòu)示意圖;
[0028]圖5為本發(fā)明實(shí)施例四提供的一種網(wǎng)絡(luò)數(shù)據(jù)捕獲系統(tǒng)的結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0029]為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合附圖對本發(fā)明實(shí)施例中的技術(shù)方案作進(jìn)一步詳細(xì)描述,顯然,所描述的實(shí)施例是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例。可以理解的是,此處所描述的具體實(shí)施例僅用于解釋本發(fā)明,而非對本發(fā)明的限定,基于本發(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有作出創(chuàng)造性勞動前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。另外還需要說明的是,為了便于描述,附圖中僅示出了與本發(fā)明相關(guān)的部分而非全部內(nèi)容。
[0030]實(shí)施例一
[0031]請參閱圖2a,為本發(fā)明實(shí)施例一提供的一種網(wǎng)絡(luò)數(shù)據(jù)捕獲方法的流程圖。本發(fā)明實(shí)施例的方法適用于網(wǎng)絡(luò)數(shù)據(jù)捕獲系統(tǒng),該系統(tǒng)包括:網(wǎng)卡、內(nèi)核態(tài)驅(qū)動和用戶態(tài)數(shù)據(jù)分析裝置。其中,網(wǎng)卡屬于硬件層,內(nèi)核態(tài)驅(qū)動屬于內(nèi)核態(tài),用戶態(tài)數(shù)據(jù)分析裝置屬于用戶態(tài)。
[0032]該方法包括:步驟210?步驟260。
[0033]步驟210、網(wǎng)卡捕獲數(shù)據(jù)包,并將所述數(shù)據(jù)包緩存至網(wǎng)卡的接收先入先出隊列中。
[0034]其中,接收先入先出隊列(RX First Input First Output, RX FIFO)用于接收網(wǎng)卡捕獲到的數(shù)據(jù)包。RX代表接收,先入先出隊列(FIFO)是一種先進(jìn)先出的數(shù)據(jù)緩存器,與普通存儲器的區(qū)別在于:沒有外部讀寫地址線,使用起來非常簡單,先入先出隊列的特點(diǎn)在于:只能順序?qū)懭霐?shù)據(jù),順序的讀出數(shù)據(jù),其數(shù)據(jù)地址由內(nèi)部讀寫指針自動加I完成,而普通存儲器是由地址線決定讀取或?qū)懭肽硞€指定的地址。
[0035]步驟220、所述網(wǎng)卡通過外設(shè)部件互連接口直接內(nèi)存訪問(Peripheral ComponentInterconnect Direct Memory Access,PCI DMA)控制器將所述接收先入先出隊列中的數(shù)據(jù)包傳輸至內(nèi)核態(tài)驅(qū)動中的預(yù)配置循環(huán)緩存區(qū)(RingBuffer)。
[0036]在本步驟中,具體是采用PCI為網(wǎng)卡提供連接接口,基于直接內(nèi)存訪問(DMA)技術(shù),將網(wǎng)卡的接收先入先出隊列中數(shù)據(jù)包傳輸至內(nèi)核態(tài)驅(qū)動中的預(yù)配置循環(huán)緩存區(qū),僅需事先安排的少量CPU資源即可自動完成數(shù)據(jù)包從網(wǎng)卡到內(nèi)核態(tài)驅(qū)動的傳輸,因此在大量數(shù)據(jù)包傳輸過程中節(jié)約了大量的CPU資源。
[0037]其中,具體可以采用PCI插槽,該插槽可插接顯卡、聲卡、網(wǎng)卡、USB2.0卡、以及視頻采集卡等多種擴(kuò)展卡,通過插接不同的擴(kuò)展卡可以實(shí)現(xiàn)相應(yīng)功能。
[0038]直接內(nèi)存訪問(DMA)是用于快速數(shù)據(jù)交換的重要技術(shù),具有獨(dú)立于CPU的后臺批量數(shù)據(jù)傳輸能力。
[0039]循環(huán)緩存區(qū)主要負(fù)責(zé)緩存網(wǎng)卡傳輸?shù)臄?shù)據(jù)包、以及內(nèi)核態(tài)和用戶態(tài)之間的數(shù)據(jù)交互。
[0040]步驟230、所述網(wǎng)卡基于預(yù)設(shè)中斷觸發(fā)策略,向所述內(nèi)核態(tài)驅(qū)動發(fā)送中斷請求。[0041 ] 本步驟具體可以是在由網(wǎng)卡傳輸至內(nèi)核態(tài)驅(qū)動中的預(yù)配置循環(huán)緩存區(qū)的數(shù)據(jù)包達(dá)到設(shè)定數(shù)量時,觸發(fā)網(wǎng)卡向所述內(nèi)核態(tài)驅(qū)動發(fā)送中斷請求。
[0042]本步驟中,除了根據(jù)數(shù)據(jù)包的數(shù)量觸發(fā)網(wǎng)卡向所述內(nèi)核態(tài)驅(qū)動發(fā)送中斷請求之夕卜,還可以根據(jù)設(shè)定時間,觸發(fā)網(wǎng)卡向所述內(nèi)核態(tài)驅(qū)動發(fā)送中斷請求,也即網(wǎng)卡捕獲數(shù)據(jù)包,并將捕獲的數(shù)據(jù)包傳輸至內(nèi)核態(tài)驅(qū)動的循環(huán)緩存區(qū),并再次捕獲新的數(shù)據(jù)包,并將捕獲的新數(shù)據(jù)包傳輸至內(nèi)核態(tài)驅(qū)動的循環(huán)緩存區(qū),如此循環(huán)往復(fù),只要網(wǎng)卡執(zhí)行捕獲數(shù)據(jù)包,并將捕獲的數(shù)據(jù)包傳輸至內(nèi)核態(tài)驅(qū)動的循環(huán)緩存區(qū)的操作的時間達(dá)到設(shè)定時間,則觸發(fā)網(wǎng)卡向所述內(nèi)核態(tài)驅(qū)動發(fā)送中斷請求。
[0043]步驟240、所述內(nèi)核態(tài)驅(qū)動根據(jù)所述中斷請求,停止接收所述網(wǎng)卡發(fā)送的新的中斷請求,以使在所述內(nèi)核態(tài)驅(qū)動根據(jù)所述中斷請求進(jìn)行中斷響應(yīng)的過程中,不被所述網(wǎng)卡發(fā)送的新的中斷請求再次中斷;并更新所述循環(huán)緩存區(qū)的描述符;以及恢復(fù)接收所述網(wǎng)卡發(fā)送的新的中斷請求,在接收到新的中斷請求時,返回根據(jù)所述新的中斷請求執(zhí)行所述中斷響應(yīng)操作。
[0044]需要說明的是,在執(zhí)行本步驟時,網(wǎng)卡可以執(zhí)行繼續(xù)捕獲新的數(shù)據(jù)包的操作。所述內(nèi)核態(tài)驅(qū)動每接收到一次中斷請求,即對中斷請求進(jìn)行響應(yīng),由于在對當(dāng)前中斷請求進(jìn)行響應(yīng)過程中,首先停止接收所述網(wǎng)卡發(fā)送的新的中斷請求,使得在所述內(nèi)核態(tài)驅(qū)動根據(jù)當(dāng)前中斷請求進(jìn)行中斷響應(yīng)的過程中,不被所述發(fā)送的新的中斷請求再次中斷,由于在對當(dāng)前中斷請求進(jìn)行響應(yīng)后,恢復(fù)接收所述網(wǎng)卡發(fā)送的新的中斷請求,能夠使內(nèi)核態(tài)驅(qū)動對每一次中斷請求進(jìn)行響應(yīng)的過程中不被新的中斷請求所打擾,這樣,在每一次中斷響應(yīng)過程中,保證了更新的所述循環(huán)描述符的準(zhǔn)確性。
[0045]步驟250、用戶態(tài)數(shù)據(jù)分析裝置根據(jù)所述循環(huán)緩存區(qū)的當(dāng)前描述符,判斷所述循環(huán)緩存區(qū)是否有數(shù)據(jù)包,若是,執(zhí)行步驟260。
[0046]步驟260、所述用戶態(tài)數(shù)據(jù)分析裝置從所述循環(huán)緩存區(qū)中提取數(shù)據(jù)包,并更新所述循環(huán)緩存區(qū)的描述符。
[0047]步驟240具體可以是,所述內(nèi)核態(tài)驅(qū)動根據(jù)所述中斷請求,停止接收所述網(wǎng)卡發(fā)送的新的中斷請求。
[0048]更新所述循環(huán)緩存區(qū)的頭指針和尾指針,以及使用計數(shù)和空閑計數(shù);
[0049]更新所述循環(huán)緩存區(qū)包含的緩存單元對應(yīng)的狀態(tài)。
[0050]其中,所述循環(huán)緩存區(qū)包含的緩存單元對應(yīng)的狀態(tài),可以包括:空閑狀態(tài)、使用中狀態(tài)和可用狀態(tài)。
[0051]其中,網(wǎng)卡根據(jù)頭指針指向的緩存單元以及各緩存單元的次序關(guān)系,依次將捕獲到的數(shù)據(jù)包傳輸至頭指針指向的緩存單元以及該緩存單元的后序各緩存單元中;用戶態(tài)數(shù)據(jù)分析裝置根據(jù)尾指針指向的緩存單元以及各緩存單元的次序關(guān)系,依次從尾指針指向的緩存單元以及該緩存單元的后序各緩存單元中提取數(shù)據(jù)包;使用計數(shù)為存儲有數(shù)據(jù)包的緩存單元總數(shù)/循環(huán)緩存區(qū)包含的緩存單元總數(shù),一方面,網(wǎng)卡可以將捕獲的數(shù)據(jù)包傳輸至從頭指針指向的緩存單元開始的使用計數(shù)分子對應(yīng)的緩存單元中,另一方面,用戶態(tài)數(shù)據(jù)分析裝置可以根據(jù)所述循環(huán)緩存區(qū)的當(dāng)前描述符中的尾指針和使用計數(shù),分別判斷所述循環(huán)緩存區(qū)中從尾指針指向的緩存單元開始的使用計數(shù)分子對應(yīng)的緩存單元中是否有數(shù)據(jù)包;空閑計數(shù)為未存儲數(shù)據(jù)包的緩存單元總數(shù)/循環(huán)緩存區(qū)包含的緩存單元總數(shù)。
[0052]當(dāng)前頭指針指向的緩存單元(Buffer)的狀態(tài)為空閑狀態(tài)時,網(wǎng)卡可以將捕獲的數(shù)據(jù)包傳輸至該Buffer中;當(dāng)前頭指針指向的Buffer的狀態(tài)為使用中狀態(tài)時,只有正在往該Buffer中傳輸數(shù)據(jù)包的網(wǎng)卡可以繼續(xù)將捕獲的數(shù)據(jù)包傳輸至該Buffer中;當(dāng)前尾指針指向的Buffer的狀態(tài)為使用中狀態(tài)時,用戶態(tài)數(shù)據(jù)分析裝置判斷到該Buffer中沒有數(shù)據(jù)包,因此所述用戶態(tài)數(shù)據(jù)分析裝置不可以從所述循環(huán)緩存區(qū)中提取數(shù)據(jù)包,從而無需更新所述循環(huán)緩存區(qū)的描述符;當(dāng)前尾指針指向的Buffer的狀態(tài)為可用狀態(tài)時,用戶態(tài)數(shù)據(jù)分析裝置判斷到該Buffer中有數(shù)據(jù)包,因此所述用戶態(tài)數(shù)據(jù)分析裝置可以從所述循環(huán)緩存區(qū)中提取數(shù)據(jù)包,并更新所述循環(huán)緩存區(qū)的描述符。
[0053]其中,所述內(nèi)核態(tài)驅(qū)動和所述用戶態(tài)數(shù)據(jù)分析裝置通過內(nèi)存映射技術(shù)共享所述循環(huán)緩存區(qū);基于原子變量和原子操作的數(shù)據(jù)同步技術(shù)互斥使用所述循環(huán)緩存區(qū)。
[0054]需要說明的是,在所述內(nèi)核態(tài)驅(qū)動進(jìn)行中斷響應(yīng)的過程中,所述網(wǎng)卡可以返回捕獲新的數(shù)據(jù)包的操作,并將所述捕獲的新的數(shù)據(jù)包傳輸至所述循環(huán)緩存區(qū)中當(dāng)前頭指針指向的、且當(dāng)前狀態(tài)為空閑狀態(tài)的緩存單元中。
[0055]本實(shí)施例的技術(shù)方案,通過PCI為網(wǎng)卡提供連接接口,基于直接內(nèi)存訪問技術(shù),將網(wǎng)卡的接收先入先出隊列中數(shù)據(jù)包傳輸至內(nèi)核態(tài)驅(qū)動中的預(yù)配置循環(huán)緩存區(qū),僅需事先安排的少量CPU資源即可自動完成數(shù)據(jù)包從網(wǎng)卡到內(nèi)核態(tài)驅(qū)動的傳輸,因此在大量數(shù)據(jù)包傳輸過程中節(jié)約了大量的CPU資源;通過內(nèi)核態(tài)驅(qū)動和用戶態(tài)數(shù)據(jù)分析裝置共享及互斥使用循環(huán)緩存區(qū),一方面,實(shí)現(xiàn)用戶態(tài)和內(nèi)核態(tài)之間共享循環(huán)緩存區(qū)以及循環(huán)緩存區(qū)的描述符,避免數(shù)據(jù)從內(nèi)核態(tài)拷貝到用戶態(tài)的大量拷貝過程,從而進(jìn)一步節(jié)約了大量CPU資源,另一方面,保證用戶態(tài)和內(nèi)核態(tài)在循環(huán)緩存區(qū)的描述符的操作上是同步的,因此,解決了數(shù)據(jù)的生產(chǎn)和消費(fèi)之間的同步問題,并且在數(shù)據(jù)包從網(wǎng)卡到內(nèi)核態(tài)控制器的循環(huán)緩存區(qū),以及從循環(huán)緩存區(qū)到用戶態(tài)數(shù)據(jù)分析裝置的整個過程中零拷貝,用戶態(tài)不需要系統(tǒng)調(diào)用就可以訪問到內(nèi)核態(tài)捕獲到的數(shù)據(jù)包,從而避免了不必要的系統(tǒng)調(diào)用和由內(nèi)核同時服務(wù)于多個網(wǎng)卡時產(chǎn)生的上下文切換開銷,同時提高了數(shù)據(jù)包的傳輸效率。
[0056]在本實(shí)施例的基礎(chǔ)上,在步驟250之后,所述方法還可以包括:若否,則執(zhí)行步驟270。
[0057]步驟270、所述用戶態(tài)數(shù)據(jù)分析裝置按預(yù)設(shè)睡眠時長睡眠,并在所述預(yù)設(shè)睡眠時長之后,返回根據(jù)所述循環(huán)緩存區(qū)的當(dāng)前描述符,判斷所述循環(huán)緩存區(qū)是否有數(shù)據(jù)包的操作。
[0058]也即,在判斷到?jīng)]有數(shù)據(jù)包時,所述用戶態(tài)數(shù)據(jù)分析裝置按預(yù)設(shè)睡眠時長(例如1s)睡眠,并在所述預(yù)設(shè)睡眠時長之后,返回步驟250。
[0059]還需要說明的是,在步驟260之后,可以返回步驟250,換言之,進(jìn)行下一輪的數(shù)據(jù)包有無判斷的操作。
[0060]本實(shí)施方式,通過用戶態(tài)數(shù)據(jù)分析裝置主動輪詢循環(huán)緩存區(qū)是否有數(shù)據(jù)包,在有數(shù)據(jù)包時,能夠使用戶態(tài)數(shù)據(jù)分析裝置及時捕獲網(wǎng)卡傳輸?shù)臄?shù)據(jù)包,提高了數(shù)據(jù)包的傳輸效率,在沒有數(shù)據(jù)包時,進(jìn)行睡眠,減少了系統(tǒng)開銷,并在設(shè)定的睡眠時長之后,再次主動輪詢循環(huán)緩存區(qū)是否有數(shù)據(jù)包,有利于及時發(fā)現(xiàn)數(shù)據(jù)包。
[0061]請參閱圖2b,為本發(fā)明實(shí)施例一提供的網(wǎng)絡(luò)數(shù)據(jù)捕獲方法中一種用戶態(tài)數(shù)據(jù)分析裝置從所述循環(huán)緩存區(qū)中提取數(shù)據(jù)包,并更新所述循環(huán)緩存區(qū)的描述符的方法流程圖。
[0062]該方法包括:步驟261?步驟263。
[0063]步驟261、所述用戶態(tài)數(shù)據(jù)分析裝置判斷循環(huán)緩存區(qū)的當(dāng)前使用計數(shù)是否大于0,若是,則執(zhí)行步驟262。
[0064]步驟262、所述用戶態(tài)數(shù)據(jù)分析裝置從當(dāng)前尾指針指向的、且當(dāng)前狀態(tài)為可用狀態(tài)的緩存單元中提取數(shù)據(jù)包。
[0065]步驟263、所述用戶態(tài)數(shù)據(jù)分析裝置將提取數(shù)據(jù)包后的該緩存單元的狀態(tài)更新為空閑狀態(tài),并更新所述循環(huán)緩存區(qū)的尾指針、以及使用計數(shù)和空閑計數(shù),并返回判斷循環(huán)緩存區(qū)的當(dāng)前使用計數(shù)是否大于O的操作。
[0066]示例
[0067]請參閱圖2c,為本發(fā)明實(shí)施例一提供的一種網(wǎng)卡、內(nèi)核態(tài)驅(qū)動和用戶態(tài)數(shù)據(jù)分析裝置共享循環(huán)緩存區(qū)的示意圖。
[0068]內(nèi)核態(tài)驅(qū)動預(yù)先配置循環(huán)緩存區(qū)(RingBuffer),該循環(huán)緩存區(qū)由多個緩存單元(Buffer)組成(如圖2c所示),然后,內(nèi)核態(tài)驅(qū)動初始化配置的循環(huán)緩存區(qū),每個Buffer對應(yīng)各自的初始化的描述符(RX Ring),如圖2c中所示,每個Buffer對應(yīng)各自接收描述符,具體可以包括第一接收描述符(RX Descl)、第二接收描述符(RX Desc2)以及第三接收描述符(RX Desc3)等。硬件層的網(wǎng)卡通過PCI DMA控制器并根據(jù)RX Ring中初始化的RXDesc,將捕獲到的數(shù)據(jù)包傳輸至內(nèi)核態(tài)驅(qū)動中的預(yù)配置循環(huán)緩存區(qū)(RingBuffer)中,可以供內(nèi)核態(tài)驅(qū)動和用戶態(tài)數(shù)據(jù)分析裝置訪問。
[0069]例如,以循環(huán)緩存區(qū)包括20個緩存區(qū)為例進(jìn)行說明。內(nèi)核態(tài)驅(qū)動配置并初始化循環(huán)緩存區(qū)之后,循環(huán)緩存區(qū)的描述符中的頭指針(head)指向第一個緩存單元(Buffer),循環(huán)緩存區(qū)的描述符中的尾指針(tail)也指向第一個Buffer,同時將循環(huán)緩存區(qū)的描述符中的使用計數(shù)(used_cnt)初始化為0/20和空閑計數(shù)(free_cnt)初始化為20/20,并將20個緩存區(qū)的狀態(tài)均初始化為空閑狀態(tài)。
[0070]假設(shè)第一網(wǎng)卡捕獲到2個數(shù)據(jù)包,之后第二網(wǎng)卡捕獲到I個數(shù)據(jù)包,假設(shè)每個數(shù)據(jù)包占據(jù)一個Buffer,并假設(shè)第一網(wǎng)卡傳輸至內(nèi)核態(tài)驅(qū)動中的預(yù)配置循環(huán)緩存區(qū)的數(shù)據(jù)包達(dá)到2個以上時,第一網(wǎng)卡向所述內(nèi)核態(tài)驅(qū)動發(fā)送中斷請求,以及第二網(wǎng)卡傳輸至內(nèi)核態(tài)驅(qū)動中的預(yù)配置循環(huán)緩存區(qū)的數(shù)據(jù)包達(dá)到3個以上時,第二網(wǎng)卡向所述內(nèi)核態(tài)驅(qū)動發(fā)送中斷請求。
[0071]循環(huán)緩存區(qū)的初始化描述符中的頭指針指向第一個Buffer,則第一網(wǎng)卡將捕獲到的第一個數(shù)據(jù)包傳輸至內(nèi)核態(tài)驅(qū)動的RingBuffer中的第一個Buffer中,并將捕獲到的第二個數(shù)據(jù)包傳輸至第一個Buffer的后序第二個Buffer。在第二網(wǎng)卡將數(shù)據(jù)包傳輸至第三個Buffer中時,所述內(nèi)核態(tài)驅(qū)動接收到第一網(wǎng)卡發(fā)送的中斷請求,則內(nèi)核態(tài)驅(qū)動更新所述循環(huán)緩存區(qū)的描述符(RingBufferDesc),具體地,將循環(huán)緩存區(qū)的描述符更新如下:頭指針指向第四個Buffer,尾指針仍指向第一個Buffer,使用計數(shù)更新為3/20,空閑計數(shù)更新為17/20,將第一個Buffer和第二個Buffer狀態(tài)均更新為可用狀態(tài),并將第三個Buffer的狀態(tài)更新為使用中狀態(tài),以及將第四個Buffer及后序的第五個Buffer等的狀態(tài)均更新為空閑狀態(tài)。
[0072]由于所述內(nèi)核態(tài)驅(qū)動和所述用戶態(tài)數(shù)據(jù)分析裝置通過內(nèi)存映射技術(shù)共享所述循環(huán)緩存區(qū);基于原子變量和原子操作的數(shù)據(jù)同步技術(shù)互斥使用所述循環(huán)緩存區(qū),因此同一時刻只支持內(nèi)核態(tài)驅(qū)動或用戶態(tài)數(shù)據(jù)分析裝置執(zhí)行的所述描述符更新操作,此時,內(nèi)核態(tài)驅(qū)動和用戶態(tài)數(shù)據(jù)分析裝置共享的循環(huán)緩存區(qū)的描述符為:頭指針指向第四個Buffer,尾指針指向第一個Buffer,使用計數(shù)為3/20,空閑計數(shù)為17/20,第一個Buffer和第二個Buffer狀態(tài)均為可用狀態(tài),第三個Buffer的狀態(tài)為使用中狀態(tài),以及第四個Buffer及后序的第五個Buffer等的狀態(tài)均為空閑狀態(tài)。
[0073]用戶態(tài)數(shù)據(jù)分析裝置根據(jù)所述循環(huán)緩存區(qū)的當(dāng)前描述符的尾指針和使用計數(shù),具體執(zhí)行下述操作:判斷到循環(huán)緩存區(qū)的當(dāng)前使用計數(shù)3/20大于0,根據(jù)當(dāng)前尾指針指向的第一個Buffer,以及該第一個Buffer的狀態(tài)為可用狀態(tài),則判斷到第一個Buffer中存儲有數(shù)據(jù)包,并從第一個Buffer提取數(shù)據(jù)包,在從第一個Buffer提取數(shù)據(jù)包之后,不更新頭指針,也即頭指針仍指向第四個Buffer,尾指針更新為指向第二個Buffer,使用計數(shù)更新為2/20,空閑計數(shù)更新為18/20,將第一個Buffer的狀態(tài)更新為空閑狀態(tài),不更新其他Buffer的狀態(tài);之后,判斷到循環(huán)緩存區(qū)的當(dāng)前使用計數(shù)2/20大于0,根據(jù)當(dāng)前尾指針指向的第二個Buffer,以及該第二個Buffer的狀態(tài)為可用狀態(tài),則判斷到第二個Buffer中存儲有數(shù)據(jù)包,并從第二個Buffer提取數(shù)據(jù)包,在從第二個Buffer提取數(shù)據(jù)包之后,不更新頭指針,也即頭指針仍指向第四個Buffer,尾指針更新為指向第三個Buffer,使用計數(shù)更新為1/20,空閑計數(shù)更新為19/20,將第二個Buffer的狀態(tài)更新為空閑狀態(tài),不更新其他Buffer的狀態(tài);之后,判斷到循環(huán)緩存區(qū)的當(dāng)前使用計數(shù)1/20大于0,根據(jù)當(dāng)前尾指針指向的第三個Buffer,以及該第三個Buffer的狀態(tài)為使用中狀態(tài),則判斷到第三個Buffer中沒有數(shù)據(jù)包,而是正在存儲數(shù)據(jù)包,則不從第三個Buffer中提取數(shù)據(jù)包,此時不更新循環(huán)緩存區(qū)的描述符。
[0074]實(shí)施例二
[0075]請參閱圖3,為本發(fā)明實(shí)施例二提供的一種網(wǎng)絡(luò)數(shù)據(jù)捕獲方法的流程圖。本實(shí)施例的方法適用于網(wǎng)絡(luò)數(shù)據(jù)捕獲系統(tǒng),該系統(tǒng)包括:驅(qū)動模塊、配置于硬件層的網(wǎng)卡、配置于內(nèi)核態(tài)的內(nèi)核態(tài)驅(qū)動和網(wǎng)絡(luò)適配器,以及配置于用戶態(tài)的用戶態(tài)數(shù)據(jù)分析裝置。其中,網(wǎng)絡(luò)適配器為網(wǎng)卡的硬件驅(qū)動,主要負(fù)責(zé)網(wǎng)卡的初始化和配置、以及數(shù)據(jù)包的收發(fā)等功能;整個方法流程包括兩級循環(huán)體,分別為循環(huán)體一和循環(huán)體二,在循環(huán)體一中,由驅(qū)動模塊加載(即圖3所示的注冊驅(qū)動模塊)開始工作,直到驅(qū)動模塊卸載(即圖3所示的注銷驅(qū)動模塊)結(jié)束工作。
[0076]該方法包括:步驟310?步驟370。其中,循環(huán)體一包括步驟310?步驟370,循環(huán)體二包括步驟330?步驟350。
[0077]步驟310、注冊驅(qū)動模塊。
[0078]步驟320、內(nèi)核態(tài)驅(qū)動注冊并創(chuàng)建循環(huán)緩存區(qū)(RingBuffer)。在本步驟中,具體可以包括步驟321?步驟322。
[0079]步驟321、所述內(nèi)核態(tài)驅(qū)動注冊并創(chuàng)建循環(huán)緩存區(qū)。
[0080]步驟322、所述內(nèi)核態(tài)驅(qū)動初始化所述創(chuàng)建的循環(huán)緩存區(qū),作為預(yù)配置循環(huán)緩存區(qū)。
[0081]其中,RingBuffer可以設(shè)計為字符設(shè)備。
[0082]步驟330、打開網(wǎng)絡(luò)適配器。
[0083]步驟340、網(wǎng)卡捕獲數(shù)據(jù)包,并與內(nèi)核態(tài)驅(qū)動和用戶態(tài)數(shù)據(jù)分析裝置交互捕獲到的數(shù)據(jù)包。
[0084]本步驟中,同樣適用于前述實(shí)施例中步驟210?步驟260,或者步驟210?步驟270,此處不再贅述。
[0085]需要說明的是,在步驟210之前,執(zhí)行步驟320即可,從而網(wǎng)卡可以將捕獲到的數(shù)據(jù)包傳輸至預(yù)配置循環(huán)緩存區(qū)中。
[0086]步驟350、關(guān)閉網(wǎng)絡(luò)適配器。
[0087]步驟360、注銷驅(qū)動模塊。
[0088]步驟370、所述內(nèi)核態(tài)驅(qū)動注銷并釋放所述創(chuàng)建的循環(huán)緩存區(qū)。
[0089]需要說明的是,在步驟260之后,執(zhí)行步驟370即可。
[0090]步驟370具體可以包括:步驟371?步驟373。
[0091]步驟371中,清空循環(huán)緩存空間,也即清空各緩存單元;步驟372中,釋放循環(huán)緩存空間,也即釋放各緩存單元;步驟373中,注銷循環(huán)緩存區(qū)(RingBuffer)。由前述可知,RingBuffer被設(shè)計為字符設(shè)備,因此步驟373也就是注銷該RingBufTer字符設(shè)備。
[0092]需要說明的是,循環(huán)體二的循環(huán)次數(shù)通常大于循環(huán)體一的循環(huán)次數(shù)。換言之,并非在每次網(wǎng)卡捕獲數(shù)據(jù)包,并通過PCI DMA控制器將所述接收先入先出隊列中的數(shù)據(jù)包傳輸至內(nèi)核態(tài)驅(qū)動中的預(yù)配置循環(huán)緩存區(qū)之前,都由所述內(nèi)核態(tài)驅(qū)動執(zhí)行注冊并創(chuàng)建循環(huán)環(huán)緩存區(qū);并初始化所述創(chuàng)建的循環(huán)緩存區(qū),作為所述預(yù)配置循環(huán)緩存區(qū)的操作。
[0093]同樣地,并非在每次在所述用戶態(tài)數(shù)據(jù)分析裝置從所述循環(huán)緩存區(qū)中提取數(shù)據(jù)包之后,都執(zhí)行所述內(nèi)核態(tài)驅(qū)動注銷并釋放所述創(chuàng)建的循環(huán)緩存區(qū)的操作。
[0094]本實(shí)施例的技術(shù)方案,在循環(huán)體一中,由驅(qū)動模塊加載開始工作,直到驅(qū)動模塊卸載結(jié)束工作。驅(qū)動模塊加載后,首先注冊并創(chuàng)建循環(huán)緩存區(qū),注冊過程中初始化循環(huán)緩存區(qū)區(qū)作為預(yù)配置循環(huán)緩存區(qū),然后進(jìn)入循環(huán)體二 ;驅(qū)動模塊卸載時,首先清空和釋放循環(huán)緩存區(qū)空間,注銷RingBuffer設(shè)備;在循環(huán)體二中,網(wǎng)卡捕獲數(shù)據(jù)包,并與內(nèi)核態(tài)驅(qū)動和用戶態(tài)數(shù)據(jù)分析裝置交互捕獲到的數(shù)據(jù)包,通過外設(shè)部件互連接口為網(wǎng)卡提供連接接口,基于直接內(nèi)存訪問技術(shù),將網(wǎng)卡的接收先入先出隊列中數(shù)據(jù)包傳輸至內(nèi)核態(tài)驅(qū)動中的預(yù)配置循環(huán)緩存區(qū),僅需事先安排的少量CPU資源即可自動完成數(shù)據(jù)包從網(wǎng)卡到內(nèi)核態(tài)驅(qū)動的傳輸,因此在大量數(shù)據(jù)包傳輸過程中節(jié)約了大量的CPU資源;通過內(nèi)核態(tài)驅(qū)動和用戶態(tài)數(shù)據(jù)分析裝置共享及互斥使用循環(huán)緩存區(qū),一方面,實(shí)現(xiàn)用戶態(tài)和內(nèi)核態(tài)之間共享循環(huán)緩存區(qū)以及循環(huán)緩存區(qū)的描述符,避免數(shù)據(jù)從內(nèi)核態(tài)拷貝到用戶態(tài)的大量拷貝過程,從而進(jìn)一步節(jié)約了大量CPU資源,另一方面,保證用戶態(tài)和內(nèi)核態(tài)在循環(huán)緩存區(qū)的描述符的操作上是同步的,因此,解決了數(shù)據(jù)的生產(chǎn)和消費(fèi)之間的同步問題,并且在數(shù)據(jù)包從網(wǎng)卡到內(nèi)核態(tài)控制器的循環(huán)緩存區(qū),以及從循環(huán)緩存區(qū)到用戶態(tài)數(shù)據(jù)分析裝置的整個過程中零拷貝,用戶態(tài)不需要系統(tǒng)調(diào)用就可以訪問到內(nèi)核態(tài)捕獲到的數(shù)據(jù)包,從而避免了不必要的系統(tǒng)調(diào)用和由內(nèi)核同時服務(wù)于多個網(wǎng)卡時產(chǎn)生的上下文切換開銷,同時提高了數(shù)據(jù)包的傳輸效率。
[0095]實(shí)施例三
[0096]請參閱圖4,為本發(fā)明實(shí)施例三提供的一種網(wǎng)絡(luò)數(shù)據(jù)捕獲系統(tǒng)的結(jié)構(gòu)示意圖。所述系統(tǒng)包括:網(wǎng)卡410、內(nèi)核態(tài)驅(qū)動420和用戶態(tài)數(shù)據(jù)分析裝置430。
[0097]其中,所述網(wǎng)卡410用于捕獲數(shù)據(jù)包,并將所述數(shù)據(jù)包緩存至網(wǎng)卡的接收先入先出隊列(RX FIFO)中;還用于通過PCI DMA控制器將所述接收先入先出隊列中的數(shù)據(jù)包傳輸至內(nèi)核態(tài)驅(qū)動420中的預(yù)配置循環(huán)緩存區(qū),具體可以通過PCI DMA控制器將所述接收先入先出隊列中的數(shù)據(jù)包傳輸至網(wǎng)絡(luò)適配器(adapter)的數(shù)據(jù)接收空間(rx ring)所指向的內(nèi)核態(tài)驅(qū)動420中的預(yù)配置循環(huán)緩存區(qū);還用于基于預(yù)設(shè)中斷觸發(fā)策略,向所述內(nèi)核態(tài)驅(qū)動420發(fā)送中斷請求;所述內(nèi)核態(tài)驅(qū)動420用于預(yù)先配置循環(huán)緩存區(qū);還用于根據(jù)所述網(wǎng)卡410發(fā)送的所述中斷請求,停止接收所述網(wǎng)卡發(fā)送的新的中斷請求,以使在所述內(nèi)核態(tài)驅(qū)動根據(jù)所述中斷請求進(jìn)行中斷響應(yīng)的過程中,不被所述網(wǎng)卡發(fā)送的新的中斷請求再次中斷;并更新所述循環(huán)緩存區(qū)的描述符;以及恢復(fù)接收所述網(wǎng)卡發(fā)送的新的中斷請求,在接收到新的中斷請求時,返回根據(jù)所述新的中斷請求執(zhí)行所述中斷響應(yīng)操作;所述用戶態(tài)數(shù)據(jù)分析裝置430用于根據(jù)所述循環(huán)緩存區(qū)的當(dāng)前描述符,判斷所述循環(huán)緩存區(qū)是否有數(shù)據(jù)包;若是,則從所述循環(huán)緩存區(qū)中提取數(shù)據(jù)包,并更新所述循環(huán)緩存區(qū)的描述符,具體地,用戶態(tài)中提供函數(shù)接口庫,函數(shù)接口庫主要提供初始化、接收數(shù)據(jù)包以及數(shù)據(jù)包統(tǒng)計的函數(shù)級接口,用戶態(tài)數(shù)據(jù)分析裝置430可以根據(jù)所述循環(huán)緩存區(qū)的當(dāng)前描述符,通過相應(yīng)的函數(shù)接口判斷所述循環(huán)緩存區(qū)是否有數(shù)據(jù)包;若是,則通過函數(shù)接口庫以及內(nèi)存映射技術(shù)(mmap)從所述循環(huán)緩存區(qū)中提取數(shù)據(jù)包,并更新所述循環(huán)緩存區(qū)的描述符,其中,內(nèi)存映射技術(shù)用于將數(shù)據(jù)包空間映射到用戶態(tài)數(shù)據(jù)分析裝置430中。
[0098]其中,所述內(nèi)核態(tài)驅(qū)動和所述用戶態(tài)數(shù)據(jù)分析裝置通過內(nèi)存映射技術(shù)共享所述循環(huán)緩存區(qū);基于原子變量和原子操作的數(shù)據(jù)同步技術(shù)互斥使用所述循環(huán)緩存區(qū)。
[0099]本實(shí)施例的技術(shù)方案,通過PCI為網(wǎng)卡提供連接接口,基于直接內(nèi)存訪問技術(shù),將網(wǎng)卡的接收先入先出隊列中數(shù)據(jù)包傳輸至內(nèi)核態(tài)驅(qū)動中的預(yù)配置循環(huán)緩存區(qū),僅需事先安排的少量CPU資源即可自動完成數(shù)據(jù)包從網(wǎng)卡到內(nèi)核態(tài)驅(qū)動的傳輸,因此在大量數(shù)據(jù)包傳輸過程中節(jié)約了大量的CPU資源;通過內(nèi)核態(tài)驅(qū)動和用戶態(tài)數(shù)據(jù)分析裝置共享及互斥使用循環(huán)緩存區(qū),一方面,實(shí)現(xiàn)用戶態(tài)和內(nèi)核態(tài)之間共享循環(huán)緩存區(qū)以及循環(huán)緩存區(qū)的描述符,避免數(shù)據(jù)從內(nèi)核態(tài)拷貝到用戶態(tài)的大量拷貝過程,從而進(jìn)一步節(jié)約了大量CPU資源,另一方面,保證用戶態(tài)和內(nèi)核態(tài)在循環(huán)緩存區(qū)的描述符的操作上是同步的,因此,解決了數(shù)據(jù)的生產(chǎn)和消費(fèi)之間的同步問題,并且在數(shù)據(jù)包從網(wǎng)卡到內(nèi)核態(tài)控制器的循環(huán)緩存區(qū),以及從循環(huán)緩存區(qū)到用戶態(tài)數(shù)據(jù)分析裝置的整個過程中零拷貝,用戶態(tài)不需要系統(tǒng)調(diào)用就可以訪問到內(nèi)核態(tài)捕獲到的數(shù)據(jù)包,從而避免了不必要的系統(tǒng)調(diào)用和由內(nèi)核同時服務(wù)于多個網(wǎng)卡時產(chǎn)生的上下文切換開銷,同時提高了數(shù)據(jù)包的傳輸效率。
[0100]需要說明的是,以上說明了網(wǎng)卡捕獲到數(shù)據(jù)包之后,如何傳輸至用戶態(tài)數(shù)據(jù)分析裝置中,涉及網(wǎng)卡的接收先入先出隊列(RX FIFO),網(wǎng)絡(luò)適配器(adapter)的數(shù)據(jù)接收隊列(rx ring),最終傳輸至用戶態(tài)數(shù)據(jù)分析裝置中。在用戶態(tài)數(shù)據(jù)分析裝置對數(shù)據(jù)包進(jìn)行分析后,可以將分析結(jié)果,按照與上述網(wǎng)絡(luò)捕獲系統(tǒng)執(zhí)行的網(wǎng)絡(luò)數(shù)據(jù)捕獲方法相反的操作流程傳輸至網(wǎng)卡的發(fā)送先入先出隊列(TXFIFO),此處不再贅述。
[0101]在上述方案中,所述內(nèi)核態(tài)驅(qū)動420具體可以用于:
[0102]根據(jù)所述中斷請求,停止接收所述網(wǎng)卡發(fā)送的新的中斷請求;
[0103]更新所述循環(huán)緩存區(qū)的頭指針和尾指針,以及使用計數(shù)和空閑計數(shù);
[0104]更新所述循環(huán)緩存區(qū)包含的緩存單元對應(yīng)的狀態(tài)。
[0105]進(jìn)一步地,所述循環(huán)緩存區(qū)包含的緩存單元對應(yīng)的狀態(tài),可以包括:空閑狀態(tài)、使用中狀態(tài)和可用狀態(tài)。
[0106]進(jìn)一步地,所述用戶態(tài)數(shù)據(jù)分析裝置430具體可以用于:判斷循環(huán)緩存區(qū)的當(dāng)前使用計數(shù)是否大于O;若是,則從當(dāng)前尾指針指向的、且當(dāng)前狀態(tài)為可用狀態(tài)的緩存單元中提取數(shù)據(jù)包;將提取數(shù)據(jù)包后的該緩存單元的狀態(tài)更新為空閑狀態(tài),并更新所述循環(huán)緩存區(qū)的尾指針、以及使用計數(shù)和空閑計數(shù),并返回判斷循環(huán)緩存區(qū)的當(dāng)前使用計數(shù)是否大于O的操作。
[0107]在上述方案中,所述用戶態(tài)數(shù)據(jù)分析裝置430還可以用于在根據(jù)所述循環(huán)緩存區(qū)的當(dāng)前描述符,判斷所述循環(huán)緩存區(qū)是否有數(shù)據(jù)包之后,若否,則按預(yù)設(shè)睡眠時長睡眠,并在所述預(yù)設(shè)睡眠時長之后,返回根據(jù)所述循環(huán)緩存區(qū)的當(dāng)前描述符,判斷所述循環(huán)緩存區(qū)是否有數(shù)據(jù)包的操作。
[0108]在上述方案中,所述內(nèi)核態(tài)驅(qū)動420具體可以用于在所述網(wǎng)卡通過PCIDMA控制器將所述接收先入先出隊列中的數(shù)據(jù)包傳輸至內(nèi)核態(tài)驅(qū)動中的預(yù)配置循環(huán)緩存區(qū)之前,注冊并創(chuàng)建循環(huán)緩存區(qū);初始化所述創(chuàng)建的循環(huán)緩存區(qū),作為所述預(yù)配置循環(huán)緩存區(qū);所述內(nèi)核態(tài)驅(qū)動420還可以用于在所述用戶態(tài)數(shù)據(jù)分析裝置從所述循環(huán)緩存區(qū)中提取數(shù)據(jù)包之后,注銷并釋放所述創(chuàng)建的循環(huán)緩存區(qū)。
[0109]本發(fā)明實(shí)施例提供的網(wǎng)絡(luò)數(shù)據(jù)捕獲系統(tǒng)可執(zhí)行本發(fā)明任意實(shí)施例所提供的網(wǎng)絡(luò)數(shù)據(jù)捕獲方法,具備執(zhí)行方法相應(yīng)的功能模塊和有益效果。
[0110]實(shí)施例四
[0111]請參閱圖5,為本發(fā)明實(shí)施例四提供的一種網(wǎng)絡(luò)數(shù)據(jù)捕獲系統(tǒng)的結(jié)構(gòu)示意圖。本系統(tǒng)包括兩套子系統(tǒng),第一套子系統(tǒng)和第二套子系統(tǒng)分時共用網(wǎng)卡510和網(wǎng)絡(luò)適配器520,第一套子系統(tǒng)還包括:循環(huán)緩存區(qū)對應(yīng)的字符設(shè)備530、文件系統(tǒng)540和第一用戶態(tài)數(shù)據(jù)分析裝置550 ;第二套子系統(tǒng)還包括:內(nèi)核協(xié)議棧560和第二用戶態(tài)數(shù)據(jù)分析裝置570。
[0112]其中,循環(huán)緩存區(qū)對應(yīng)的字符設(shè)備530負(fù)責(zé)分配、釋放循環(huán)緩存區(qū)(RingBuffer)空間,管理RingBuffer的生產(chǎn)消費(fèi)關(guān)系,該字符設(shè)備對應(yīng)前述各實(shí)施例中的循環(huán)緩存區(qū),當(dāng)循環(huán)緩存區(qū)被設(shè)計為字符設(shè)備時,對用戶展現(xiàn)為循環(huán)緩存區(qū)對應(yīng)的字符設(shè)備530。第一用戶態(tài)數(shù)據(jù)分析裝置550通過文件系統(tǒng)540中的/dev/ringbuffer_x(x為0,I, 2,3...)訪問RingBuffer空間,從而實(shí)現(xiàn)數(shù)據(jù)包的接收和發(fā)送。
[0113]其中,循環(huán)緩存區(qū)對應(yīng)的字符設(shè)備530與內(nèi)核協(xié)議棧560中的網(wǎng)絡(luò)設(shè)備(net_device)層平級,對于第二套子系統(tǒng),網(wǎng)卡510將捕獲的數(shù)據(jù)包傳輸至網(wǎng)絡(luò)適配器520中,然后將網(wǎng)卡510捕獲到的數(shù)據(jù)包經(jīng)網(wǎng)絡(luò)適配器520傳輸至內(nèi)核協(xié)議棧560中,其中內(nèi)核協(xié)議棧560通過套接字(socket)接口訪問對應(yīng)的net_device,然后再訪問對應(yīng)的網(wǎng)絡(luò)適配器520中的數(shù)據(jù)包,第二用戶態(tài)數(shù)據(jù)分析裝置570通過系統(tǒng)調(diào)用將傳遞到內(nèi)核協(xié)議棧560中的數(shù)據(jù)包拷貝至用戶態(tài)應(yīng)用緩存區(qū)中。
[0114]其中,第一套子系統(tǒng)工作在零拷貝模式,其工作原理可參閱實(shí)施例一,此處不再贅述,當(dāng)工作在零拷貝模式下時,接收的數(shù)據(jù)包存放在接收循環(huán)緩存區(qū)中;第二套子系統(tǒng)工作在正常模式,其工作原理可參見前述圖1及相應(yīng)的介紹,此處不再贅述。用戶可以根據(jù)實(shí)際需要在這種兩種模式下進(jìn)行切換。
[0115]最后應(yīng)說明的是:以上各實(shí)施例僅用于說明本發(fā)明的技術(shù)方案,而非對其進(jìn)行限制;實(shí)施例中優(yōu)選的實(shí)施方式,并非對其進(jìn)行限制,對于本領(lǐng)域技術(shù)人員而言,本發(fā)明可以有各種改動和變化。凡在本發(fā)明的精神和原理之內(nèi)所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
【權(quán)利要求】
1.一種網(wǎng)絡(luò)數(shù)據(jù)捕獲方法,其特征在于,包括: 網(wǎng)卡捕獲數(shù)據(jù)包,并將所述數(shù)據(jù)包緩存至網(wǎng)卡的接收先入先出隊列中; 所述網(wǎng)卡通過外設(shè)部件互連接口直接內(nèi)存訪問PCI DMA控制器將所述接收先入先出隊列中的數(shù)據(jù)包傳輸至內(nèi)核態(tài)驅(qū)動中的預(yù)配置循環(huán)緩存區(qū); 所述網(wǎng)卡基于預(yù)設(shè)中斷觸發(fā)策略,向所述內(nèi)核態(tài)驅(qū)動發(fā)送中斷請求; 所述內(nèi)核態(tài)驅(qū)動根據(jù)所述中斷請求,停止接收所述網(wǎng)卡發(fā)送的新的中斷請求,以使在所述內(nèi)核態(tài)驅(qū)動根據(jù)所述中斷請求進(jìn)行中斷響應(yīng)的過程中,不被所述網(wǎng)卡發(fā)送的新的中斷請求再次中斷;并更新所述循環(huán)緩存區(qū)的描述符;以及恢復(fù)接收所述網(wǎng)卡發(fā)送的新的中斷請求,在接收到新的中斷請求時,返回根據(jù)所述新的中斷請求執(zhí)行所述中斷響應(yīng)操作;用戶態(tài)數(shù)據(jù)分析裝置根據(jù)所述循環(huán)緩存區(qū)的當(dāng)前描述符,判斷所述循環(huán)緩存區(qū)是否有數(shù)據(jù)包; 若是,則所述用戶態(tài)數(shù)據(jù)分析裝置從所述循環(huán)緩存區(qū)中提取數(shù)據(jù)包,并更新所述循環(huán)緩存區(qū)的描述符; 其中,所述內(nèi)核態(tài)驅(qū)動和所述用戶態(tài)數(shù)據(jù)分析裝置通過內(nèi)存映射技術(shù)共享所述循環(huán)緩存區(qū);基于原子變量和原子操作的數(shù)據(jù)同步技術(shù)互斥使用所述循環(huán)緩存區(qū)。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述內(nèi)核態(tài)驅(qū)動根據(jù)所述中斷請求,停止接收所述網(wǎng)卡發(fā)送的新的中斷請求,并更新所述循環(huán)緩存區(qū)的描述符,包括: 所述內(nèi)核態(tài)驅(qū)動根據(jù)所述中斷請求,停止接收所述網(wǎng)卡發(fā)送的新的中斷請求; 更新所述循環(huán)緩存區(qū)的頭指針和尾指針,以及使用計數(shù)和空閑計數(shù); 更新所述循環(huán)緩存區(qū)包含的緩存單元對應(yīng)的狀態(tài)。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述循環(huán)緩存區(qū)包含的緩存單元對應(yīng)的狀態(tài),包括:空閑狀態(tài)、使用中狀態(tài)和可用狀態(tài)。
4.根據(jù)權(quán)利要求3所述的方法,其特征在于,所述用戶態(tài)數(shù)據(jù)分析裝置從所述循環(huán)緩存區(qū)中提取數(shù)據(jù)包,并更新所述循環(huán)緩存區(qū)的描述符,包括: 所述用戶態(tài)數(shù)據(jù)分析裝置判斷循環(huán)緩存區(qū)的當(dāng)前使用計數(shù)是否大于O ; 若是,則所述用戶態(tài)數(shù)據(jù)分析裝置從當(dāng)前尾指針指向的、且當(dāng)前狀態(tài)為可用狀態(tài)的緩存單元中提取數(shù)據(jù)包; 所述用戶態(tài)數(shù)據(jù)分析裝置將提取數(shù)據(jù)包后的該緩存單元的狀態(tài)更新為空閑狀態(tài),并更新所述循環(huán)緩存區(qū)的尾指針、以及使用計數(shù)和空閑計數(shù),并返回判斷循環(huán)緩存區(qū)的當(dāng)前使用計數(shù)是否大于O的操作。
5.根據(jù)權(quán)利要求1-4任一所述的方法,其特征在于,在用戶態(tài)數(shù)據(jù)分析裝置根據(jù)所述循環(huán)緩存區(qū)的當(dāng)前描述符,判斷所述循環(huán)緩存區(qū)是否有數(shù)據(jù)包之后,所述方法還包括: 若否,則所述用戶態(tài)數(shù)據(jù)分析裝置按預(yù)設(shè)睡眠時長睡眠,并在所述預(yù)設(shè)睡眠時長之后,返回根據(jù)所述循環(huán)緩存區(qū)的當(dāng)前描述符,判斷所述循環(huán)緩存區(qū)是否有數(shù)據(jù)包的操作。
6.根據(jù)權(quán)利要求1-4任一所述的方法,其特征在于,在所述網(wǎng)卡通過PCIDMA控制器將所述接收先入先出隊列中的數(shù)據(jù)包傳輸至內(nèi)核態(tài)驅(qū)動中的預(yù)配置循環(huán)緩存區(qū)之前,所述方法還包括: 所述內(nèi)核態(tài)驅(qū)動注冊并創(chuàng)建循環(huán)緩存區(qū); 所述內(nèi)核態(tài)驅(qū)動初始化所述創(chuàng)建的循環(huán)緩存區(qū),作為所述預(yù)配置循環(huán)緩存區(qū); 在所述用戶態(tài)數(shù)據(jù)分析裝置從所述循環(huán)緩存區(qū)中提取數(shù)據(jù)包之后,所述方法還包括: 所述內(nèi)核態(tài)驅(qū)動注銷并釋放所述創(chuàng)建的循環(huán)緩存區(qū)。
7.—種網(wǎng)絡(luò)數(shù)據(jù)捕獲系統(tǒng),其特征在于,所述系統(tǒng)包括:網(wǎng)卡、內(nèi)核態(tài)驅(qū)動和用戶態(tài)數(shù)據(jù)分析裝置; 所述網(wǎng)卡用于捕獲數(shù)據(jù)包,并將所述數(shù)據(jù)包緩存至網(wǎng)卡的接收先入先出隊列中;還用于通過外設(shè)部件互連接口直接內(nèi)存訪問PCI DMA控制器將所述接收先入先出隊列中的數(shù)據(jù)包傳輸至內(nèi)核態(tài)驅(qū)動中的預(yù)配置循環(huán)緩存區(qū);還用于基于預(yù)設(shè)中斷觸發(fā)策略,向所述內(nèi)核態(tài)驅(qū)動發(fā)送中斷請求; 所述內(nèi)核態(tài)驅(qū)動用于預(yù)先配置循環(huán)緩存區(qū);還用于根據(jù)所述網(wǎng)卡發(fā)送的所述中斷請求,停止接收所述網(wǎng)卡發(fā)送的新的中斷請求,以使在所述內(nèi)核態(tài)驅(qū)動根據(jù)所述中斷請求進(jìn)行中斷響應(yīng)的過程中,不被所述網(wǎng)卡發(fā)送的新的中斷請求再次中斷;并更新所述循環(huán)緩存區(qū)的描述符;以及恢復(fù)接收所述網(wǎng)卡發(fā)送的新的中斷請求,在接收到新的中斷請求時,返回根據(jù)所述新的中斷請求執(zhí)行所述中斷響應(yīng)操作; 所述用戶態(tài)數(shù)據(jù)分析裝置用于根據(jù)所述循環(huán)緩存區(qū)的當(dāng)前描述符,判斷所述循環(huán)緩存區(qū)是否有數(shù)據(jù)包;若是,則從所述循環(huán)緩存區(qū)中提取數(shù)據(jù)包,并更新所述循環(huán)緩存區(qū)的描述符; 其中,所述內(nèi)核態(tài)驅(qū)動和所述用戶態(tài)數(shù)據(jù)分析裝置通過內(nèi)存映射技術(shù)共享所述循環(huán)緩存區(qū);基于原子變量和原子操作的數(shù)據(jù)同步技術(shù)互斥使用所述循環(huán)緩存區(qū)。
8.根據(jù)權(quán)利要求7所述的系統(tǒng),其特征在于,所述內(nèi)核態(tài)驅(qū)動具體用于: 根據(jù)所述中斷請求,停止接收所述網(wǎng)卡發(fā)送的新的中斷請求; 更新所述循環(huán)緩存區(qū)的頭指針和尾指針,以及使用計數(shù)和空閑計數(shù); 更新所述循環(huán)緩存區(qū)包含的緩存單元對應(yīng)的狀態(tài)。
9.根據(jù)權(quán)利要求8所述的系統(tǒng),其特征在于,所述循環(huán)緩存區(qū)包含的緩存單元對應(yīng)的狀態(tài),包括:空閑狀態(tài)、使用中狀態(tài)和可用狀態(tài)。
10.根據(jù)權(quán)利要求9所述的系統(tǒng),其特征在于,所述用戶態(tài)數(shù)據(jù)分析裝置具體用于: 判斷循環(huán)緩存區(qū)的當(dāng)前使用計數(shù)是否大于O ; 若是,則從當(dāng)前尾指針指向的、且當(dāng)前狀態(tài)為可用狀態(tài)的緩存單元中提取數(shù)據(jù)包; 將提取數(shù)據(jù)包后的該緩存單元的狀態(tài)更新為空閑狀態(tài),并更新所述循環(huán)緩存區(qū)的尾指針、以及使用計數(shù)和空閑計數(shù),并返回判斷循環(huán)緩存區(qū)的當(dāng)前使用計數(shù)是否大于O的操作。
【文檔編號】H04L12/26GK104506379SQ201410771925
【公開日】2015年4月8日 申請日期:2014年12月12日 優(yōu)先權(quán)日:2014年12月12日
【發(fā)明者】童克冬, 陶小龍 申請人:北京銳安科技有限公司