2

我开始了一个需要使用网络级数据包(例如 IP/ICMP/UDP/TCP 数据包)的项目。

有两种主要的处理方法:原始套接字和 Winpcap/libpcap。

我知道 pcap 在操作系统上安装驱动程序并允许程序员捕获和发送数据包。另一方面,原始套接字在 Windows 7 或更高版本中有一些限制。

该项目需要向路由器发送一些 IP/ICMP/UDP/TCP 数据包并分析响应,例如IP-Identifier, TTL, ... 。我也希望它适用于 Linux 和 Windows。

你能列出这两种方法的比较吗?

4

2 回答 2

1

如果您希望代码可移植,则不能使用原始套接字 API(在 Linux 和 Windows 上完全不同)。Winpcap 通常与 libpcap 兼容,并且 pcap API 通常是合理的,考虑到它在做什么。

于 2012-02-20T20:34:42.680 回答
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 标头 + 传输级别标头,但不能获得以太网标头。因此,如果您只对应用层数据感兴趣,并且想将 IP 标头用于 Ipaddress 和 TTL,并将传输标头用于端口号等,那么就可以了。请记住,对于 TCP,您可能还必须进行校验和和重组。UDP 也需要一些校验和。

但是,winpcap 为您解决了许多管理问题,因为它使用设备驱动程序连接您的 NIC 的数据链路层或第 2 层。在这里您还将获得一个以太网帧,并且不必打开不同类型的 RAW 套接字。您仍然必须像在网络层(第 3 层)上那样应用处理数据包的应用程序相关逻辑。

于 2013-10-03T14:01:04.027 回答