bpf

bpf

柏克萊封包過濾器(Berkeley Packet Filter,縮寫 BPF),是類Unix系統上數據鏈路層的一種原始接口,提供原始鏈路層封包的收發,除此之外,如果網卡驅動支持洪泛模式,那么它可以讓網卡處於此種模式,這樣可以收到網路上的所有包,不管他們的目的地是不是所在主機。

簡介

柏克萊封包過濾器(Berkeley Packet Filter,縮寫 BPF),是類Unix系統上數據鏈路層的一種原始接口,提供原始鏈路層封包的收發,除此之外,如果網卡驅動支持洪泛模式,那么它可以讓網卡處於此種模式,這樣可以收到網路上的所有包,不管他們的目的地是不是所在主機。

另外,BPF支持“過濾”封包,這樣BPF會只把“感興趣”的封包到上層軟體,可以避免從作業系統核心向用戶態複製其他封包,降低抓包的CPU的負擔以及所需的緩衝區空間,從而減少丟包率。BPF的過濾功能是以BPF虛擬機機器語言的解釋器的形式實現的,這種語言的程式可以抓取封包數據,對封包中的數據採取算術操作,並將結果與常量或封包中的數據或結果中的測試位比較,根據比較的結果決定接受還是拒絕封包。在一些平台上,包括FreeBSD和WinPcap,即時編譯技術用於把虛擬機指令轉換為原始碼,以進一步減少開銷。

在其他作業系統上,此虛擬機語言的核心態解釋器也被用於原始數據鏈路機制,例如Tru64 Unix系統,以及Linux中的套接字解釋器,和WinPcap封包抓取機制。

用戶態解釋器由pcapAPI的libpcap/WinPcap實現提供,因此,在對此過濾機制沒有核心態支持的系統上抓取封包時,封包可以在核心態過濾,使用pcap API的代碼可以工作於此兩種模式;在使用用戶態過濾的系統上,所有分包由核心態複製到用戶態,包括將被過濾出去的封包。這種解釋器也可以用於包含由pcap抓取的封包的檔案。

BPF有時也只表示過濾機制,而不是整個接口。

BSD 核心實現例程如bpf_mtap()和bpf_tap(),以BPF_MTAP()和BPF_TAP()等宏定義的形式進行包裹由網卡驅動(以及偽驅動pseudo-drivers) 向BPF機制傳送進出的封包。

2007年,Robert Watson與Christian Peron為FreeBSD作業系統中BPF的實現加入了zero-copy buffer extension,使得驅動程式中斷處理器中的核心封包抓取能直接向用戶記憶體寫,以避免BPF設備收到的所有封包數據的兩次複製需要,一份副本存在於用戶進程的接收路徑中,這保證了不同BPF設備調用者的獨立性,同時使得只把封包頭部放入BPF緩衝區,而不是複製整個封包數據。

數據鏈路層

數據鏈路層(Data Link Layer)是OSI參考模型第二層,位於物理層與網路層之間。在廣播式多路訪問鏈路中(區域網路),由於可能存在介質爭用,它還可以細分成介質訪問控制(MAC)子層和邏輯鏈路控制(LLC)子層,介質訪問控制(MAC)子層專職處理介質訪問的爭用與衝突問題。

區域網路與廣域網皆屬第1,2層。

參見

•CSMA/CD

•協定數據單元

相關詞條

相關搜尋

熱門詞條

聯絡我們