- 解決的問題
- 網絡數據接收時,存在丟包,一般因爲如下問題:
- 內存拷貝
- 中斷
- 多次調用
- 網絡數據接收時,存在丟包,一般因爲如下問題:
- 零拷貝發展史
- BPF
- Berkeley Packet Filter
- 參考資料:
- https://baike.baidu.com/item/bpf/5307621?fr=aladdin
- libpcap
- 4,libpcap提供的一個最有用的函數是pcap_compile(), 它可以把一個輸入輸出的邏輯表達式變爲BPF代碼!tcpdump利用這個函數完成在用戶輸入的命令行和BPF代碼之間的轉換!tcpdump有個我們很感興趣但是很少使用的參數 ,-d,可以輸出BPF代碼!把tcpdump -d中的-d換成-dd,將顯示出一段C代碼,可以把它複製到自己的程序中,可以通過調用setsockopt()來過濾端口!
- 摘自:https://blog.csdn.net/shenwansangz/article/details/48088431
- 先看看哪些應用是通過這個庫寫出來的吧,snort,tcpdump。wireshark用的winpcap。可見還是非常的強大的,它同樣支持BPF信息過濾機制
- 轉自:https://www.cnblogs.com/lanjianhappy/p/10578840.html
- libpcap工作機制:
- A:本地網卡設置爲混雜模式(這種模式能夠接受所有流經本機所在網絡得數據包)
- B:數據包經過BPF過濾
- C:交給linux內核層數據包緩衝區,用戶層應用程序通過系統調用將數據包從內核緩衝區取出並放入用戶空間內存區
- 缺陷:
- 數據包經過了linux得內核網絡協議棧,從網卡到用戶空間的傳遞過程,存在多次的拷貝和中斷相應,消耗大量得cpu時間片,降低系統整體的數據分析能力。
- 4,libpcap提供的一個最有用的函數是pcap_compile(), 它可以把一個輸入輸出的邏輯表達式變爲BPF代碼!tcpdump利用這個函數完成在用戶輸入的命令行和BPF代碼之間的轉換!tcpdump有個我們很感興趣但是很少使用的參數 ,-d,可以輸出BPF代碼!把tcpdump -d中的-d換成-dd,將顯示出一段C代碼,可以把它複製到自己的程序中,可以通過調用setsockopt()來過濾端口!
- pf_ring
- 轉自:https://www.cnblogs.com/lanjianhappy/p/10578840.html
- 在linux內核層添加了一種新的帶緩存得協議族,結合網卡得內存訪問模式DMA以及中斷模式NAPI技術,減少cpu得中斷次數。位於用戶層得應用程序通過mmap技術直接訪問linux內核層得網絡數據包,減少數據拷貝。它是一種獨立模塊的形式,能夠進行模塊的卸載和加載。
- 缺陷:
- 數據從網卡內存緩存區到內核sk_buf數據存儲,進行一次拷貝,並沒有實現真正意義得零拷貝。f另外它得預處理和數據包的捕獲仍然在內核層完成。
- 2.PF_RING 比 PACKET_MMAP區別?
- (1)PACKET_MMAP實現了用戶空間和內核空間的零copy,但是從網卡到內核空間還是有一層copy的,所有不是真正的zero-copy。
- (2)PF_RING提供免費版本和收費版本,其中免費模式,實現的原理跟PACKET_MMAP是類似的,不是真正的zero-copy;但是收費的DNA模式,實現了真正的zero-copy(由於收費模式提供時庫,所有沒法看代碼是怎麼實現的)
- 轉自:https://www.cnblogs.com/lanjianhappy/p/10578840.html
- dpdk
- 特性:
- 用戶態拷貝: 加入uio驅動
- 大頁內存
- CPU親核特性
- 零拷貝
- 分流方式:
- TAP/TUN
- RSS (Receive Side Scaling)
- 特性:
- BPF
- 背景知識:
- sk_buf
sk_buff是Linux網絡代碼中最重要的結構體之一。它是Linux在其協議棧裏傳送的結構體,也就是所謂的“包”,在他裏面包含了各層協議的頭部,比如ethernet, ip ,tcp ,udp等等。也有相關的操作等。熟悉他是進一步瞭解Linux網絡協議棧的基礎。
- 已解決疑問
- 1. 接收模塊是否有單獨的線程?
- 有內核線程 ,處理函數 kni_thread_single
- 收到包後,調用:kni_net_poll_resp(dev)通知
kni_net_poll_resp(struct kni_dev *kni) { if (kni_fifo_count(kni->resp_q)) wake_up_interruptible(&kni->wq); }
- 1. 接收模塊是否有單獨的線程?
- 遺留問題:
- 1. DPDK如何實現用戶態拷貝?
- 在網上看到的DPDK面試題
- DPDK提供了兩種與linux kernel協議棧交互:
- 兩種都是通過創建虛擬設備用於收發報文
- TAP
- 應該是發送??: 從用戶態拷貝到內核態;
- 應該是接收? 從內核態sk_buff拷貝到用戶態
- KNI
- RX: PMD分配mbuf,
- TAP
- 兩種都是通過創建虛擬設備用於收發報文
- 1. DPDK如何實現用戶態拷貝?