libpcap開(kāi)源庫(kù)解析_第1頁(yè)
libpcap開(kāi)源庫(kù)解析_第2頁(yè)
libpcap開(kāi)源庫(kù)解析_第3頁(yè)
libpcap開(kāi)源庫(kù)解析_第4頁(yè)
libpcap開(kāi)源庫(kù)解析_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、基于Linux平臺(tái)的libpcap源碼分析和優(yōu)化  目錄1. libpcap簡(jiǎn)介. 12. libpcap捕包過(guò)程. 22.1        數(shù)據(jù)包基本捕包流程. 22.2        libpcap捕包過(guò)程. 42.3        libpcap 1.3.0源碼對(duì)照. 62.3.1       

2、0; 創(chuàng)建環(huán)形隊(duì)列. 62.3.2         捕獲數(shù)據(jù)包. 63. libpcap捕包優(yōu)化分析. 73.1處理流程單一:. 73.2高中斷服務(wù)負(fù)荷:. 83.3內(nèi)核態(tài)到用戶(hù)態(tài)上下文選擇:. 83.4數(shù)據(jù)拷貝和內(nèi)存分配消耗:. 84. 延伸拓展. 84.1 libpcap多線(xiàn)程捕包. 84.2 Linux并行運(yùn)算. 94.3 零拷貝發(fā)包. 95. 參考資料:. 9   1.  libpcap簡(jiǎn)介libpcap是unix/linux平臺(tái)下的網(wǎng)絡(luò)數(shù)據(jù)包捕獲函數(shù)包,大多數(shù)網(wǎng)絡(luò)監(jiān)

3、控軟件都以它為基礎(chǔ)。Libpcap可以在絕大多數(shù)類(lèi)unix平臺(tái)下工作.Libpcap提供了系統(tǒng)獨(dú)立的用戶(hù)級(jí)別網(wǎng)絡(luò)數(shù)據(jù)包捕獲接口,并充分考慮到應(yīng)用程序的可移植性。Libpcap可以在絕大多數(shù)類(lèi)unix平臺(tái)下工作。在windows平臺(tái)下,一個(gè)與libpcap 很類(lèi)似的函數(shù)包 winpcap 提供捕獲功能,其官方網(wǎng)站是http:/winpcap.polito.it/。     2. libpcap捕包過(guò)程2.1     數(shù)據(jù)包基本捕包流程 具體的Linux數(shù)據(jù)包處理流程如圖1 所示。數(shù)據(jù)包從網(wǎng)卡經(jīng)過(guò)內(nèi)

4、核最終到達(dá)用戶(hù)空間的應(yīng)用程序,其中經(jīng)過(guò)三次處理:中斷服務(wù)、軟中斷和應(yīng)用程序,使用三個(gè)緩存:DMA、包隊(duì)列和插口。在網(wǎng)卡驅(qū)動(dòng)中存在運(yùn)行時(shí)內(nèi)存分配,從內(nèi)核到用戶(hù)態(tài)時(shí)存在一次內(nèi)存拷貝。   通過(guò)對(duì)圖 1 進(jìn)行分析可知,以下幾個(gè)方面的問(wèn)題可能會(huì)限制系統(tǒng)數(shù)據(jù)包的捕獲處理能力:1)處理流程單一:整個(gè)處理流程串行化,其處理能力受限于整個(gè)流程的任何一處“短板”。在多核架構(gòu)系統(tǒng)中這樣的處理方式無(wú)法發(fā)揮并行優(yōu)勢(shì),存在極大的資源浪費(fèi)。 2)高中斷服務(wù)負(fù)荷:由于采用每接收一個(gè)數(shù)據(jù)包就產(chǎn)生一次中斷的方式,當(dāng)數(shù)據(jù)包以很高的速率到達(dá)時(shí),即使最快的處理器也會(huì)被持續(xù)的中斷服務(wù)請(qǐng)求占用而無(wú)

