版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第五章 基于Libpcap的网络编程技术,2,内容,包捕获和过滤机制 Libpcap与BPF Libpcap的应用,3,一、包捕获和过滤机制,包捕获机制 包捕获就是利用以太网的介质共享的特性,通过将网络适配器设置为混杂模式的方法,接收到所有网络上的以太网帧。 包捕获机制可分为两类。 操作系统内核提供的捕获机制 应用软件或系统开发包捕获驱动程序提供的捕获机制,4,常见的包捕获机制 BPF DLPI NIT SOCK-PACKET类型套接口,5,包过滤机制 大量网络监控程序目的不同,期望的数据包类型也不同,但大多数情况只需要其中一小部分。此时用户程序需要设置一系列过滤条件,以便获得满足条件的数据包
2、。 包过滤操作可在用户空间执行,也可在内核空间执行,但由于数据包从内核空间拷贝到用户空间的开销很大,所以一般在内核空间进行过滤。 包过滤机制在包捕获机制中占中心地位,有捕获数据包必然有过滤操作。,6,包过滤机制实际上是针对数据包的布尔值操作函数,如果函数最终返回 true,则通过过滤,反之则被丢弃。形式上包过滤由一个或多个谓词判断的并操作(AND)和或操作(OR)构成,每一个谓词判断基本上对应了数据包的协议类型或某个特定值,例如,只需要 TCP 类型且目的端口为 110 的数据包。,7,一个完整的包捕获和过滤机制包含三个主要部分: 最底层是特定操作系统的包捕获机制 中间是包过滤机制 最高层是针
3、对用户程序的接口,8,二、Libpcap与BPF,Libpcap概述 Libpcap (Packet Capture library)即数据包捕获函数库,可以工作在绝大多数类unix平台下。该库提供的C函数接口可用于捕获经过网络接口的数据包。 广泛应用于:网络参数统计、协议分析、防火墙、入侵检测系统、网络调试等方面。,9,Libpcap 软件包可从/下载,Libpcap 包含 20 多个 C 文件,但在 Linux 系统下不是所有文件都用到。 Libpcap库是基于BPF(Berkeley Packet Filter) 的。在BPF的基础上,Libpc
4、ap提供接口函数供其他程序调用,可以捕获、分析和过滤数据包,以获得感兴趣的数据包。,10,BPF结构及工作原理 BPF是一种内核包捕获的体系结构,于 1992 年被设计出来,其设计目的主要是解决当时已存在的过滤机制效率低下的问题。它使得UNIX下的应用程序通过一个高度优化的方法读取流经网络适配器的数据包。 BPF主要由两部分组成:Network tap和Packet Filter。,11,Network tap是一个回调函数(callback function),它实时监视共享网络中的所有数据包,从网络设备驱动程序中搜集数据拷贝并转发给包过滤器。 Packet Filter决定是否接收该数据包
5、,以及接收该数据包的哪些部分。,12,当有数据包到达网络接口卡时,如果BPF在监听,那么网卡驱动程序将首先调用BPF的Network Tap,Network Tap将数据包送到过滤器中,决定是否接收此数据包和接收多少位数据,然后将决定接收的数据拷贝到BPF的相关缓冲区中,最终应用程序调用相应的libpcap函数拷走所需数据。,BPF的工作过程,13,BPF的结构,14,三、Libpcap的应用,Libpcap库函数 libpcap所提供的主要函数如下: pcap_t *pcap_open_live():用于获取一个包捕获描述符 int pcap_lookupnet():用于返回与网络设备相关的
6、网络号和掩码 char *pcap_lookupdev():返回一个适于pcap_open_live()和pcap_lookupnet()函数使用的指向网络设备的指针,Libpcap函数库的应用,16,1、检查网络设备 Libpcap 程序的第一步通常是在系统中找到合适的网络接口设备。在Linux 中最常见的接口设备名 eth0 和 lo。 Libpcap 调用 pcap_lookupdev() 函数获得可用网络接口的设备名。 char *pcap_lookupdev(char *errbuf),该函数用于返回可被pcap_open_live()或pcap_lookupnet()函数调用的网络
7、设备名(一个字符串指针)。如果函数出错,则返回NULL,同时errbuf中存放相关的错误消息。,17,检查网络设备中主要使用到的函数关系,18,首先利用函数 getifaddrs() 获得所有网络接口的地址,以及对应的网络掩码、广播地址、目标地址等相关信息,再利用 add_addr_to_iflist()、add_or_find_if()、get_instance() 把网络接口的信息增加到结构链表 pcap_if 中,最后从链表中提取第一个接口作为捕获设备。,19,/*libpcap自定义的接口信息链表*/ struct pcap_if struct pcap_if *next; char
8、*name; /* 接口设备名 */ char *description; /* 接口描述 */ /*接口的 IP 地址, 地址掩码, 广播地址,目的地址 */ struct pcap_addr addresses; bpf_u_int32 flags; /* 接口的参数 */ ;,20,2、打开网络设备 当设备找到后,下一步工作就是打开设备以准备捕获数据包。打开网络设备的主函数是 pcap_open_live(),其任务就是通过给定的接口设备名,获得一个捕获句柄。,21,pcap_t *pcap_open_live(char *device, int snaplen,int promisc,
9、 int to_ms,char *ebuf) 参数说明: device:为指定打开的网络设备名。 snaplen:定义捕获数据的最大字节数。 promisc:指定是否将网络接口置于混杂模式,1混杂模式,0正常模式; to_ms:指定超时时间(毫秒)。 ebuf:仅在pcap_open_live()函数出错返回NULL时用于传递错误消息。,22,3、获取网络号和掩码 int pcap_lookupnet(char *device, bpf_u_int32 *netp,bpf_u_int32 *maskp, char *errbuf) 获得指定网络设备的网络号和掩码。netp参数和maskp参数都
10、是bpf_u_int32指针。如果函数出错,则返回-1,同时errbuf中存放相关的错误消息。,23,4、编译和设置过滤器 int pcap_compile(pcap_t *p, struct bpf_program *fp,char *str, int optimize, bpf_u_int32 netmask) 该函数用于解析过滤规则串,填写bpf_program结构,将str参数指定的字符串编译到过滤程序中。fp是一个bpf_program结构的指针,在pcap_compile()函数中被赋值。optimize参数控制结果代码的优化。netmask参数指定本地网络的子网掩码。,24,in
11、t pcap_setfilter(pcap_t *p, struct bpf_program *fp) 该函数用于设置由pcap_compile()函数解析完毕的过滤规则。 fp参数是bpf_program结构指针,通常取自pcap_compile()函数调用。出错时返回-1;成功时返回0。,25,5、捕获数据包 int pcap_dispatch(pcap_t *p, int cnt,pcap_handler callback, u_char *user) 该函数用于捕捉报文、分发报文到预先指定好的处理函数。 参数说明: cnt参数指定函数返回前所处理数据包的最大值。cnt=-1表示处理一个
12、缓冲区中所有的数据包。cnt=0表示仅当产生以下错误之一才停止处理并返回:发生错误;读到EOF;读超时。,26,callback参数指定一个带有三个参数的回调函数,回调函数为:typedef void ( *pcap_handler ) ( u_char *agrs, const struct pcap_pkthdr *header, const u_char *packet ); 其中agrs是从pcap_dispatch()函数传递过来的指针 ,一般总是NULL;header指向pcap_pkthdr结构,该结构位于真正的物理帧前面,用于消除不同链路层支持的差异;packet指明数据包大小
13、。,27,参数user 为用户传递给回调函数的指针。 如果成功则返回读取到的报文数;如果读取静态文件时碰到EOF则返回零值;出错时则返回-1,此时可调用pcap_perror()或pcap_geterr()函数获取错误消息。,28,int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user) 该函数功能基本与pcap_dispatch()函数相同,只是该函数在cnt个数据包被处理或出现错误时才返回,但读取超时不会返回。 如果为pcap_open_live()函数指定了一个非零值的超时设置,然后调用pcap_disp
14、atch()函数,则当超时发生时pcap_dispatch()函数会返回。而pcap_loop()函数将始终循环运行,除非出现错误。,29,6、关闭 void pcap_close(pcap_t *p) 该函数关闭参数p指向的文件,并释放资源。,30,7、出错处理 Libpcap 的每个函数都有返回值,出错时返回值小于 0。 void pcap_perror(pcap_t *, char *); char *pcap_geterr(pcap_t *); /在pcap_t中有一个成员存放着错误字串 struct pcap . char errbufPCAP_ERRBUF_SIZE; ;,31,8
15、、其他辅助函数 FILE *pcap_file(pcap_t *p):返回被打开文件的文件名。 int pcap_fileno(pcap_t *p):返回被打开文件的文件描述符。 pcap_read():这个函数从包捕获驱动器中读取一组数据包并针对每一个包运行包过滤程序,然后把过滤后的数据送应用程序缓冲器。 pcap_next():循环包捕获。,32,Linux系统下,网络类型为常规以太网,Libpcap 应用的一个简单程序框架。,33,34,35,Libpcap的安装 1、准备 安装前需下载下列文件: 1)libpcap.tar.z 公用函数库: 下载地址: /libpcap.tar.z 2)libnet-1.0.2a.tar.gz底层支持: 下载地址: ,36,2、安装 先检查文件下列文件是否存在,/usr/local/lib/libpcap.a
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年株洲市石峰区网格员招聘笔试模拟试题及答案详解
- 2025-2026学年小鹰学飞教学设计幼儿园
- 2026四川成都市锦江区风华幼儿园招聘员额教师2人考试参考题库及答案详解
- 2025-2026学年木门大门制作教学设计
- 成都市成华区卫健系统所属事业单位2026年公开考核招聘高层次人才岗位调整及专业能力测试相关事项考试参考题库及答案详解
- 2025-2026学年投篮球教案大班
- 2025-2030中国社区团购模式可持续性分析与团长管理优化策略报告
- 2025-2026学年小书桌教学设计
- 四川省矿产资源储量评审中心2026年公开招聘编外专业技术人员笔试模拟试题及答案详解
- 2026中国地质调查局局属单位招聘80人(第三批)考试参考题库及答案详解
- 2025-2026学年门头设计教学课程
- 眼镜制造工程师考试试卷及答案
- 铸造考核细则培训课件
- 河道挡墙钢板桩围堰施工方案
- 前列腺癌诊疗指南(2026版)
- 医院临床路径管理实施及考核评价细则
- 2026 酒店客房布置实训课件
- 2025福州市鼓西街道社区工作者招聘考试真题及答案
- 钢结构施工工期压缩方案
- TGDACM 0174-2026 中医技术操作规范 温通拨筋罐疗法
- 一线三等角形相似课件
评论
0/150
提交评论