摘要:抓包分析工具一直是維護(hù)網(wǎng)絡(luò)安全分析網(wǎng)絡(luò)協(xié)議必備的工具,但隨著網(wǎng)絡(luò)硬件的發(fā)展,網(wǎng)絡(luò)速度得到大幅提高,從以前的10MHUB到現(xiàn)在的千兆交換機(jī),基于libpcap的抓包分析工具丟包率越來越大,如何使抓包工具支持百兆千兆網(wǎng)卡交換機(jī)的同時(shí)減少丟包率,對(duì)網(wǎng)絡(luò)安全的維護(hù)有很大作用。本文通過比較傳統(tǒng)Lipcap抓包技術(shù),發(fā)現(xiàn)所存在的弊端,認(rèn)真研究raw socket,并通過改進(jìn)多線程對(duì)共享數(shù)據(jù)的訪問方式來減少處理線程對(duì)抓包線程的影響,提高抓包的速度并達(dá)到減少丟包率的目的。
關(guān)鍵詞:抓包;多線程;Raw socket技術(shù);共享數(shù)據(jù)
中圖分類號(hào):TP302.7 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1007-9599 (2012) 17-0000-02
1 引言
隨著信息技術(shù)的快速發(fā)展,網(wǎng)絡(luò)已成為信息交換的主要手段,一些網(wǎng)絡(luò)支付業(yè)務(wù)地興起對(duì)網(wǎng)絡(luò)安全提出了較高的要求。同時(shí),黑客對(duì)網(wǎng)絡(luò)的攻擊從未停止,網(wǎng)絡(luò)安全問題日趨嚴(yán)峻。因此,如何加強(qiáng)網(wǎng)絡(luò)的安全維護(hù),使抓包工具在支持百兆千兆網(wǎng)卡交換機(jī)的同時(shí)減少丟包率,對(duì)于保障網(wǎng)絡(luò)安全有重要的現(xiàn)實(shí)意義。本文通過比較傳統(tǒng)的lipcap抓包技術(shù),找出所存在的弊端,認(rèn)真研究raw socket,并通過改進(jìn)多線程對(duì)共享數(shù)據(jù)的訪問方式,減少處理包線程對(duì)抓包線程的影響來提高抓包的速度,從而達(dá)到減少丟包率的目的。
2 傳統(tǒng)的libpcap抓包技術(shù)的弊端
Libpcap是unix / linux平臺(tái)下的網(wǎng)絡(luò)數(shù)據(jù)包捕獲函數(shù)包,提供了系統(tǒng)獨(dú)立的用戶級(jí)別網(wǎng)絡(luò)數(shù)據(jù)包捕獲接口,可在絕大多數(shù)類unix平臺(tái)下工作。但是由于它沒有提供設(shè)置抓包緩存大小的接口,只有32K的內(nèi)核緩存和32K的用戶緩存,存在一定的局限性。每次調(diào)用系統(tǒng)進(jìn)行讀寫時(shí),只能存取32K的數(shù)據(jù),在高速網(wǎng)絡(luò)中,調(diào)用系統(tǒng)讀寫的次數(shù)顯著增多,丟包率也相應(yīng)增高,因此不能滿足大數(shù)據(jù)量的高速網(wǎng)絡(luò)環(huán)境。
Libpcap-mmap是libpcap的改進(jìn)版本,它提供了一個(gè)大小可配置的循環(huán)緩沖器,并采用了mmap系統(tǒng)調(diào)用,完成數(shù)據(jù)包從內(nèi)核到用戶層的傳遞,允許用戶程序和內(nèi)核程序同時(shí)對(duì)該循環(huán)緩沖器的不同數(shù)據(jù)區(qū)域進(jìn)行直接的讀取,但是緩沖器必須在抓包開始就創(chuàng)建,耗費(fèi)空間,當(dāng)緩沖器一個(gè)為滿另一個(gè)為空時(shí),還要對(duì)兩個(gè)緩沖器做調(diào)換操作,勢必會(huì)影響它的性能。所以一般 linux下的抓包工具都有很嚴(yán)重的丟包問題
3 基于Raw socket多線程設(shè)計(jì)思想及改進(jìn)
3.1 Raw socket介紹
Raw socket(原始套接字)可以接收本機(jī)網(wǎng)卡上的數(shù)據(jù)幀或數(shù)據(jù)包,對(duì)監(jiān)聽網(wǎng)絡(luò)的流量和分析是很有作用的。因其可以自如地控制系統(tǒng)下的多種協(xié)議,實(shí)現(xiàn)對(duì)網(wǎng)絡(luò)底層中傳輸機(jī)制的控制,所以應(yīng)用原始套接字來操縱網(wǎng)絡(luò)層和傳輸層應(yīng)用。
3.2 多線程設(shè)計(jì)思想及改進(jìn)
網(wǎng)絡(luò)中的抓包程序性能,很大程度上取決于抓包線程保存包的速度,因此要盡量減少從Raw socket中讀包并保存的線程的工作量。在此我們采用多線程技術(shù),將抓包與處理包分開,抓包線程將包保存到一個(gè)位置,處理線程到指定位置去處理包,此時(shí)抓包線程和處理線程就存在訪問共享數(shù)據(jù)的問題。一般情況下需要加鎖,但加鎖勢必會(huì)讓抓包線程受到處理線程的影響,為了超過libpcap的抓包速度,這里我們?cè)O(shè)計(jì)了線程追擊法實(shí)現(xiàn)不加鎖的多線程互斥訪問共享內(nèi)存。
基本思想如下:
先創(chuàng)建一個(gè)全局的指針數(shù)組保存所有抓到的包在內(nèi)存中保存的地址,將這個(gè)數(shù)組看成一個(gè)環(huán),定義變量pos_c 表示抓包線程當(dāng)前處理的位置,pos_h表示處理線程當(dāng)前正在處理的位置,初始狀態(tài)pos_c=pos_h = 0,如圖1A所示。
當(dāng)抓包線程收到一個(gè)包之后,分配空間保存此包,當(dāng)前處理的數(shù)組的位置為 poc_c++,當(dāng)達(dá)到最大下標(biāo)時(shí)則變?yōu)?,當(dāng)它的下一個(gè)位置==poc_h時(shí),說明數(shù)組已滿,則暫停抓包,如圖1B所示。
當(dāng)poc_c != poc_h時(shí),處理線程開始工作,每處理完一個(gè)包poc_h++,并釋放該包內(nèi)存,已到最大下標(biāo)時(shí)則變?yōu)?,一直處理到 pos_c == poc_h時(shí),如圖1C所示。
4 多線程編程的具體實(shí)現(xiàn)
4.1 抓包線程
抓包線程只做定義 raw socket接收包和保存包的功能,為減少丟包的可能,必須首先提高抓包線程的優(yōu)先級(jí)。這里只說明接收包和保存包到packet數(shù)組的實(shí)現(xiàn):
接收包:
定義一個(gè)收包的緩存區(qū),這里定義一個(gè)最大包長度的字符數(shù)組 buff;
Char buff[65535];
用一個(gè)死循環(huán)來接收 raw socket的包,具體代碼見圖2A。
4.2 處理線程
此處只說明處理線程讀取包的過程,略去具體處理和釋放的代碼。具體代碼見圖2B。
5 總結(jié)
本文在采用多線程抓包時(shí),利用線程追擊法避免抓包線程和處理線程訪問共享的數(shù)據(jù)(包的地址)加鎖,從而提高抓包的速度。同時(shí),利用raw socket原生套接字來接收包,從而解決linux平臺(tái)下libpcap不能設(shè)置緩存大小而丟包的問題。具體包的處理不在此文的討論范圍,具體程序退出等其他的控制細(xì)節(jié)也未詳細(xì)討論,代碼都在linux下調(diào)試可行,僅供參考。另在處理時(shí),也可以采用多線程同時(shí)處理的方法,這些處理線程同時(shí)在從packet數(shù)組中讀包時(shí)需要加一個(gè)鎖,但是不影響抓包線程的抓包,從而達(dá)到提高速度的目的。
參考文獻(xiàn):
[1]劉循.Linux操作系統(tǒng)及其應(yīng)用編程[M].高等教育出版社,2011,01.
[2]尤文堅(jiān).利用RAW SOCKET捕獲網(wǎng)絡(luò)底層數(shù)據(jù)包的方法[J].廣西輕工業(yè),2007.
[3]寇應(yīng)展,等.基于libpcap網(wǎng)絡(luò)數(shù)據(jù)包捕獲技術(shù)的改進(jìn)[J].軍械工程學(xué)院學(xué)報(bào),2011.