本發(fā)明涉及計算機領(lǐng)域,具體而言,涉及一種數(shù)據(jù)的抓包、存盤方法及數(shù)據(jù)的抓包、存盤裝置。
背景技術(shù):
在相關(guān)技術(shù)中,從網(wǎng)口抓取數(shù)據(jù)包(比如IP包)并保存到硬盤,然后分析這些數(shù)據(jù)包,是一種常見的數(shù)據(jù)分析手段。如圖1所示,采集服務(wù)器1’和互聯(lián)網(wǎng)2’之間通過網(wǎng)口11’傳輸數(shù)據(jù),采集服務(wù)器1’可以采集網(wǎng)口11’的數(shù)據(jù)并保存在硬盤12’中以供后續(xù)分析。
其中,在相關(guān)技術(shù)中,提供了兩種“抓包->存盤”方案,分別為:單線程方案和雙線程方案。
對于單線程方案,線程需要循環(huán)執(zhí)行“抓包->存盤”這一過程。本方案的缺點在于:當(dāng)線程正在執(zhí)行存盤操作時,此時流經(jīng)網(wǎng)口的數(shù)據(jù)包無法被抓取到,造成丟包。
對于雙線程方案,兩條線程共享同一內(nèi)存,如圖1所示,采用操作系統(tǒng)的鎖(或者互斥體、信號量等)機制來同步兩條線程對內(nèi)存的讀寫操作。其中,抓包線程從網(wǎng)口抓取數(shù)據(jù)包,接著申請鎖,獲得鎖后,把數(shù)據(jù)包寫到內(nèi)存13’中,然后再釋放鎖;存盤線程則先申請鎖,獲得鎖后,從內(nèi)存13’讀取數(shù)據(jù)包,接著將數(shù)據(jù)包保存到硬盤中,然后再釋放鎖。其具體流程如圖2所示。本方案的缺點在于:一方面,抓包線程在申請鎖的時候,如果此時存盤線程正在占用鎖,這時抓包線程需要等待存盤線程釋放鎖,此時流經(jīng)網(wǎng)口的數(shù)據(jù)包無法被抓取到,造成丟包;另一方面,由于鎖(或者互斥體、信號量等)本身屬于操作系統(tǒng)的資源,抓包線程在申請鎖或釋放鎖時,需要耗費時間,在這段時間內(nèi)流經(jīng)網(wǎng)口的數(shù)據(jù)包無法被抓取到,造成丟包。
針對上述的問題,目前尚未提出有效的解決方案。
技術(shù)實現(xiàn)要素:
本發(fā)明實施例提供了一種數(shù)據(jù)的抓包、存盤方法及數(shù)據(jù)的抓包、存盤裝置,以至少解決相關(guān)技術(shù)中由于抓包線程在申請鎖時,如果此時存盤線程正在占用鎖,這時抓 包線程需要等待存盤線程釋放鎖,導(dǎo)致此時流經(jīng)網(wǎng)口的數(shù)據(jù)包沒有被抓取到而造成丟包的技術(shù)問題和由于鎖本身屬于操作系統(tǒng)的資源,使得抓包線程在申請鎖或者釋放鎖時需要耗費時間,導(dǎo)致在這段時間內(nèi)流經(jīng)網(wǎng)口的數(shù)據(jù)包沒有抓取到而造成丟包的技術(shù)問題。
根據(jù)本發(fā)明實施例的一個方面,提供了一種數(shù)據(jù)的抓包方法,包括:從網(wǎng)口抓取第一數(shù)據(jù)包;在抓取的第一數(shù)據(jù)包中添加標(biāo)識信息,得到第二數(shù)據(jù)包;以及將上述第二數(shù)據(jù)包寫入內(nèi)存。
進一步地,抓包線程從上述網(wǎng)口抓取上述第一數(shù)據(jù)包;上述抓包線程在上述抓取的第一數(shù)據(jù)包中添加上述標(biāo)識信息,得到上述第二數(shù)據(jù)包;以及上述抓包線程將上述第二數(shù)據(jù)包寫入上述內(nèi)存。
進一步地,在上述抓包線程將上述第二數(shù)據(jù)包寫入上述內(nèi)存之后,上述抓包方法還包括:上述抓包線程判斷是否結(jié)束線程;如果上述抓包線程判斷出結(jié)束線程,則結(jié)束;和/或如果上述抓包線程判斷出不結(jié)束線程,則上述抓包線程從上述網(wǎng)口抓取第三數(shù)據(jù)包。
根據(jù)本發(fā)明實施例的另一方面,還提供了一種數(shù)據(jù)的存盤方法,包括:從內(nèi)存中讀取第二數(shù)據(jù)包,上述第二數(shù)據(jù)包為在從網(wǎng)口抓取的第一數(shù)據(jù)包中添加了標(biāo)識信息的數(shù)據(jù)包;以及將讀取的第二數(shù)據(jù)包存儲至硬盤中。
進一步地,存盤線程從上述內(nèi)存中讀取上述第二數(shù)據(jù)包;以及上述存盤線程將上述讀取的第二數(shù)據(jù)包存儲至上述硬盤中。
進一步地,在存盤線程從上述內(nèi)存中讀取上述第二數(shù)據(jù)包之后,上述存盤方法還包括:上述存盤線程根據(jù)上述標(biāo)識信息判斷上述第二數(shù)據(jù)包是否為被首次讀取的數(shù)據(jù)包;如果上述存盤線程根據(jù)上述標(biāo)識信息判斷出上述第二數(shù)據(jù)包為被首次讀取的數(shù)據(jù)包,則執(zhí)行上述存盤線程將上述讀取的第二數(shù)據(jù)包存儲至上述硬盤中的步驟;和/或如果上述存盤線程根據(jù)上述標(biāo)識信息判斷出上述第二數(shù)據(jù)包不為被首次讀取的數(shù)據(jù)包,則存盤線程從上述內(nèi)存中讀取第三數(shù)據(jù)包。
進一步地,上述存盤線程將上述讀取的第二數(shù)據(jù)包存儲至上述硬盤中之前,上述存盤方法還包括:上述存盤線程從上述第二數(shù)據(jù)包中刪除上述標(biāo)識信息,得到處理后的數(shù)據(jù)包,其中,上述存盤線程將上述處理后的第二數(shù)據(jù)包存儲至上述硬盤中。
根據(jù)本發(fā)明實施例的又一個方面,提供了一種數(shù)據(jù)的抓包裝置,包括:抓包單元,用于從網(wǎng)口抓取第一數(shù)據(jù)包;添加單元,用于在抓取的第一數(shù)據(jù)包中添加標(biāo)識信息,得到第二數(shù)據(jù)包;以及寫入單元,用于將上述第二數(shù)據(jù)包寫入內(nèi)存。
進一步地,上述抓包單元還用于使得抓包線程從上述網(wǎng)口抓取上述第一數(shù)據(jù)包;上述添加單元還用于使得上述抓包線程在上述抓取的第一數(shù)據(jù)包中添加上述標(biāo)識信息,得到上述第二數(shù)據(jù)包;以及上述寫入單元還用于使得上述抓包線程將上述第二數(shù)據(jù)包寫入上述內(nèi)存。
根據(jù)本發(fā)明實施例的再一方面,還提供了一種數(shù)據(jù)的存盤裝置,包括:讀取單元,用于從內(nèi)存中讀取第二數(shù)據(jù)包,上述第二數(shù)據(jù)包為在從網(wǎng)口抓取的第一數(shù)據(jù)包中添加了標(biāo)識信息的數(shù)據(jù)包;以及存儲單元,用于將讀取的第二數(shù)據(jù)包存儲至硬盤中。
在本發(fā)明實施例中,采用為抓取的數(shù)據(jù)包添加標(biāo)識信息的方式,通過從網(wǎng)口抓取第一數(shù)據(jù)包;在抓取的第一數(shù)據(jù)包中添加標(biāo)識信息,得到第二數(shù)據(jù)包;以及將第二數(shù)據(jù)包寫入內(nèi)存,達到了避免使用鎖而導(dǎo)致數(shù)據(jù)包丟包的目的,從而實現(xiàn)了降低數(shù)據(jù)丟包率的技術(shù)效果,進而解決了相關(guān)技術(shù)中由于抓包線程在申請鎖時,如果此時存盤線程正在占用鎖,這時抓包線程需要等待存盤線程釋放鎖,導(dǎo)致此時流經(jīng)網(wǎng)口的數(shù)據(jù)包沒有被抓取到而造成丟包的技術(shù)問題和由于鎖本身屬于操作系統(tǒng)的資源,使得抓包線程在申請鎖或者釋放鎖時需要耗費時間,導(dǎo)致在這段時間內(nèi)流經(jīng)網(wǎng)口的數(shù)據(jù)包沒有抓取到而造成丟包的技術(shù)問題。
附圖說明
此處所說明的附圖用來提供對本發(fā)明的進一步理解,構(gòu)成本申請的一部分,本發(fā)明的示意性實施例及其說明用于解釋本發(fā)明,并不構(gòu)成對本發(fā)明的不當(dāng)限定。在附圖中:
圖1是根據(jù)現(xiàn)有技術(shù)的一種數(shù)據(jù)的抓包/存盤的網(wǎng)絡(luò)拓?fù)鋱D;
圖2是根據(jù)現(xiàn)有技術(shù)的一種數(shù)據(jù)的雙線程抓包/存盤方法的流程圖;
圖3是根據(jù)本發(fā)明實施例的一種數(shù)據(jù)的抓包方法的流程圖;
圖4是根據(jù)本發(fā)明實施例的一種數(shù)據(jù)的存盤方法的流程圖;
圖5是根據(jù)本發(fā)明實施例的一種數(shù)據(jù)的抓取裝置的示意圖;以及
圖6是根據(jù)本發(fā)明實施例的一種數(shù)據(jù)的存盤裝置的示意圖。
具體實施方式
為了使本技術(shù)領(lǐng)域的人員更好地理解本發(fā)明方案,下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述,顯然,所描述的實施例 僅僅是本發(fā)明一部分的實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都應(yīng)當(dāng)屬于本發(fā)明保護的范圍。
需要說明的是,本發(fā)明的說明書和權(quán)利要求書及上述附圖中的術(shù)語“第一”、“第二”等是用于區(qū)別類似的對象,而不必用于描述特定的順序或先后次序。應(yīng)該理解這樣使用的數(shù)據(jù)在適當(dāng)情況下可以互換,以便這里描述的本發(fā)明的實施例能夠以除了在這里圖示或描述的那些以外的順序?qū)嵤4送?,術(shù)語“包括”和“具有”以及他們的任何變形,意圖在于覆蓋不排他的包含,例如,包含了一系列步驟或單元的過程、方法、系統(tǒng)、產(chǎn)品或設(shè)備不必限于清楚地列出的那些步驟或單元,而是可包括沒有清楚地列出的或?qū)τ谶@些過程、方法、產(chǎn)品或設(shè)備固有的其它步驟或單元。
在詳細闡述本發(fā)明之前,先對以下術(shù)語進行詳細解釋:
線程是指進程中的一個實體,是被系統(tǒng)獨立調(diào)度和分派的基本單位,線程自己不擁有系統(tǒng)資源,同一進程的不同線程共享該進程的資源。
鎖是指操作系統(tǒng)提供的一種線程同步機制。不同的線程在對同一資源進行讀寫操作時,為了保證數(shù)據(jù)的完整性,有可能會用到鎖來進行同步。某一線程讀(或者寫)資源前先申請鎖,讀(或者寫)完資源后再釋放鎖。
Memcopy函數(shù)是C++語言的一個庫函數(shù),用于內(nèi)存拷貝,比如,將內(nèi)存A中的數(shù)據(jù)拷貝到內(nèi)存B中。該函數(shù)具有原子性,執(zhí)行該函數(shù)時,能夠保證此時只有本線程在操作內(nèi)存A和內(nèi)存B,從而保證內(nèi)存A和內(nèi)存B的數(shù)據(jù)的完整性。另外,memcopy函數(shù)僅僅是少量的幾條CPU指令,執(zhí)行起來效率極高。
實施例1
根據(jù)本發(fā)明實施例,提供了一種數(shù)據(jù)的抓包方法的方法實施例,需要說明的是,在附圖的流程圖示出的步驟可以在諸如一組計算機可執(zhí)行指令的計算機系統(tǒng)中執(zhí)行,并且,雖然在流程圖中示出了邏輯順序,但是在某些情況下,可以以不同于此處的順序執(zhí)行所示出或描述的步驟。
圖3是根據(jù)本發(fā)明實施例的一種數(shù)據(jù)的抓包方法的流程圖,如圖3所示,該方法包括如下步驟:
步驟S302,從網(wǎng)口抓取第一數(shù)據(jù)包;
步驟S304,在抓取的第一數(shù)據(jù)包中添加標(biāo)識信息,得到第二數(shù)據(jù)包;以及
步驟S306,將第二數(shù)據(jù)包寫入內(nèi)存。
實施時,采集服務(wù)器在一個線程中執(zhí)行數(shù)據(jù)包抓取任務(wù),即先從網(wǎng)口抓取來自互聯(lián)網(wǎng)的第一數(shù)據(jù)包,再在抓取的第一數(shù)據(jù)包中添加標(biāo)識信息以得到第二數(shù)據(jù)包,然后將該第二數(shù)據(jù)包寫入本采集服務(wù)器的內(nèi)存中;之后,采集服務(wù)器在另一個線程中執(zhí)行數(shù)據(jù)包存盤任務(wù),即先從內(nèi)存中讀取前述的第二數(shù)據(jù)包,再將讀取的第二數(shù)據(jù)包存儲至硬盤中。其中,標(biāo)識信息為可以唯一標(biāo)識第二數(shù)據(jù)包的字符串,例如可以為編號等。
也即,采集服務(wù)器在一個線程中從網(wǎng)口抓取數(shù)據(jù)包,接著為抓取的數(shù)據(jù)包添加編號信息以打包成一個新數(shù)據(jù)包,從而將新數(shù)據(jù)包寫到內(nèi)存中,然后采集服務(wù)器在這個線程中循環(huán)執(zhí)行這些步驟;采集服務(wù)器在另一個線程中讀取內(nèi)存中的數(shù)據(jù)包(即前述的新數(shù)據(jù)包),并檢測該數(shù)據(jù)包的編號,如果該編號的數(shù)據(jù)包之前尚未讀取過,則將其存入硬盤中;如果該編號的數(shù)據(jù)包之前已經(jīng)讀取過,則忽略該數(shù)據(jù)包,然后采集服務(wù)器在這個線程中循環(huán)執(zhí)行這些步驟。
一方面,由于存盤操作比抓包操作耗時短,使得抓包線程正在抓包時,能夠保證存盤線程有足夠的時間將抓包線程上次抓取的一個數(shù)據(jù)包存盤;另一方面,memcopy函數(shù)作為內(nèi)存拷貝函數(shù),將內(nèi)存A中的數(shù)據(jù)拷貝到內(nèi)存B中,該操作具有原子性,執(zhí)行該函數(shù)時,能夠保證此時只有本線程在操作內(nèi)存A和內(nèi)存B,從而保證內(nèi)存A和內(nèi)存B的數(shù)據(jù)的完整性。再一方面,memcopy函數(shù)只有少量的幾條CPU指令,執(zhí)行起來效率極高。因此,與相關(guān)技術(shù)中的普通抓包/存盤方法相比,采用本發(fā)明實施例可以大大降低丟包率,比如在高負(fù)載的網(wǎng)口使用本發(fā)明實施例,丟包率約為普通方法的1/100。需要說明的是,memcopy函數(shù)是C++語言的函數(shù),它也可以采用其它語言的類似指令來實現(xiàn)。
通過本發(fā)明實施例,達到了避免使用鎖而導(dǎo)致數(shù)據(jù)包丟包的目的,從而實現(xiàn)了降低數(shù)據(jù)丟包率的技術(shù)效果。
可選地,在本發(fā)明實施例中,前述的步驟S302至步驟S306的執(zhí)行主體可以是采集服務(wù)器中的抓包線程,即,抓包線程從網(wǎng)口抓取第一數(shù)據(jù)包;抓包線程在抓取的第一數(shù)據(jù)包中添加標(biāo)識信息,得到第二數(shù)據(jù)包;以及抓包線程將第二數(shù)據(jù)包寫入內(nèi)存。相應(yīng)的,抓包線程循環(huán)執(zhí)行抓包并將抓取的數(shù)據(jù)包存儲在內(nèi)存中的步驟的同時,存盤線程循環(huán)執(zhí)行從內(nèi)存中讀取數(shù)據(jù)包并將其拷貝至硬盤中的步驟。
這樣,采集服務(wù)器可以分別在兩個線程中執(zhí)行抓包操作和存盤操作,并且互不干擾,即保持了內(nèi)存中數(shù)據(jù)的完整性,又降低了丟包率。
進一步可選地,在抓包線程將第二數(shù)據(jù)包寫入內(nèi)存之后,上述抓包方法還可以包 括:
S2,抓包線程判斷是否結(jié)束線程;
S4,如果抓包線程判斷出結(jié)束線程,則結(jié)束;和/或
S6,如果抓包線程判斷出不結(jié)束線程,則抓包線程從網(wǎng)口抓取第三數(shù)據(jù)包。其中,第三數(shù)據(jù)包為第一數(shù)據(jù)包的下一數(shù)據(jù)包,也即,如果抓包線程判斷出不結(jié)束線程,則抓包線程繼續(xù)從網(wǎng)口抓取下一數(shù)據(jù)包。
這樣,抓包線程不僅可以在跳出指令的控制下,終止該線程,還可以循環(huán)執(zhí)行抓包/存儲(即,存至內(nèi)存中)操作。
實施例2
根據(jù)本發(fā)明實施例,提供了一種數(shù)據(jù)的存盤方法的方法實施例,需要說明的是,在附圖的流程圖示出的步驟可以在諸如一組計算機可執(zhí)行指令的計算機系統(tǒng)中執(zhí)行,并且,雖然在流程圖中示出了邏輯順序,但是在某些情況下,可以以不同于此處的順序執(zhí)行所示出或描述的步驟。
圖4是根據(jù)本發(fā)明實施例的一種數(shù)據(jù)的存盤方法的流程圖,如圖4所示,該方法包括如下步驟:
步驟S402,從內(nèi)存中讀取第二數(shù)據(jù)包,第二數(shù)據(jù)包為在從網(wǎng)口抓取的第一數(shù)據(jù)包中添加了標(biāo)識信息的數(shù)據(jù)包;以及
步驟S404,將讀取的第二數(shù)據(jù)包存儲至硬盤中。
實施時,采集服務(wù)器在一個線程中執(zhí)行數(shù)據(jù)包抓取任務(wù),即先從網(wǎng)口抓取來自互聯(lián)網(wǎng)的第一數(shù)據(jù)包,再在抓取的第一數(shù)據(jù)包中添加標(biāo)識信息以得到第二數(shù)據(jù)包,然后將該第二數(shù)據(jù)包寫入本采集服務(wù)器的內(nèi)存中;之后,采集服務(wù)器在另一個線程中執(zhí)行數(shù)據(jù)包存盤任務(wù),即先從內(nèi)存中讀取前述的第二數(shù)據(jù)包,再將讀取的第二數(shù)據(jù)包存儲至硬盤中。
也即,采集服務(wù)器在一個線程中從網(wǎng)口抓取數(shù)據(jù)包,接著為抓取的數(shù)據(jù)包添加編號信息以打包成一個新數(shù)據(jù)包,從而將新數(shù)據(jù)包寫到內(nèi)存中,然后采集服務(wù)器在這個線程中循環(huán)執(zhí)行這些步驟;采集服務(wù)器在另一個線程中讀取內(nèi)存中的數(shù)據(jù)包(即前述的新數(shù)據(jù)包),并檢測該數(shù)據(jù)包的編號,如果該編號的數(shù)據(jù)包之前尚未讀取過,則將其存入硬盤中;如果該編號的數(shù)據(jù)包之前已經(jīng)讀取過,則忽略該數(shù)據(jù)包,然后采集服務(wù)器在這個線程中循環(huán)執(zhí)行這些步驟。
通過本發(fā)明實施例,達到了避免使用鎖而導(dǎo)致數(shù)據(jù)包丟包的目的,從而實現(xiàn)了降低數(shù)據(jù)丟包率的技術(shù)效果。
可選地,在本發(fā)明實施例中,前述的步驟S402至步驟S404的執(zhí)行主體可以是采集服務(wù)器中的存盤線程,即,存盤線程從內(nèi)存中讀取第二數(shù)據(jù)包;以及存盤線程將讀取的第二數(shù)據(jù)包存儲至硬盤中。其中,抓包線程循環(huán)執(zhí)行抓包并將抓取的數(shù)據(jù)包存儲在內(nèi)存中的步驟的同時,存盤數(shù)據(jù)循環(huán)執(zhí)行從內(nèi)存中讀取數(shù)據(jù)包并將其拷貝至硬盤中的步驟。
這樣,采集服務(wù)器可以分別在兩個線程中執(zhí)行抓包操作和存盤操作,并且互不干擾,即保持了內(nèi)存中數(shù)據(jù)的完整性,又降低了丟包率。
進一步可選地,在存盤線程從內(nèi)存中讀取第二數(shù)據(jù)包之后,上述存盤方法還可以包括:
S6,存盤線程根據(jù)標(biāo)識信息判斷第二數(shù)據(jù)包是否為被首次讀取的數(shù)據(jù)包;
S8,如果存盤線程根據(jù)標(biāo)識信息判斷出第二數(shù)據(jù)包為被首次讀取的數(shù)據(jù)包,則執(zhí)行存盤線程將讀取的第二數(shù)據(jù)包存儲至硬盤中的步驟;和/或
S10,如果存盤線程根據(jù)標(biāo)識信息判斷出第二數(shù)據(jù)包不為被首次讀取的數(shù)據(jù)包,則存盤線程從內(nèi)存中讀取第三數(shù)據(jù)包。
通過本發(fā)明實施例,采用分析標(biāo)識信息的方式,存盤線程可以判斷當(dāng)前讀取的數(shù)據(jù)包是否是首次被讀取的數(shù)據(jù)包,如果是首次被讀取的數(shù)據(jù)包,則將其拷貝至硬盤中,否則,則不處理,并繼續(xù)讀取內(nèi)存中的其他數(shù)據(jù)。這樣,可以防止同一數(shù)據(jù)被重復(fù)存儲至硬盤中而導(dǎo)致硬盤空間浪費、硬盤數(shù)據(jù)盈余和拷貝數(shù)據(jù)的工作效率低等。
可選地,存盤線程將讀取的第二數(shù)據(jù)包存儲至硬盤中之前,上述存盤方法還可以包括:
S12,存盤線程從第二數(shù)據(jù)包中刪除標(biāo)識信息,得到處理后的數(shù)據(jù)包,其中,存盤線程將處理后的第二數(shù)據(jù)包存儲至硬盤中。
這樣,一方面,可以使得存盤線程實際存儲至硬盤中的數(shù)據(jù)包與抓包線程實際抓取的數(shù)據(jù)包保持一致,另一方面,可以節(jié)約硬盤的存儲空間,防止不必要數(shù)據(jù)(如標(biāo)識信息)占用存儲空間而導(dǎo)致資源浪費。
由于抓包線程與存盤線程相互不干擾,能夠獨立執(zhí)行各自相應(yīng)的步驟,因此本領(lǐng) 域技術(shù)人員根據(jù)上述兩個實施例的內(nèi)容記載,可以輕松靈活地將實施例1抓包線程的步驟和實施例2存盤線程的步驟進行適當(dāng)?shù)牟糠只蛉拷M合,由此獲得更多的實施例,此處不再一一贅述。
實施例3
根據(jù)本發(fā)明實施例,提供了一種數(shù)據(jù)的抓包裝置的裝置實施例。
圖5是根據(jù)本發(fā)明實施例的一種數(shù)據(jù)的抓取裝置的示意圖,該裝置包括:抓包單元502、添加單元504和寫入單元506。抓包單元502,用于從網(wǎng)口抓取第一數(shù)據(jù)包;添加單元504,用于在抓取的第一數(shù)據(jù)包中添加標(biāo)識信息,得到第二數(shù)據(jù)包;以及寫入單元506,用于將第二數(shù)據(jù)包寫入內(nèi)存。
實施時,采集服務(wù)器在一個線程中執(zhí)行數(shù)據(jù)包抓取任務(wù),即先從網(wǎng)口抓取來自互聯(lián)網(wǎng)的第一數(shù)據(jù)包,再在抓取的第一數(shù)據(jù)包中添加標(biāo)識信息以得到第二數(shù)據(jù)包,然后將該第二數(shù)據(jù)包寫入本采集服務(wù)器的內(nèi)存中;之后,采集服務(wù)器在另一個線程中執(zhí)行數(shù)據(jù)包存盤任務(wù),即先從內(nèi)存中讀取前述的第二數(shù)據(jù)包,再將讀取的第二數(shù)據(jù)包存儲至硬盤中。其中,標(biāo)識信息為可以唯一標(biāo)識第二數(shù)據(jù)包的字符串,例如可以為編號等。
也即,采集服務(wù)器在一個線程中從網(wǎng)口抓取數(shù)據(jù)包,接著為抓取的數(shù)據(jù)包添加編號信息以打包成一個新數(shù)據(jù)包,從而將新數(shù)據(jù)包寫到內(nèi)存中,然后采集服務(wù)器在這個線程中循環(huán)執(zhí)行這些步驟;采集服務(wù)器在另一個線程中讀取內(nèi)存中的數(shù)據(jù)包(即前述的新數(shù)據(jù)包),并檢測該數(shù)據(jù)包的編號,如果該編號的數(shù)據(jù)包之前尚未讀取過,則將其存入硬盤中;如果該編號的數(shù)據(jù)包之前已經(jīng)讀取過,則忽略該數(shù)據(jù)包,然后采集服務(wù)器在這個線程中循環(huán)執(zhí)行這些步驟。
一方面,由于存盤操作比抓包操作耗時短,使得抓包線程正在抓包時,能夠保證存盤線程有足夠的時間將抓包線程上次抓取的一個數(shù)據(jù)包存盤;另一方面,memcopy函數(shù)作為內(nèi)存拷貝函數(shù),將內(nèi)存A中的數(shù)據(jù)拷貝到內(nèi)存B中,該操作具有原子性,執(zhí)行該函數(shù)時,能夠保證此時只有本線程在操作內(nèi)存A和內(nèi)存B,從而保證內(nèi)存A和內(nèi)存B的數(shù)據(jù)的完整性。再一方面,memcopy函數(shù)只有少量的幾條CPU指令,執(zhí)行起來效率極高。因此,與相關(guān)技術(shù)中的普通抓包/存盤方法相比,采用本發(fā)明實施例可以大大降低丟包率,比如在高負(fù)載的網(wǎng)口使用本發(fā)明實施例,丟包率約為普通方法的1/100。需要說明的是,memcopy函數(shù)是C++語言的函數(shù),它也可以采用其它語言的類似指令來實現(xiàn)。
通過本發(fā)明實施例,達到了避免使用鎖而導(dǎo)致數(shù)據(jù)包丟包的目的,從而實現(xiàn)了降低數(shù)據(jù)丟包率的技術(shù)效果。
可選地,上述抓包單元還可以用于使得抓包線程從網(wǎng)口抓取第一數(shù)據(jù)包;上述添加單元還可以用于使得抓包線程在抓取的第一數(shù)據(jù)包中添加標(biāo)識信息,得到第二數(shù)據(jù)包;以及上述寫入單元還可以用于使得抓包線程將第二數(shù)據(jù)包寫入內(nèi)存。
這樣,采集服務(wù)器可以分別在兩個線程中執(zhí)行抓包操作和存盤操作,并且互不干擾,即保持了內(nèi)存中數(shù)據(jù)的完整性,又降低了丟包率。
進一步可選地,上述抓包裝置還可以包括:第一判斷單元,用于使得在抓包線程將第二數(shù)據(jù)包寫入內(nèi)存之后,抓包線程判斷是否結(jié)束線程;結(jié)束單元,用于在抓包線程判斷出結(jié)束線程時,結(jié)束;和/或,抓包單元還用于使得抓包線程判斷出不結(jié)束線程時,抓包線程從網(wǎng)口抓取第三數(shù)據(jù)包。其中,第三數(shù)據(jù)包為第一數(shù)據(jù)包的下一數(shù)據(jù)包,也即,如果抓包線程判斷出不結(jié)束線程,則抓包線程繼續(xù)從網(wǎng)口抓取下一數(shù)據(jù)包
這樣,抓包線程不僅可以在跳出指令的控制下,終止該線程,還可以循環(huán)執(zhí)行抓包/存儲(即,存至內(nèi)存中)操作。
實施例4
根據(jù)本發(fā)明實施例,提供了一種數(shù)據(jù)的存盤裝置的裝置實施例。
圖6是根據(jù)本發(fā)明實施例的一種數(shù)據(jù)的存盤裝置的示意圖,該裝置包括:讀取單元602和存儲單元604。讀取單元602用于從內(nèi)存中讀取第二數(shù)據(jù)包,第二數(shù)據(jù)包為在從網(wǎng)口抓取的第一數(shù)據(jù)包中添加了標(biāo)識信息的數(shù)據(jù)包;以及存儲單元604用于將讀取的第二數(shù)據(jù)包存儲至硬盤中。
實施時,采集服務(wù)器在一個線程中執(zhí)行數(shù)據(jù)包抓取任務(wù),即先從網(wǎng)口抓取來自互聯(lián)網(wǎng)的第一數(shù)據(jù)包,再在抓取的第一數(shù)據(jù)包中添加標(biāo)識信息以得到第二數(shù)據(jù)包,然后將該第二數(shù)據(jù)包寫入本采集服務(wù)器的內(nèi)存中;之后,采集服務(wù)器在另一個線程中執(zhí)行數(shù)據(jù)包存盤任務(wù),即先從內(nèi)存中讀取前述的第二數(shù)據(jù)包,再將讀取的第二數(shù)據(jù)包存儲至硬盤中。
也即,采集服務(wù)器在一個線程中從網(wǎng)口抓取數(shù)據(jù)包,接著為抓取的數(shù)據(jù)包添加編號信息以打包成一個新數(shù)據(jù)包,從而將新數(shù)據(jù)包寫到內(nèi)存中,然后采集服務(wù)器在這個線程中循環(huán)執(zhí)行這些步驟;采集服務(wù)器在另一個線程中讀取內(nèi)存中的數(shù)據(jù)包(即前述的新數(shù)據(jù)包),并檢測該數(shù)據(jù)包的編號,如果該編號的數(shù)據(jù)包之前尚未讀取過,則將其存入硬盤中;如果該編號的數(shù)據(jù)包之前已經(jīng)讀取過,則忽略該數(shù)據(jù)包,然后采集服務(wù)器在這個線程中循環(huán)執(zhí)行這些步驟。
通過本發(fā)明實施例,達到了避免使用鎖而導(dǎo)致數(shù)據(jù)包丟包的目的,從而實現(xiàn)了降 低數(shù)據(jù)丟包率的技術(shù)效果。
可選地,讀取單元還可以用于使得存盤線程從內(nèi)存中讀取第二數(shù)據(jù)包;以及存儲單元還可以用于使得存盤線程將讀取的第二數(shù)據(jù)包存儲至硬盤中。其中,抓包線程循環(huán)執(zhí)行抓包并將抓取的數(shù)據(jù)包存儲在內(nèi)存中的步驟的同時,存盤數(shù)據(jù)循環(huán)執(zhí)行從內(nèi)存中讀取數(shù)據(jù)包并將其拷貝至硬盤中的步驟。
這樣,采集服務(wù)器可以分別在兩個線程中執(zhí)行抓包操作和存盤操作,并且互不干擾,即保持了內(nèi)存中數(shù)據(jù)的完整性,又降低了丟包率。
進一步可選地,上述存盤裝置還包括:第二判斷單元,用于使得在存盤線程從內(nèi)存中讀取第二數(shù)據(jù)包之后,存盤線程根據(jù)標(biāo)識信息判斷第二數(shù)據(jù)包是否為被首次讀取的數(shù)據(jù)包;存儲單元還用于使得在存盤線程根據(jù)標(biāo)識信息判斷出第二數(shù)據(jù)包為被首次讀取的數(shù)據(jù)包時,執(zhí)行存盤線程將讀取的第二數(shù)據(jù)包存儲至硬盤中的步驟;和/或,讀取單元還用于使得在存盤線程根據(jù)標(biāo)識信息判斷出第二數(shù)據(jù)包不為被首次讀取的數(shù)據(jù)包時,存盤線程從內(nèi)存中讀取第三數(shù)據(jù)包。
通過本發(fā)明實施例,采用分析標(biāo)識信息的方式,存盤線程可以判斷當(dāng)前讀取的數(shù)據(jù)包是否是首次被讀取的數(shù)據(jù)包,如果是首次被讀取的數(shù)據(jù)包,則將其拷貝至硬盤中,否則,則不處理,并繼續(xù)讀取內(nèi)存中的其他數(shù)據(jù)。這樣,可以防止同一數(shù)據(jù)被重復(fù)存儲至硬盤中而導(dǎo)致硬盤空間浪費、硬盤數(shù)據(jù)盈余和拷貝數(shù)據(jù)的工作效率低等。
可選地,上述存盤裝置還可以包括:刪除單元,用于使得存盤線程將讀取的第二數(shù)據(jù)包存儲至硬盤中之前,存盤線程從第二數(shù)據(jù)包中刪除標(biāo)識信息,得到處理后的數(shù)據(jù)包,其中,存儲單元還用于使得存盤線程將處理后的第二數(shù)據(jù)包存儲至硬盤中。
這樣,一方面,可以使得存盤線程實際存儲至硬盤中的數(shù)據(jù)包與抓包線程實際抓取的數(shù)據(jù)包保持一致,另一方面,可以節(jié)約硬盤的存儲空間,防止不必要數(shù)據(jù)(如標(biāo)識信息)占用存儲空間而導(dǎo)致資源浪費。
上述本發(fā)明實施例序號僅僅為了描述,不代表實施例的優(yōu)劣。
在本發(fā)明的上述實施例中,對各個實施例的描述都各有側(cè)重,某個實施例中沒有詳述的部分,可以參見其他實施例的相關(guān)描述。
在本申請所提供的幾個實施例中,應(yīng)該理解到,所揭露的技術(shù)內(nèi)容,可通過其它的方式實現(xiàn)。其中,以上所描述的裝置實施例僅僅是示意性的,例如所述單元的劃分,可以為一種邏輯功能劃分,實際實現(xiàn)時可以有另外的劃分方式,例如多個單元或組件可以結(jié)合或者可以集成到另一個系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點,所 顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過一些接口,單元或模塊的間接耦合或通信連接,可以是電性或其它的形式。
所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個地方,或者也可以分布到多個單元上??梢愿鶕?jù)實際的需要選擇其中的部分或者全部單元來實現(xiàn)本實施例方案的目的。
另外,在本發(fā)明各個實施例中的各功能單元可以集成在一個處理單元中,也可以是各個單元單獨物理存在,也可以兩個或兩個以上單元集成在一個單元中。上述集成的單元既可以采用硬件的形式實現(xiàn),也可以采用軟件功能單元的形式實現(xiàn)。
所述集成的單元如果以軟件功能單元的形式實現(xiàn)并作為獨立的產(chǎn)品銷售或使用時,可以存儲在一個計算機可讀取存儲介質(zhì)中?;谶@樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說對現(xiàn)有技術(shù)做出貢獻的部分或者該技術(shù)方案的全部或部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機軟件產(chǎn)品存儲在一個存儲介質(zhì)中,包括若干指令用以使得一臺計算機設(shè)備(可為個人計算機、服務(wù)器或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個實施例所述方法的全部或部分步驟。而前述的存儲介質(zhì)包括:U盤、只讀存儲器(ROM,Read-Only Memory)、隨機存取存儲器(RAM,Random Access Memory)、移動硬盤、磁碟或者光盤等各種可以存儲程序代碼的介質(zhì)。
以上所述僅是本發(fā)明的優(yōu)選實施方式,應(yīng)當(dāng)指出,對于本技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明原理的前提下,還可以做出若干改進和潤飾,這些改進和潤飾也應(yīng)視為本發(fā)明的保護范圍。