2012-02-20 168 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