2012-02-20 169 views
2

我開始了一個需要使用網絡級數據包(如IP/ICMP/UDP/TCP數據包)的項目。winpcap/libpcap與原始套接字

處理它有兩種主要方法:原始套接字和Winpcap/libpcap。

我知道pcap在OS上安裝驅動程序,並允許程序員捕獲和發送數據包。另一方面,在Windows 7或更高版本中有一些原始套接字有一些限制。

該項目需要向路由器發送一些IP/ICMP/UDP/TCP數據包並分析響應,如IP-Identifier,TTL,...。另外我希望它能在Linux和Windows上運行。

你能列出一個關於這兩種方法的比較嗎?

+0

對於答案還不夠,但原始套接字[在XP SP2之後的非服務器版本的Windows上不可用](http://msdn.microsoft.com/zh-cn/library/windows/desktop/ms740548%28v = vs.85%29.aspx#limits_on_raw_sockets)(在特定條件下)不僅僅是Windows 7. – 2012-02-20 20:51:33

+0

事實上,我不知道pcap驅動程序是否可以發送數據,我認爲它只能捕獲。使用適用於Windows的服務器操作系統可能需要能夠發送數據包。這是因爲惡意軟件長期濫用了這個功能,所以只有服務器(作爲最終用戶永遠不需要僞造原始數據包)禁用它。 – 2012-02-20 20:56:47

回答

1

如果您希望代碼具有可移植性,那麼您無法使用原始套接字API(在Linux和Windows上這種API非常不同)。 Winpcap通常與libpcap兼容,並且考慮到它正在做什麼,pcap API通常是合理的。

0

在您的情況,RAW插槽可以工作,但你必須做一些像 sock_raw_tcp = socket(AF_INET , SOCK_RAW , IPPROTO_TCP); sock_raw_udp = socket(AF_INET , SOCK_RAW , IPPROTO_UDP); sock_raw_icmp = socket(AF_INET , SOCK_RAW , IPPROTO_ICMP);

你不必像IP_PROTO_IP的選項。現在,使用RAW套接字,您將只能獲得IP標頭+傳輸級別標頭,但不能獲得以太網標頭。所以,如果你只對應用層數據感興趣,並且希望使用Ipaddress的IP頭來爲端口號等TTL和傳輸頭,那麼就OK。請記住,對於TCP,您可能必須檢查總和並重新組裝。 UDP也需要一些校驗和。

但是,winpcap解決了許多管理問題,因爲它使用設備驅動程序來連接NIC的數據鏈路層或第2層。在這裏,您還將獲得以太網幀並且不必打開不同類型的RAW套接字。您仍然需要像處理網絡層(層3)一樣應用與數據包相關的應用程序相關邏輯。

+0

如果您使用的是JAVA,那麼您可以使用JPCAP for layer 2或者如果您想要要使用第3層,則可以使用savarese的原始套接字庫來捕獲原始數據包以及savarese的虛擬服務TCP IP,以便進行數據操作。但是,使用JPCAP的另一個優點是能夠從以太網頭獲取源MAC地址和目標MAC地址。另一方面,就計算TCP校驗和而言,savarese的虛擬服務具有更精確的API優勢,而JPCAP缺乏該校驗和。對於jpcap,使用Keita Fuji的庫,因爲它沒有內存泄漏。 – Ashley 2013-10-03 14:29:39

+0

你可以實際使用它們兩個在一起。 – Ashley 2013-10-03 14:35:26