2011-09-23 98 views
4

我一直在經歷很多關於數據包捕獲/處理和主機堆棧的技術文檔,這些文檔試圖理解這一切,希望有幾個地方我很困擾有人可以幫忙。FreeBSD:有關NIC環形緩衝區,mbufs和bpf緩衝區的問題

假設您正在運行tcpdump: 從NIC的環形緩衝區(物理網卡內存權限?) 中複製數據包後,它是否會立即存儲到mbuf中?然後BPF從 mbuf獲得數據包的副本,然後將其存儲在BPF緩衝區中,因此同時在內存中有兩個副本?我試圖瞭解確切的過程。

還是更像是:數據包從網卡複製到mbuf(用於主機堆棧處理)和僞同步?

一旦數據包通過以mbuf作爲位置(指向mbuf)的ip/tcp輸入函數經過主機堆棧處理,即數據包存儲在mbuf中,如果數據包未針對系統尋址,通過集線器或SPAN/Monitor端口監控流量,數據包將被丟棄,並永遠不會進入主機堆棧。

我似乎遇到過在內核「盒子」/從用戶空間中分離它的NIC環形緩衝區(RX/TX)的圖表,這讓我第二次猜測環形緩衝區是否實際分配的系統內存不同於NIC上的物理內存。

假設環形緩衝區是指NIC的物理內存,設備驅動程序確定NIC環形緩衝區的大小是否正確,是否將物理限制放在一邊呢?例如我可以通過修改驅動程序來縮小緩衝區嗎?

謝謝!

回答

1

ETHER_BPF_MTAP宏調用bpf_mtap(),除mbuf格式的數據包外,bpf將數據從此mbuf複製到內部緩衝區。

但是mbufs可以使用外部存儲,所以可以有或沒有從NIC環形緩衝區複製到mbuf。 Mbufs實際上可以包含數據包數據,或者作爲參考接收緩衝區的標題。另外,目前的網卡只使用它們的小(128/96/... Kb)板載內存用於FIFO,並立即將所有數據傳輸到主內存中的環形緩衝區。所以你真的可以調整設備驅動程序的緩衝區大小。