libpcap
- 格式:ppt
- 大小:61.00 KB
- 文档页数:13


第五章基于libpcap的网络编程技术5. 1常见的包捕获机制简介包捕获就是利用以太网的介质共享的特性,通过将网络适配器设置为混杂模式的方法,接收到所有网络上的以太网帧。
包捕获的机制大致可以分为两类:一类是由操作系统内核提供的捕获机制。
另一类是由应用软件或系统开发包捕获驱动程序提供的捕获机制。
常见的包捕获机制如表5-1所示。
其中最主要的是下列4种:BPF ( Berkeley Packet Filter )DLPI ( Data Link Provider In terface )NIT ( Network In terface Tap ) SOCK-PACKET 类型套接口。
BPF由基于BSD的Unix系统内核所实现。
DLPI是Solaris (和其他System V UNIX ) 系统的内嵌子系统。
NIT是SUN OS4 系统的一部分,但在Solaris /SUN OS5 中被DLPI 所取代。
Linux核心则实现了SOCK-PACKET 的包捕获机制。
从性能上看,BPF比DLPI 和NIT 好得多,SOCK-PACKET 最弱。
表5-1常用的包捕获机制由于现在很多局域网为NT网,其网络传输方式大多采用以太网标准,所以涉及的编程也是在Windows 环境下实现的。
Windows 操作系统没有提供包捕获机制,只提供了数量很少并且功能有限的API调用。
在Windows 环境下由于其自身的封装性,很难对其底层进行编程。
本章将对BSD系列的libpcap进行深入地介绍。
5.2 Libpcap 与 BPF(1) libpcap 概述libpcap(Packet Capturelibrary),即数据包捕获函数库。
该库提供的 C 函数接口可用于捕获经过网络接口 (只要经过该接口,目标地址不一定为本机)的数据包。
它是由洛仑兹 伯克利试验室的研究人员 Steven McCanne 和Van Jacobson 于1993 年在Usenix'93 会议上正式提出的一种用于 Unix 内核数据包过滤体制。
libpcap函数1)ioctl函数定义ioctl()函数非常庞杂,它可以控制各种文件的属性。
ioctl函数原型为:int ioctl(int handle,int cmd[,int *argdx,int argcx]);2)socket函数定义常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据包式Socket(SOCK_DGRAM)。
流式是一种面向连接的Socket,针对面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,针对无连接的UDP服务应用。
Socket函数原型为:int socket(int domain, int type,int protocol);3)recvfrom()函数定义用recvfrom()函数来实现接收数据包,recvfrom()是具备“阻塞式I/O”特性的函数,能够在没有数据包到达的情况下暂时挂起等待,直至接收到数据包后,再激活转入下一步处理。
recvfrom()函数的原型为:int recvfrom(SOCKET s,char FAR *buf,int len,int flags,structsockaddr FAR *from,int *fromlen);本函数从已连接套接口上接收数据,并捕获数据发送源的地址。
对于SOCK_STREAM类型的套接口,最多可以接收缓冲区大小个数据。
如果套接口被设置为线内接收带外数据(选项为 SO_OOBINLINE),且有带外数据未读入,则返回带外数据。
应用程序可通过调用ioctlsocket()的SOCATMARK命令来确定是否有带外数据待读入。
对于SOCK_STREAM类型套接口,忽略from和fromlen参数。
因为面向连接的话不用再指定地址了。
4)一些“字节顺序”转换函数因为网络和主机采用的存储字节时内存顺序安排方式的差异,就存在“字节顺序”的问题。
在网络环境下存储时,高位字节存放在内存的起始位置,而低字节则存放在较高的位置。
libpcap主要函数及过程详解/uid-21556133-id-120228.htmllibpcap(Packet Capture Library),即数据包捕获函数库,是Unix/Linux平台下的⽹络数据包捕获函数库。
它是⼀个独⽴于系统的⽤户层包捕获的API接⼝,为底层⽹络监测提供了⼀个可移植的框架。
⼀、libpcap⼯作原理libpcap主要由两部份组成:⽹络分接头(Network Tap)和数据过滤器(Packet Filter)。
⽹络分接头从⽹络设备驱动程序中收集数据拷贝,过滤器决定是否接收该数据包。
Libpcap利⽤BSD Packet Filter(BPF)算法对⽹卡接收到的链路层数据包进⾏过滤。
BPF算法的基本思想是在有BPF监听的⽹络中,⽹卡驱动将接收到的数据包复制⼀份交给BPF过滤器,过滤器根据⽤户定义的规则决定是否接收此数据包以及需要拷贝该数据包的那些内容,然后将过滤后的数据给与过滤器相关联的上层应⽤程序。
libpcap的包捕获机制就是在数据链路层加⼀个旁路处理。
当⼀个数据包到达⽹络接⼝时,libpcap⾸先利⽤已经创建的Socket从链路层驱动程序中获得该数据包的拷贝,再通过Tap函数将数据包发给BPF过滤器。
BPF过滤器根据⽤户已经定义好的过滤规则对数据包进⾏逐⼀匹配,匹配成功则放⼊内核缓冲区,并传递给⽤户缓冲区,匹配失败则直接丢弃。
如果没有设置过滤规则,所有数据包都将放⼊内核缓冲区,并传递给⽤户层缓冲区。
⼆、libpcap的抓包框架pcap_lookupdev()函数⽤于查找⽹络设备,返回可被pcap_open_live()函数调⽤的⽹络设备名指针。
pcap_open_live()函数⽤于打开⽹络设备,并且返回⽤于捕获⽹络数据包的数据包捕获描述字。
对于此⽹络设备的操作都要基于此⽹络设备描述字。
pcap_lookupnet()函数获得指定⽹络设备的⽹络号和掩码。
pcap_compile()函数⽤于将⽤户制定的过滤策略编译到过滤程序中。