libpcap(Packet Capture Library),即數據包捕獲函數庫,是Unix/Linux平臺下的網絡數據包捕獲函數庫。它是一個獨立於系統的用戶層包捕獲的API接口,爲底層網絡監測提供了一個可移植的框架。算法
1、 libpcap工做原理網絡
libpcap主要由兩部份組成:網絡分接頭(Network Tap)和數據過濾器(Packet Filter)。網絡分接頭從網絡設備驅動程序中收集數據拷貝,過濾器決定是否接收該數據包。Libpcap利用BSD Packet Filter(BPF)算法對網卡接收到的鏈路層數據包進行過濾。BPF算法的基本思想是在有BPF監聽的網絡中,網卡驅動將接收到的數據包複製一份交給BPF過濾器,過濾器根據用戶定義的規則決定是否接收此數據包以及須要拷貝該數據包的那些內容,而後將過濾後的數據給與過濾器相關聯的上層應用程序。框架
libpcap的包捕獲機制就是在數據鏈路層加一個旁路處理。當一個數據包到達網絡接口時,libpcap首先利用已經建立的Socket從鏈路層驅動程序中得到該數據包的拷貝,再經過Tap函數將數據包發給BPF過濾器。BPF過濾器根據用戶已經定義好的過濾規則對數據包進行逐一匹配,匹配成功則放入內核緩衝區,並傳遞給用戶緩衝區,匹配失敗則直接丟棄。若是沒有設置過濾規則,全部數據包都將放入內核緩衝區,並傳遞給用戶層緩衝區。函數
2、 libpcap的抓包框架oop
pcap_lookupdev()函數用於查找網絡設備,返回可被pcap_open_live()函數調用的網絡設備名指針。性能
pcap_open_live()函數用於打開網絡設備,而且返回用於捕獲網絡數據包的數據包捕獲描述字。對於此網絡設備的操做都要基於此網絡設備描述字。spa
pcap_lookupnet()函數得到指定網絡設備的網絡號和掩碼。設計
pcap_compile()函數用於將用戶制定的過濾策略編譯到過濾程序中。指針
pcap_setfilter()函數用於設置過濾器。接口
pcap_loop()函數pcap_dispatch()函數用於捕獲數據包,捕獲後還能夠進行處理,此外pcap_next()和pcap_next_ex()兩個函數也能夠用來捕獲數據包。
pcap_close()函數用於關閉網絡設備,釋放資源。
3、 libpcap-mmap
libpcap-mmap是libpcap的一個改進版本,它們捕獲數據包的結構相同。不一樣的地方主要有如下兩點:
libpcap使用固定大小的存儲緩衝器和保持緩衝器來完成數據包從內核到用戶層的傳遞,而libpcap-mmap設計了一個大小能夠配置的循環緩衝器,容許用戶程序和內核程序同時對該循環緩衝器的不一樣數據區域進行直接的讀取。
在libpcap中,當網卡接收到一個數據包以後,網卡驅動程序經過DMA方式調用系統函數netif_rx()將數據包從網卡拷貝到核心態內存,應用程序想訪問位於核心態內存的數據時就必須將數據包從核心態內存中拷貝到用戶態內存中,這樣就佔用了不少系統資源,下降數據包捕獲的性能以及對數據包的處理能力。而libpcap-mmap採用MMAP技術,創建核心態內存和用戶態內存的映射,將系統分配給網卡設備文件的核心態內存映射到一塊用戶態內存,這樣應用程序能夠經過調用系統函數recvfrom()函數把數據包從網卡上直接傳送到用戶態內存中,減小了一次數據拷貝,下降了系統資源的消耗,提升數據包捕獲效率。