捕捉用於調試網絡流量,似乎有兩種常用的方法:與PCAP VS原始套接字捕獲性能
使用原始套接字。
使用libpcap。
從表現上看,這兩種方法有很大的區別嗎? libpcap似乎是一種很好的兼容方式來收聽真實的網絡連接或重放一些罐頭數據,但是這種功能集是否會帶來性能問題?
捕捉用於調試網絡流量,似乎有兩種常用的方法:與PCAP VS原始套接字捕獲性能
使用原始套接字。
使用libpcap。
從表現上看,這兩種方法有很大的區別嗎? libpcap似乎是一種很好的兼容方式來收聽真實的網絡連接或重放一些罐頭數據,但是這種功能集是否會帶來性能問題?
原始數據包適用於IP層(OSI第3層),數據鏈路層(OSI第2層)上的pcap。所以它不是一個性能問題,更多的是你想要捕獲的問題。如果性能是您搜索PF_RING等的主要問題,那麼這就是當前IDS用於捕獲的內容。
編輯:原始數據包可以是IP層(AF_INET)或數據鏈路層(AF_PACKET),PCAP實際上可能會使用原始套接字,看到Does libpcap use raw sockets underneath them?
答案是爲了說明更多關於libpcap的。
libpcap使用PF_PACKET捕獲接口上的數據包。請參閱以下鏈接。 https://www.kernel.org/doc/Documentation/networking/packet_mmap.txt
從上述鏈路
在Linux中2.4/2.6/3.X如果未啓用PACKET_MMAP,捕獲過程非常 低效的。它使用非常有限的緩衝區,需要一個系統調用來捕獲每個數據包,如果你想獲得數據包的時間戳 (如libpcap總是這樣),它需要兩個。 另一方面,PACKET_MMAP非常有效。 PACKET_MMAP提供大小爲 的可配置循環緩衝區,映射到用戶空間,可用於發送或接收數據包的任何一個 。這樣讀取數據包只需要等待它們,大多數情況下不需要發出單個系統調用。關於 傳輸,可以通過一次系統調用發送多個數據包以獲得最高帶寬。通過使用內核和用戶之間的共享緩衝區,還具有最小化分組副本的好處。
性能改進可能因使用PF_PACKET實現而異。
從https://www.kernel.org/doc/Documentation/networking/packet_mmap.txt -
據說TPACKET_V3帶來以下好處: *)〜15日 - 在CPU使用率降低20% *)〜20%的增幅數據包捕獲率
的使用的libpcap缺點 -
如果一個應用程序需要保持數據包則可能需要進行 傳入數據包的副本。
請參閱pcap_next_ex的聯機幫助頁。
pcap_next_ex()讀取下一個數據包並返回成功/失敗指示。如果讀取的數據包沒有問題,pkt_header參數指向的指針 被設置爲指向數據包的 pcap_pkthdr結構,並且 pkt_data參數指向的指針被設置爲指向數據包中的數據。struct pcap_pkthdr和分組數據不會被 調用方釋放,並且在下一次調用 pcap_next_ex(),pcap_next(),pcap_loop()或pcap_dispatch()後不保證有效。如果 代碼需要它們保持有效,則它必須複製它們。
性能損失,如果應用程序只對傳入的 數據包感興趣。
PF_PACKET作爲內核中的抽頭工作,即將所有傳入和傳出數據包傳送到PF_SOCKET。這導致了對所有傳出數據包的高成本的packet_rcv調用。由於libpcap使用PF_PACKET,因此libpcap可以捕獲所有傳入和傳出數據包。 如果應用程序只對傳入數據包感興趣,則可以通過在libpcap句柄上設置pcap_setdirection來丟棄傳出數據包。 libpcap通過檢查數據包元數據上的標誌來內部丟棄傳出數據包。 所以實質上,傳出的數據包仍然可以被libpcap看到,但是隻能在稍後被丟棄。這是僅對傳入數據包感興趣的應用程序的性能損失。