【问题标题】:Is libpcap implemented by socket API?libpcap 是由 socket API 实现的吗?
【发布时间】:2016-03-09 05:41:20
【问题描述】:

libpcap 用于抓包。据我了解,它可以从所有端口捕获网络包。并且可以捕获链路层的包数据(如以太网帧)。

这让我有点困惑,因为在类 Unix 系统中仅使用套接字 API 似乎不可能拦截所有网络流量(来自所有端口)。此外,socket API 似乎无法获取链路层的信息(例如以太网帧的头部)。

libpcap是不是真的是通过socket API实现的?如果不是,使用哪个 OS 级别的 API 来实现?

【问题讨论】:

    标签: linux sockets networking network-programming libpcap


    【解决方案1】:

    libpcap 不是套接字 API 的一部分。在 Linux 上使用 PF_PACKET,这是 BSD 机制的演进。在其他操作系统上还有其他机制(DLPI,Windows 需要 DLL)。
    任何接口机制上的捕获都是Linux特有的机制,并且捕获机制发生在网络接口层之上。 内核内部的捕获机制或者有一个对内核数据包过滤器的显式调用,或者通过调整管道 (SVR4) 来插入。

    【讨论】:

      【解决方案2】:

      libpcap是用socket API实现的吗?

      如果您使用的是 Linux 或 IRIX,则可以。如果您使用的是另一种 UN*X,则不是这样。

      如果不是,使用哪个操作系统级别的 API 来实现它?

      在 *BSD、OS X、AIX 和 Solaris 11 及更高版本上:BPF。

      在早期版本的 Solaris 和 HP-UX 上:STREAMS+DLPI。

      在类 Unix 系统中仅使用套接字 API 似乎不可能拦截所有网络流量(来自所有端口)

      在 Linux 上,如果您打开一个 PF_PACKET 套接字,并且不将其绑定到特定接口,则来自所有接口的数据包都会传递到该套接字。

      socket API 似乎无法获取链接层的信息

      您必须使用正确的类型套接字,即Linux上的PF_PACKET套接字或IRIX上带有RAWPROTO_SNOOP协议的PF_RAW套接字。其他 UN*X 没有用于抓包的套接字类型,而是使用其他机制。

      【讨论】:

        【解决方案3】:

        在 Linux 上,对 libpcap 所需的原始数据包的访问是使用 PF_PACKET 套接字完成的。

        见http://man7.org/linux/man-pages/man7/packet.7.html

        【讨论】:

          【解决方案4】:

          它是通过将驱动程序插入网络堆栈来实现的。

          【讨论】:

          • 谢谢!但是驱动是怎么插入的呢? Linux 是否提供这样的 API?
          • @Alnitak 在某些系统上就是这样,例如windows,但不在 linux 或大多数 unix 上。
          • 该问题被标记为“linux”,OP 在问题中也谈到了“类 Unix”系统。
          【解决方案5】:

          通常,应用程序使用内核级 TCP 堆栈。通过在用户空间使用您自己的 TCP/IP 堆栈处理实现,您可以绕过内核,而不是使用默认的内核级实现。

          更多阅读 "zero copy networking" vs "kernel bypass"?

          根据 StackOverflow post pcap 也在做内核绕过

          【讨论】:

          • "根据 StackOverflow 后 pcap 也在做内核绕过" 仅在 libpcap 使用内存映射PF_PACKET 套接字的意义上,以便内核将接收到的数据包复制到该缓冲区并且 libpcap 获取来自该缓冲区的数据包,“绕过”从内核缓冲区复制到用户级缓冲区。 (我在该帖子中添加了评论以澄清这一点。)
          猜你喜欢
          • 2013-04-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-25
          • 2017-08-23
          • 2020-05-02
          • 2021-12-03
          相关资源
          最近更新 更多