前几篇文章分析和改写了libpcap编程的源代码,对libpcap有了一个初步的大致的了解。为了坚持一贯的理论与实际相结合的原则,这篇博文将进行一些理论性的总结和描述。
网络数据包捕获技术
操作系统提供的捕获机制主要有三种:SOCK_PACKET类型接口、DLPI、BPF。这里对这三种捕获技术简单介绍。
SOCK_PACKET:Linux套接字类型中提供的一种SOCK_PACKET套接字类型,该类型的socket可以接收网络上所有数据包(需要设置接受模式)、该方式的实现需要由操作系统提供的编程接口。
DLPI:数据链路提供者接口,定义了数据链路层向上层网络层提供的服务,是数据链路服务的提供者和使用者之间的接口,实现上基于UNIX的流机制。
BPF:伯克利数据包过滤器,高效的数据包捕获机制,工作于操作系统内核层。由两个部分构成:网络转发部分和数据包过滤部分。Libpcap就是使用的该机制。
总结:基于BSD系统使用BPF,基于SRV4的系统使用DLPI。效率上BPD高于DLPI,更高于SOCK_PACKET。Libpcap为实现网络数据包捕获技术的代表,且是一个跨平台的网络数据包捕获开发包。Windos平台也有Libcap兼容的Winpcap。
针对协议的分析主要分为三个层次:捕获数据包、过滤数据包、分析数据包。
Libpcap使用、原理介绍
针对libpcap的相关历史和发展这里不再一一总结,重点总结技术相关部分。
安装: 在Ubuntu系统下使用:sudo apt-get install libpcap-dev
另外也可以在网上下载源代码安装。(具体安装细节可以参考REDME)
Libpcap组成:
1 BPF捕获机制
BPF是一种高效的数据包捕获机制,主要由两个部分组成:网络转发、数据包过滤。网络转发从链路层中捕获数据包。并将其转发给数据包过滤部分;数据包过滤部分从接收到的数据包中接收过滤规则决定的数据包,其他的则抛弃。其整体架构如下: