【问题标题】:winpcap/libpcap vs. raw socketswinpcap/libpcap 与原始套接字
【发布时间】:2012-03-11 04:35:40
【问题描述】:

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

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

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

项目需要向路由器发送一些IP/ICMP/UDP/TCP数据包并分析响应,例如IP-IdentifierTTL,...。我也希望它可以在 Linux 和 Windows 中运行。

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

【问题讨论】:

  • 没有足够的答案,但原始套接字是not available on non-server versions of windows after XP SP2(在某些条件下)不仅仅是 Windows 7。
  • 其实我不知道pcap驱动能不能发数据,我以为只能抓包。使用适用于 Windows 的服务器操作系统可能需要能够发送数据包。这是因为恶意软件已经滥用了很长时间,他们为除服务器之外的所有人禁用了它(因为最终用户永远不需要伪造原始数据包)

标签: java c++ pcap libpcap raw-sockets


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    在您的情况下,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 层)上那样应用处理数据包的应用程序相关逻辑。

    【讨论】:

    • 如果您使用的是 JAVA,那么您可以将 JPCAP 用于第 2 层,或者如果您想使用第 3 层,那么您可以使用 savarese 的原始套接字库以及 savarese 的虚拟服务 TCP 来捕获原始数据包用于数据操作的 IP。但是,使用 JPCAP 的另一个优点是能够从以太网标头中获取源 MAC 地址和目标 MAC 地址。另一方面,savarese 的虚拟服务在计算 TCP 校验和方面具有更精细的 api 优势,这是 JPCAP 所缺乏的。对于 jpcap,请使用 Keita Fuji 的库,因为它没有内存泄漏。
    • 你实际上可以同时使用它们。
    猜你喜欢
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 2011-08-23
    相关资源
    最近更新 更多