脂帽用于包捕获。据我所知,它可以从所有的端口捕获网络包。并且可以捕获链路层(如以太网帧)中的包数据。
在我看来,这有点令人困惑,因为仅仅使用类Unix系统中的socket API就不可能拦截所有网络流量(来自所有端口)。此外,socket API似乎无法获取链路层的信息(例如以太网帧的报头)。
libpcap是由socket API实现的吗?如果没有,那么使用哪个OS级别的API来实现它?
发布于 2015-12-04 19:43:28
libpcap是由socket API实现的吗?
如果您在Linux或IRIX上,这是真的。如果你用的是另一种口味的UN*X,那就不是真的。
如果没有,那么使用哪个OS级别的API来实现它?
关于*BSD、OS、AIX和Solaris 11及更高版本: BPF。
关于Solaris的早期版本,以及HP-UX: STREAMS+DLPI。
仅在类Unix系统中使用socket API似乎不可能拦截所有网络流量(来自所有端口)。
在Linux上,如果您打开一个PF_PACKET套接字,并且不将它绑定到特定的接口,则来自所有接口的数据包将被传递到套接字。
socket API似乎无法获取链接层中的信息。
您必须使用正确类型的套接字,即在Linux上使用PF_PACKET套接字,或在IRIX上使用带有RAWPROTO_SNOOP协议的PF_RAW套接字。其他UN*Xe没有套接字类型用于数据包捕获,并使用其他机制。
发布于 2015-12-04 12:20:56
libpcap不是套接字API的一部分。在Linux上使用PF_PACKET,这是BSD机制的一种发展。在其他操作系统上还有其他机制(DLPI,Windows需要DLL)。
任何接口机制上的捕获都是Linux特有的机制,捕获机制发生在网络接口层之上。内核内部的捕获机制要么对内核数据包过滤器进行显式调用,要么通过调整管道(SVR4)插入。
发布于 2015-12-04 10:19:41
在Linux上,使用PF_PACKET套接字访问libpcap所需的原始数据包。
请参阅http://man7.org/linux/man-pages/man7/packet.7.html
https://stackoverflow.com/questions/34085818
复制相似问题