1. 程式人生 > >(轉)Libcap庫學習::(二)工作原理

(轉)Libcap庫學習::(二)工作原理

Libpcap工作原理介紹

Libpcap是Unix/Linux平臺下的網路資料包捕獲資料庫。它是一個獨立於系統的使用者級資料包捕獲API介面,為底層網路監測提供了一個可以移植的框架。


一個包捕獲機制包含三個主要部分,分別是面向底層的包捕獲引擎面向中間層的資料包過濾器面向應用層的使用者介面

Linux作業系統對於資料包的處理流程是從底到上的方式,依次經歷網路介面卡、網絡卡驅動層、資料鏈路層、IP層、傳輸層,最後到達應用程式。

Libpcap也是基於這種原理,Libpcap的捕獲機制並不影響Linux作業系統中網路協議棧對資料包的處理。

對應用程式而言,Libpcap包捕獲機制只是提供了一個統一的API介面,使用者只需要按照相關的程式設計流程,簡單地呼叫若干函式就可以捕獲到感興趣的資料包。

具體來說,Libpcap庫主要由三個部分組成,網路分接頭、資料包過濾器和使用者API。

 

1)網路分接頭

網路分接頭(Network Tap)是一種鏈路層旁路機制,負責採集網絡卡資料包。

(2)資料包過濾器

資料包過濾器(Packet Filter)是針對資料包的一種過濾機制,在Libpcap中採用BPF(BSD Packet Filter)演算法對資料包執行過濾操作,這種演算法的基本思想就是基於規則匹配,對符合條件的資料包進行放行。

(3)使用者API

使用者API是Libpcap面向上層應用程式提供的程式設計介面,使用者通過呼叫相關的函式實現資料包的捕獲或者傳送。

具體來說,Libpcap的工作原理可以描述為,當一個數據包到達網絡卡時,Libpcap利用建立的套接字從鏈路層驅動程式中獲得該資料包的拷貝,即旁路機制,同時通過Tap函式將資料包發給BPF過濾器。

BPF過濾器根據使用者已經定義好的過濾過則對資料包進行逐一匹配,若匹配成功則放入核心緩衝區,並傳遞給使用者緩衝區,匹配失敗則直接丟棄。如果沒有設定過濾規則,所有的資料包都將放入核心緩衝區,並傳遞給使用者緩衝區。

工作流程如下圖所示: