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 错误处理函数

其他几部分的内容在后期编程中会进一步说明。相关内容可以参考具体头文件。

接下来的编程在前面的基础上,结合着这部分的总结进一步分析……




0 0
原创粉丝点击