libpcap是否由socket API实现?

时间:2015-12-04 10:10:29

标签: linux sockets networking network-programming libpcap

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

这对我来说有点混乱,因为在类Unix系统中使用套接字API似乎无法拦截所有网络流量(来自所有端口)。而且,套接字API似乎无法获取链路层中的信息(例如以太网帧的标头)。

libpcap是否由套接字API实现?如果没有,使用哪个OS级别的API来实现它?

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

  

libpcap是否由套接字API实现?

如果您使用的是Linux或IRIX,则确实如此。如果你是另一种UN * X,那就不是了。

  

如果没有,使用哪个操作系统级API来实现它?

On * BSD,OS X,AIX和Solaris 11及更高版本:BPF。

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

  

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

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

  

套接字API似乎无法获取链接层中的信息

您必须使用正确的类型套接字,即Linux上的PF_PACKET套接字或IRIX上具有RAWPROTO_SNOOP协议的PF_RAW套接字。其他UN * Xes没有用于数据包捕获的套接字类型,并使用其他机制。

答案 2 :(得分:1)

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

请参阅http://man7.org/linux/man-pages/man7/packet.7.html

答案 3 :(得分:0)

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