這篇文章列舉四個比較經典的 Linux 收包引擎,如果還有其他你覺得ok的可以留言。這四個分別是:
libpcap的套件擷取機制是在資料鏈結層增加一個旁路處理,不干擾系統本身的網路協定棧的處理,對發送和接收的資料包透過Linux核心做過濾和緩衝處理,最後直接傳遞給上層應用程式。
########################################## ###)。 BPF為每一個要求服務的抓包程式關聯一個filter和兩個buffer。 BPF分配buffer 且通常情況下它的額度是4KB the store buffer 被用來接收來自適配器的資料;the hold buffer被用來拷貝包到應用程式。 ############5.2 處理資料鏈結層的橋接功能;############5.3 根據skb->protocol欄位決定上層協定並提交給網路層處理,進入網路協定棧,進行高層處理。 ############libpcap繞過了Linux核心收包流程中協定堆疊部分的處理,使得用戶空間API可以直接呼叫套接字PF_PACKET從鏈路層驅動程式中獲得資料封包的拷貝,將其從核心緩衝區拷貝至使用者空間緩衝區(### ######「第4次拷貝」###### ###)########## ###libpcap-mmap#########libpcap-mmap是對舊的libpcap實作的改進,新版的libpcap基本上都採用packet_mmap機制。 PACKET_MMAP通過mmap,減少一次內存拷貝(### ######“第4次拷貝沒有了”###### ###),減少了頻繁的系統調用,大大提高了報文捕獲的效率。 ###
我們看到之前libpcap有4次記憶體拷貝。 libpcap_mmap有3次記憶體拷貝。 PF_RING提出的核心解決方案就是減少封包在傳輸過程中的拷貝次數。
我們可以看到,相對與libpcap_mmap來說,pfring允許用戶空間記憶體直接和rx_buffer做mmap。這又減少了一次拷貝( 「libpcap_mmap的第2次拷貝」:rx_buffer->skb)
PF-RING ZC實作了DNA(Direct NIC Access 直接網卡存取)技術,將使用者記憶體空間對應到驅動的記憶體空間,使用戶的應用可以直接存取網卡的暫存器和資料。
透過這樣的方式,避免了在核心對資料包緩存,減少了一次拷貝( 「libpcap的第1次拷貝」 ,DMA到核心緩衝區的拷貝)。這就是完全的零拷貝。
其缺點是,只有一個應用程式可以在某個時間打開DMA ring(請注意,現在的網路卡可以具有多個RX / TX隊列,從而可以在每個隊列上同時一個應用程式) ,換而言之,用戶態的多個應用需要彼此溝通才能分發資料包。
pf-ring zc和dpdk都可以實現封包的零拷貝,兩者均旁路了內核,但是實現原理略有不同。 pf-ring zc透過zc驅動(也在應用層)接管資料包,dpdk基於UIO實作。
UIO(Userspace I/O)是運行在使用者空間的I/O技術。 Linux系統中一般的驅動裝置都是運行在內核空間,而在用戶空間用應用程式呼叫即可,而UIO則是將驅動的很少一部分運行在內核空間,而在用戶空間實現驅動的絕大多數功能。採用Linux提供UIO機制,可以旁路Kernel,將所有封包處理的工作在用戶空間完成。
DPDK的UIO驅動屏蔽了硬體發出中斷,然後在用戶態採用主動輪詢的方式,這種模式稱為PMD(Poll Mode Driver)。
與DPDK相比,pf-ring(no zc)使用的是NAPI polling和應用層polling,而pf-ring zc與DPDK類似,僅使用應用層polling。
在作業系統引入MMU(Memory Management Unit)後,CPU讀取記憶體的資料需要兩次存取記憶體。第一次要查詢頁表將邏輯位址轉換為實體位址,然後存取該實體位址讀取資料或指令。
為了減少頁數過多,頁表過大而導致的查詢時間過長的問題,便引入了TLB(Translation Lookaside Buffer),可翻譯為地址轉換緩衝器。 TLB是記憶體管理單元,一般儲存在暫存器中,裡面儲存了目前最可能被存取到的一小部分頁表項。
引入TLB後,CPU會先去TLB中尋址,由於TLB存放在暫存器中,且其只包含一小部分頁表項,因此查詢速度非常快。若TLB中尋址成功(TLB hit),則無需再去RAM中查詢頁表;若TLB中尋址失敗(TLB miss),則需要去RAM中查詢頁表,查詢到後,會將該頁更新至TLB中。
而DPDK採用HugePages ,在x86-64下支援2MB、1GB的頁大小,大大降低了總頁個數和頁表的大小,從而大大降低TLB miss的幾率,提升CPU尋址性能。
XDP的使用情境包括:
#OK,以上就是今天的分享,如果你覺得還有其他的收包引擎,可以留言分享。
以上是Linux經典的幾款收包引擎的詳細內容。更多資訊請關注PHP中文網其他相關文章!