Linux經典的幾款收包引擎
這篇文章列舉四個比較經典的 Linux 收包引擎,如果還有其他你覺得ok的可以留言。這四個分別是:
libpcap/libpcap-mmap PF_RING DPDK xdp
libpcap
libpcap的套件擷取機制是在資料鏈結層增加一個旁路處理,不干擾系統本身的網路協定棧的處理,對發送和接收的資料包透過Linux核心做過濾和緩衝處理,最後直接傳遞給上層應用程式。
封包到達網卡設備。 網路卡設備依據配置進行DMA操作。 ( 「第1次拷貝」 :網路卡暫存器->核心為網路卡所指派的緩衝區ring buffer) #網卡發送中斷,喚醒處理器。 驅動軟體從ring buffer讀取,填滿核心skbuff結構( 「第2次拷貝」 # :核心網卡緩衝區ring buffer->核心專用資料結構skbuff) #接著呼叫netif_receive_skb函數:
#5.1 若有抓包程序,由網路分接口進入BPF過濾器,規則匹配的封包拷貝到系統核心快取( 「第3次拷貝」 SNA(Shared-nothing Architecture),軟體架構去中心化,盡量避免全局共享,帶來全局競爭,失去橫向擴展的能力。 NUMA系統下不跨Node遠端使用記憶體。 SIMD(Single Instruction Multiple Data),從最早的mmx/sse到最新的avx2,SIMD的能力一直在增強。 DPDK採用批量同時處理多個包,再用向量編程,一個週期內對所有包進行處理。例如,memcpy就使用SIMD來提高速度。 cpu affinity:即CPU 親和性 無需第三方程式碼庫和許可 同時支援輪詢式和中斷式網路 無需分配大頁 無專用的CPU #無須定義新的安全網路模型 DDoS防禦 #防火牆 基於XDP_TX的負載平衡 網路統計數據 複雜網路取樣 #高速交易平台
########################################## ###)。 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次拷貝沒有了”###### ###),減少了頻繁的系統調用,大大提高了報文捕獲的效率。 ###
PF_RING
我們看到之前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隊列,從而可以在每個隊列上同時一個應用程式) ,換而言之,用戶態的多個應用需要彼此溝通才能分發資料包。
DPDK
pf-ring zc和dpdk都可以實現封包的零拷貝,兩者均旁路了內核,但是實現原理略有不同。 pf-ring zc透過zc驅動(也在應用層)接管資料包,dpdk基於UIO實作。
1 UIO mmap 實作零拷貝(zero copy)
UIO(Userspace I/O)是運行在使用者空間的I/O技術。 Linux系統中一般的驅動裝置都是運行在內核空間,而在用戶空間用應用程式呼叫即可,而UIO則是將驅動的很少一部分運行在內核空間,而在用戶空間實現驅動的絕大多數功能。採用Linux提供UIO機制,可以旁路Kernel,將所有封包處理的工作在用戶空間完成。
2 UIO PMD 減少中斷和CPU上下文切換
DPDK的UIO驅動屏蔽了硬體發出中斷,然後在用戶態採用主動輪詢的方式,這種模式稱為PMD(Poll Mode Driver)。
與DPDK相比,pf-ring(no zc)使用的是NAPI polling和應用層polling,而pf-ring zc與DPDK類似,僅使用應用層polling。
3 HugePages 減少TLB miss
在作業系統引入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尋址性能。
4 其它優化
XDP
##xdp代表eXpress資料路徑,使用ebpf 做包過濾,相對於dpdk將資料包直接送到使用者態,用使用者態當做快速資料處理平面,xdp是在驅動層創建了一個資料快速平面。在資料被網卡硬體dma到內存,分配skb之前,對資料包進行處理。 請注意,XDP並沒有對資料包做Kernel bypass,它只是提前做了一點預檢而已。 相對於DPDK,XDP具有以下優點:XDP的使用情境包括:
#OK,以上就是今天的分享,如果你覺得還有其他的收包引擎,可以留言分享。
以上是Linux經典的幾款收包引擎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

CentOS 和 Ubuntu 的關鍵差異在於:起源(CentOS 源自 Red Hat,面向企業;Ubuntu 源自 Debian,面向個人)、包管理(CentOS 使用 yum,注重穩定;Ubuntu 使用 apt,更新頻率高)、支持週期(CentOS 提供 10 年支持,Ubuntu 提供 5 年 LTS 支持)、社區支持(CentOS 側重穩定,Ubuntu 提供廣泛教程和文檔)、用途(CentOS 偏向服務器,Ubuntu 適用於服務器和桌面),其他差異包括安裝精簡度(CentOS 精

CentOS 安裝步驟:下載 ISO 映像並刻錄可引導媒體;啟動並選擇安裝源;選擇語言和鍵盤佈局;配置網絡;分區硬盤;設置系統時鐘;創建 root 用戶;選擇軟件包;開始安裝;安裝完成後重啟並從硬盤啟動。

CentOS將於2024年停止維護,原因是其上游發行版RHEL 8已停止維護。該停更將影響CentOS 8系統,使其無法繼續接收更新。用戶應規劃遷移,建議選項包括CentOS Stream、AlmaLinux和Rocky Linux,以保持系統安全和穩定。

CentOS 已停止維護,替代選擇包括:1. Rocky Linux(兼容性最佳);2. AlmaLinux(與 CentOS 兼容);3. Ubuntu Server(需要配置);4. Red Hat Enterprise Linux(商業版,付費許可);5. Oracle Linux(與 CentOS 和 RHEL 兼容)。在遷移時,考慮因素有:兼容性、可用性、支持、成本和社區支持。

Docker利用Linux內核特性,提供高效、隔離的應用運行環境。其工作原理如下:1. 鏡像作為只讀模板,包含運行應用所需的一切;2. 聯合文件系統(UnionFS)層疊多個文件系統,只存儲差異部分,節省空間並加快速度;3. 守護進程管理鏡像和容器,客戶端用於交互;4. Namespaces和cgroups實現容器隔離和資源限制;5. 多種網絡模式支持容器互聯。理解這些核心概念,才能更好地利用Docker。

如何使用 Docker Desktop? Docker Desktop 是一款工具,用於在本地機器上運行 Docker 容器。其使用步驟包括:1. 安裝 Docker Desktop;2. 啟動 Docker Desktop;3. 創建 Docker 鏡像(使用 Dockerfile);4. 構建 Docker 鏡像(使用 docker build);5. 運行 Docker 容器(使用 docker run)。

CentOS 停止維護後,用戶可以採取以下措施應對:選擇兼容髮行版:如 AlmaLinux、Rocky Linux、CentOS Stream。遷移到商業發行版:如 Red Hat Enterprise Linux、Oracle Linux。升級到 CentOS 9 Stream:滾動發行版,提供最新技術。選擇其他 Linux 發行版:如 Ubuntu、Debian。評估容器、虛擬機或云平台等其他選項。

VS Code 系統要求:操作系統:Windows 10 及以上、macOS 10.12 及以上、Linux 發行版處理器:最低 1.6 GHz,推薦 2.0 GHz 及以上內存:最低 512 MB,推薦 4 GB 及以上存儲空間:最低 250 MB,推薦 1 GB 及以上其他要求:穩定網絡連接,Xorg/Wayland(Linux)
