版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 幼兒園籃球培訓(xùn)
- 思科交換機(jī)培訓(xùn)
- (基礎(chǔ)卷)第一單元 圓和扇形(單元測(cè)試)數(shù)學(xué)六年級(jí)上冊(cè)單元速記巧練系列(冀教版)教師版
- 河北省唐山市灤州市2024-2025學(xué)年七年級(jí)上學(xué)期11月份期中考試生物試題(無(wú)答案)
- T-YNZYC 0085-2023 綠色藥材 云黃連產(chǎn)地加工規(guī)程
- T-TSSP 029-2023 鮮筍漿(粉)加工技術(shù)規(guī)程
- 河北省邯鄲市部分校2024-2025學(xué)年高三上學(xué)期第二次聯(lián)考生物試題 含解析
- 河北省邢臺(tái)市邢襄聯(lián)盟2024-2025學(xué)年高三上學(xué)期10月份期中聯(lián)考數(shù)學(xué)試題 含解析
- Windows Server網(wǎng)絡(luò)管理項(xiàng)目教程(Windows Server 2022)(微課版)課件項(xiàng)目2 活動(dòng)目錄的配置與管理
- 浙江大學(xué)《現(xiàn)代漢語(yǔ)語(yǔ)法修辭》在線(xiàn)作業(yè)及答案
- 快消品行業(yè)新零售整體解決方案
- 浙教版小學(xué)二年級(jí)下冊(cè)《綜合實(shí)踐活動(dòng)》我的課間活動(dòng)-課件
- 全國(guó)職業(yè)院校技能大賽中職組法律實(shí)務(wù)比賽試題附答案
- 《耳鼻咽喉-頭頸外科學(xué)》見(jiàn)習(xí)教學(xué)大綱(五官)
- 第3課中國(guó)特色社會(huì)主義進(jìn)入新時(shí)代(高教版2023基礎(chǔ)模塊)
- 危重癥常見(jiàn)的管道護(hù)理
- 《一匹出色的馬》說(shuō)課課件
- 生物的多樣性及其保護(hù) 單元作業(yè)設(shè)計(jì)
- 村級(jí)財(cái)務(wù)培訓(xùn)課件
- 二級(jí)安全教育考試卷及答案
- 綠色物流階段測(cè)試試題及答案
評(píng)論
0/150
提交評(píng)論