5、法處理數(shù)據(jù)包,從而導(dǎo)致數(shù)據(jù)包丟失。 3)內(nèi)核態(tài)到用戶(hù)態(tài)上下文選擇:當(dāng)數(shù)據(jù)包由內(nèi)核態(tài)進(jìn)入用戶(hù)態(tài)時(shí)會(huì)發(fā)生上下文選擇切換,從而導(dǎo)致用戶(hù)態(tài)任務(wù)延遲幾毫秒開(kāi)始。 4)數(shù)據(jù)拷貝和內(nèi)存分配消耗:DMA 緩存、內(nèi)核及用戶(hù)內(nèi)存間的數(shù)據(jù)拷貝占用了大量的CPU 資源。  2.2     libpcap捕包過(guò)程   在Linux中,數(shù)據(jù)包捕獲的基礎(chǔ)是PACKET套接字,libpcap是對(duì)PACKET套接字的簡(jiǎn)單封裝上圖是libpcap的結(jié)構(gòu)圖,圖中的流程分為兩部分,箭頭表示數(shù)據(jù)包的流向上圖左半部由網(wǎng)絡(luò)子系統(tǒng)發(fā)

6、起,是PACKET套接字捕獲數(shù)據(jù)包的過(guò)程PACKET套接字在網(wǎng)絡(luò)協(xié)議棧和網(wǎng)卡(network interface card,NIC)設(shè)備之間設(shè)置鉤子函數(shù)當(dāng)協(xié)議棧通過(guò)NIC發(fā)送數(shù)據(jù)包或者NIC接收到數(shù)據(jù)包由驅(qū)動(dòng)送入?yún)f(xié)議棧處理時(shí),數(shù)據(jù)包被鉤子函數(shù)捕獲送入PACKET 套接字中 PACKET套接字的核心模塊包括兩個(gè)部分:1) BPF(berkeleypacket filter)過(guò)濾器BPF根據(jù)用戶(hù)設(shè)置的過(guò)濾規(guī)則計(jì)算應(yīng)該接收的數(shù)據(jù)包長(zhǎng)度值,如果該值比數(shù)據(jù)包的長(zhǎng)度小,那么數(shù)據(jù)包將會(huì)被截短特別地,如果該值為,數(shù)據(jù)包會(huì)被PACKET套接字丟棄而直接返回協(xié)議棧進(jìn)行網(wǎng)絡(luò)層的處理BPF在Linux中,B

7、PF被用于內(nèi)核進(jìn)行數(shù)據(jù)包過(guò)濾,以減小提交給應(yīng)用程序的數(shù)據(jù)包的包數(shù)和字節(jié)數(shù),提高系統(tǒng)性能 2)緩存隊(duì)列(BufferQ)用于緩存供應(yīng)用程序讀取的數(shù)據(jù)包,如果隊(duì)列長(zhǎng)度超過(guò)了預(yù)設(shè)緩存區(qū)的長(zhǎng)度,那么數(shù)據(jù)包將會(huì)被丟棄共享內(nèi)存隊(duì)列,共享內(nèi)存被劃分為固定大小的幀,數(shù)據(jù)包被按順序拷貝到幀中,然后內(nèi)核設(shè)置數(shù)據(jù)有效位,表示該幀存放了一個(gè)有效的數(shù)據(jù)包圖2右半部由應(yīng)用程序發(fā)起,從PACKET 套接字的緩存隊(duì)列中獲取數(shù)據(jù)包在共享內(nèi)存隊(duì)列中,libpcap在打開(kāi)NIC設(shè)備時(shí),使用mmap 函數(shù)將共享內(nèi)存映射到應(yīng)用程序的虛擬空間中l(wèi)ibpcap根據(jù)幀大小按順序讀取緩存區(qū)如果當(dāng)前幀的數(shù)據(jù)有效位被設(shè)置,則將該數(shù)據(jù)包提

8、交給應(yīng)用程序處理,在處理完畢以后,libpcap清除當(dāng)前幀的有效位,允許內(nèi)核再次使用該幀;否則,libpcap使用poll()函數(shù)等待數(shù)據(jù)包的到達(dá)與libpcap1.0之前版本相比,共享內(nèi)存緩存隊(duì)列減少了一次數(shù)據(jù)包拷貝和調(diào)用recvmsg()進(jìn)入、退出內(nèi)核態(tài)的系統(tǒng)開(kāi)銷(xiāo),因此有較大的性能提升。  把上面比較抽象的文字翻譯成一個(gè)簡(jiǎn)單的示例圖如下所示:  2.3     libpcap 1.3.0源碼對(duì)照 對(duì)應(yīng)于libpcap 1.3.0源代碼如下:2.3.1  創(chuàng)建環(huán)形隊(duì)列主要步驟:1.setup

9、socket() -> creation of the capture socket2.setsockopt() -> allocation of the circular buffer (ring)3.mmap() -> maping of the allocated buffer to theuser process對(duì)應(yīng)libpcap-1.3.0源代碼:static intcreate_ring(pcap_t *handle, int *status)函數(shù)中:2.pcap-linux.c:3594行 if (setsockopt(handle->fd, SOL_PA

10、CKET, PACKET_RX_RING,                       (void *) &req, sizeof(req)       3.Pcap-linux.c:3627行     handle->md.mmapbuf = mmap(0, handle-

11、>md.mmapbuflen,    PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0); 2.3.2  捕獲數(shù)據(jù)包c(diǎn)apture poll() -> to wait for incoming packetsprocesstrigger the user processreset frame reset the status of the frame for kernel to reuse 對(duì)應(yīng)libpcap-1.3.0源代碼:static intpcap_read_li

12、nux_mmap(pcap_t *handle, int max_packets, pcap_handler callback, u_char *user)函數(shù)中:1.pcap-linux.c:3811行ret = poll(&pollinfo, 1, timeout);2.pcap-linux.c:4053行callback(user, &pcaphdr, bp);3.pcap-linux.c:4060行switch (handle->md.tp_version) case TPACKET_V1:h.h1->tp_status = TP_STATUS_KERNEL

13、;break; 3.  libpcap捕包優(yōu)化分析我們把之前2.1提到的可能會(huì)限制系統(tǒng)數(shù)據(jù)包的捕獲處理能力的地方寫(xiě)出來(lái):3.1處理流程單一: 因?yàn)樵膌ibpcap是單線(xiàn)程的,一個(gè)數(shù)據(jù)包的處理流程是“捕包處理包捕下個(gè)包-處理下個(gè)包?!彼蕴幚戆臅r(shí)間長(zhǎng)短會(huì)影響下一個(gè)捕包的開(kāi)始時(shí)間,解決這個(gè)有2個(gè)辦法,一個(gè)是優(yōu)化處理包流程,縮短處理包時(shí)間,但這個(gè)方法治標(biāo)不治本,另一個(gè)方法是用多線(xiàn)程的方式捕包和處理包。       3.2高中斷服務(wù)負(fù)荷: 這個(gè)是操作系統(tǒng)捕包的關(guān)鍵,現(xiàn)在一般有2種思路A:把網(wǎng)卡的多個(gè)收包隊(duì)列

14、中斷均衡的綁定到多個(gè)不同的cpu上。(網(wǎng)上有很多教程)B:更換網(wǎng)卡驅(qū)動(dòng),可以把網(wǎng)卡一般現(xiàn)有的驅(qū)動(dòng)即依賴(lài)中斷接收數(shù)據(jù)包,改為輪詢(xún)方式,例如現(xiàn)在的NAPI驅(qū)動(dòng)和Intel的DPDK都有用到。 3.3內(nèi)核態(tài)到用戶(hù)態(tài)上下文選擇:現(xiàn)在的libpcap1.3.0支持一次捕獲多個(gè)數(shù)據(jù)包, 通過(guò)指定pcap_dispatch(pcap_t *p, int cnt, pcap_handler callback, u_char *user)接口中的cnt變量,而且現(xiàn)在的捕包不是基于recvmsg的系統(tǒng)調(diào)用,而是共享內(nèi)存隊(duì)列,所以大大減少了上下切換。  3.4數(shù)據(jù)拷貝和內(nèi)存分配消耗:由于采用了現(xiàn)在的共享內(nèi)存環(huán)形隊(duì)列,即零拷貝技術(shù),用戶(hù)態(tài)和內(nèi)核態(tài)只有一份數(shù)據(jù)拷貝,所以捕獲每個(gè)數(shù)據(jù)包都減少了一次數(shù)據(jù)拷貝。 4.  延伸拓展4.1 libpcap多線(xiàn)程捕包用什么樣的多線(xiàn)程架構(gòu)方式更能發(fā)揮libpcap捕包性能? 4.2 Linux并行運(yùn)算使用多線(xiàn)程或移植到多線(xiàn)程的時(shí)候,有什么注意事項(xiàng)? 4.3 零

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論