Libpcap编程(5)理论总结
来源:互联网 发布:手机保密软件 编辑:程序博客网 时间:2024/05/01 19:18
前几篇文章分析和改写了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是一种高效的数据包捕获机制,主要由两个部分组成:网络转发、数据包过滤。网络转发从链路层中捕获数据包。并将其转发给数据包过滤部分;数据包过滤部分从接收到的数据包中接收过滤规则决定的数据包,其他的则抛弃。其整体架构如下:
图一 BPF架构
2 过滤规则
只要是Libpcap开发包开发的应用程序,都使用BPF过滤规则。BPF过滤规则是一个字符串。定义形式有一定的规律性。主要由两类数据组成:标识、修饰词,修饰词有三种:类型、方向、协议。
类型修饰词三种:host(主机类型)、net(网络类型)、port(端口类型)
方向修饰词标识数据的传输方向四种:src(源地址)、dst(目的地址)、src or dst(无方向)、src and dst(源地址和目的地址都要满足)
协议:ether、fddi、ip、arp、rarp……
3 网卡设置
Libpcap网卡的设置两种状态:混杂(接收所有数据包)、非混杂。网卡类型的设置在pcap_open_live中进行。
Libpcap关键数据结构
pcap:该结构为核心数据结构:
该结构位于 pcap-int.h头文件中,其中定义了很多内容,详细了解可以参考头文件,这里需要注意一个定义的数据类型:typedef struct pcap pcap_t,且该结构为Libpcap的句柄数据结构,在内部实现中需要使用,程序不会直接与其直接打交道。
pcap_file_header:该结构表示一个Libpcap存储文件类型。不同的Libpcap存储形式使用不同的存储文件类型,该结构表示如下:
122 struct pcap_file_header {
123 bpf_u_int32 magic;
124 u_short version_major;
125 u_short version_minor;
126 bpf_int32 thiszone; /* gmt to local correction */
127 bpf_u_int32 sigfigs; /* accuracy of timestamps */
128 bpf_u_int32 snaplen; /* max length saved portion of each pkt */
129 bpf_u_int32 linktype; /* data link type (LINKTYPE_*) */
130 };
pcap_pkthdr:描述每个捕获到的数据包基本信息。
160 struct pcap_pkthdr {
161 struct timeval ts; /* time stamp */
162 bpf_u_int32 caplen; /* length of portion present */
163 bpf_u_int32 len; /* length this packet (off wire) */
164 };
pcap_stat:描述Libpcap的状态信息
169 struct pcap_stat {
170 u_int ps_recv; /* number of packets received */
171 u_int ps_drop; /* number of packets dropped */
172 u_int ps_ifdrop; /* drops by interface -- only supported on some platforms */
173 #ifdef WIN32
174 u_int bs_capt; /* number of packets that reach the application */
175 #endif /* WIN32 */
176 };
pcap_if:该结构描述一个网络接口,实际上为网络接口链表中一个结点。
214 struct pcap_if {
215 struct pcap_if *next;
216 char *name; /* name to hand to "pcap_open_live()" */
217 char *description; /* textual description of interface, or NULL */
218 struct pcap_addr *addresses;
219 bpf_u_int32 flags; /* PCAP_IF_ interface flags */
220 };
pcap_addr:描述网络接口的地址。
229 struct pcap_addr {
230 struct pcap_addr *next;
231 struct sockaddr *addr; /* address */
232 struct sockaddr *netmask; /* netmask for that address */
233 struct sockaddr *broadaddr; /* broadcast address for that address */
234 struct sockaddr *dstaddr; /* P2P destination address for that address */
235 };
函数
1 接口函数
int pcap_findalldevs(pcap_if_t **, char *);//查找主机内所有可用的网络接口,使用网络接口链表返回
void pcap_freealldevs(pcap_if_t *);//释放网络接口链表中的所有接口
char *pcap_lookupdev(char *);//获得本机可用网络接口
int pcap_lookupnet(const char *, bpf_u_int32 *, bpf_u_int32 *, char *);//获取网络地址和掩码
pcap_t *pcap_open_live(const char *, int, int, int, char *);//打开一个网络接口进行数据包捕获,可以设置混杂模式和非混杂模式
2 规则函数
int pcap_setfilter(pcap_t *, struct bpf_program *);//规则设置哈数,设置BPF过滤规则
int pcap_compile(pcap_t *, struct bpf_program *, const char *, int, bpf_u_int32);//编译BPF过滤规则
int pcap_compile(pcap_t *, struct bpf_program *, const char *, int, bpf_u_int32);//与上个函数一样编译过滤规则
void pcap_freecode(struct bpf_program *);//释放过滤规则内存
3 数据包捕获函数
int pcap_loop(pcap_t *, int, pcap_handler, u_char *);//循环捕获网络数据包
int pcap_dispatch(pcap_t *, int, pcap_handler, u_char *);
const u_char* pcap_next(pcap_t *, struct pcap_pkthdr *);//捕获网络数据包
4 文件函数
5 辅助函数
6 错误处理函数
其他几部分的内容在后期编程中会进一步说明。相关内容可以参考具体头文件。
接下来的编程在前面的基础上,结合着这部分的总结进一步分析……
- Libpcap编程(5)理论总结
- libpcap 编程二(libpcap函数库介绍)
- libpcap编程(1)
- Libpcap编程(6)
- libpcap编程
- Libpcap 总结
- libpcap编程(7)最后一篇
- pcap_sf结构(libpcap使用总结)
- pcap_sf结构(libpcap使用总结)
- libpcap 编程入门资源
- libpcap编程--流量统计。。
- libpcap 编程入门资源
- libpcap编程入门资源
- libpcap编程:Sniffer
- libpcap编程<4>
- Libpcap使用总结
- Libpcap使用总结
- Libpcap使用总结
- win7 QT 安装 + 使用
- Python开发简单爬虫
- 经典面试题:HTTP协议理解
- 关于mssql中精确精准的字段类型推荐使用numeric
- Rest服务开发指南—常用注解说明
- Libpcap编程(5)理论总结
- LeetCode练习-动态规划算法(一)
- redis配置认证密码
- NYOJ
- SimpleDateFormat日期格式转换
- C#控制条码打印机 纸张大小,间距,绘制内容(所有条码打印机通用)
- 一篇文章帮你彻底了解 Swift 3.1 的新内容
- poj2785 4 Values whose Sum is 0
- 一起做RGB-D SLAM (1)