libpcap原理及函数介绍

【数据包捕获技术】libpcap原理 在当前高速网络环境中,如何实时、高效、完整、快速捕获数据包是能否准确分析网络数据的基础和网络安全防护系统的关键技术。目前已经有从硬件/软件/软硬结合多种解决方案被不断的提出,用于提升数据包转发与捕获的性能。 libpcap (Packet Capture Library),即数据包捕获函数库,是 Unix/Linux 平台下的网络数据包捕获函数库。它是一个独立于系统的用户层包捕获的 API 接口,为底层网络监测提供了一个可移植的框架。 libpcap 工作原理 libpcap 主要由两部份组成: 网 阅读详情

转载地址:http://blog.chinaunix.net/uid-21768364-id-3244502.html

最近看的开源代码是有关网络监控的,它使用Libpcap进行抓包,然后处理。为了更好的理解代码的实现过程,我关注了Libpcap的抓包原理,至于详细的实现暂时还没有研究。

1libpcap的工作原理

1.1组成部分

   libpcap主要由两部份组成:网络分接头(Network Tap)和数据过滤器(Packet Filter)。网络分接头从网络设备驱动程序中收集数据拷贝,过滤器决定是否接收该数据包。

1.2过滤算法

   Libpcap利用BSD Packet Filter(BPF)算法对网卡接收到的链路层数据包进行过滤。BPF算法的基本思想是在有BPF监听的网络中,网卡驱动将接收到的数据包复制一份交给BPF过滤器,过滤器根据用户定义的规则决定是否接收此数据包以及需要拷贝该数据包的那些内容,然后将过滤后的数据给与过滤器相关联的上层应用程序。

1.3包捕获机制

   libpcap的包捕获机制就是在数据链路层加一个旁路处理。当一个数据包到达网络接口时,libpcap首先利用已经创建的Socket从链路层驱动程序中获得该数据包的拷贝,再通过Tap函数将数据包发给BPF过滤器。BPF过滤器根据用户已经定义好的过滤规则对数据包进行逐一匹配,匹配成功则放入内核缓冲区,并传递给用户缓冲区,匹配失败则直接丢弃。如果没有设置过滤规则,所有数据包都将放入内核缓冲区,并传递给用户层缓冲区。

 1.4功能

  其功能是通过网卡抓取网络以太网中的数据包。这个库为不同的平台提供了一致的c函数编程接口。libpcap 结构简单,使用方便;它提供了20多个api封装函数,我们利用这些api函数即可完成本网络探测器所需的网络数据包监听功能。

2Libpcap开发库的应用

  • 网络统计软件
  • 入侵检测系统
  • 网络调试
  • 数据包过滤,支持过滤机制BPF

1.3Libpcap开发库使用说明

基于pcap的嗅探器程序的总体架构,其流程如下:

 1)选择嗅探接口:在Linux中,这可能是eth0,而在BSD系统中则可能是xl1等等。也可以用一个字符串来定义这个设备,或者采用pcap提供的接口名来工作。

 2)初始化pcap:告诉pcap对何设备进行嗅探,使用文件句柄进行设备的区分,必须命名该嗅探“会话”,以此使它们各自区别开来。

3)创建规则集合:用于只想嗅探特定的传输,这个过程分为三个相互紧密关联的阶段。规则集合被置于一个字符串内,并且被转换成能被pcap读的格式(因此编译它)。编译实际上就是在程序里调用一个不被外部程序使用的函数。接下来告诉 pcap使用它来过滤出所要的那一个会话。(此步骤可选)

4)进入主体执行循环:在这个阶段内pcap一直工作到它接收了所有我们想要的包为止。每当它收到一个包就调用另一个已经定义好的函数,这个函数可以实现任何要求,它可以剖析所部获的包并给用户打印出结果,它可以将结果保存为一个文件。

5)关闭会话:在嗅探到所需的数据后,关闭会话并结束。

4libpcap的抓包框架

1)获取数据包捕获描述字

函数名称:pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms, char *ebuf)

函数功能:获得用于捕获网络数据包的数据包捕获描述字。

参数说明:device参数为指定打开的网络设备名。snaplen参数定义捕获数据的最大字节数。Promisc 指定是否将网络接口置于混杂模式。to_ms参数指*定超时时间(毫秒)。ebuf参数则仅在pcap_open_live()函数出错返回NULL时用于传递错误消息。

2)打开保存捕获数据包文件

函数名称:pcap_t *pcap_open_offline(char *fname, char *ebuf)

函数功能:打开以前保存捕获数据包的文件,用于读取。

参数说明:fname参数指定打开的文件名。该文件中的数据格式与tcpdump和tcpslice兼容。”-“为标准输入。ebuf参数则仅在pcap_open_offline()函数出错返回NULL时用于传递错误消息。

3)转储数据包

函数名称:pcap_dumper_t *pcap_dump_open(pcap_t *p, char *fname)

函数功能:打开用于保存捕获数据包的文件,用于写入。

参数说明:fname参数为”-“时表示标准输出。出错时返回NULL。p参数为调用pcap_open_offline()      或pcap_open_live()函数后返回的pcap结构指针,即网卡句柄。fname参数指定打开的文件名,存盘的文件名。如果返回NULL,则可调用pcap_geterr()函数获取错误消息。

4)查找网络设备

函数名称:char *pcap_lookupdev(char *errbuf)

函数功能:用于返回可被pcap_open_live()或pcap_lookupnet()函数调用的网络设备名指针。

返回值:如果函数出错,则返回NULL,同时errbuf中存放相关的错误消息。

5)获取网络号和掩码

函数名称:int pcap_lookupnet(char *device, bpf_u_int32 *netp,bpf_u_int32 *maskp, char *errbuf)

函数功能:获得指定网络设备的网络号和掩码。

参数说明:netp参数和maskp参数都是bpf_u_int32指针。

返回值:如果函数出错,则返回-1,同时errbuf中存放相关的错误消息。

6)捕获并处理数据包
       函数名称
:int pcap_dispatch(pcap_t *p, int cnt,pcap_handler callback, u_char *user) 
       函数功能:捕获并处理数据包。 
       参数说明:cnt参数指定函数返回前所处理数据包的最大值。cnt=  -1表示在一个缓冲区中处理所有的数据包。cnt=0表示处理所有数据包,直到产生以下错误之一:读取到EOF;超时读取。callback参数指定一个带有三个参数的回调函数,这三个参数为:一个从pcap_dispatch()函数传递过来的u_char指针,一个pcap_pkthdr结构的指针,和一个数据包大小的u_char指针。
       返回值:如果成功则返回读取到的字节数。读取到EOF时则返回零值。出错时则返回-1,此时可调用pcap_perror()或pcap_geterr()函数获取错误消息。
       7)捕获和处理数据包
       函数名称
:int pcap_loop(pcap_t *p, int cnt,pcap_handler callback, u_char *user) 
       函数功能:功能基本与pcap_dispatch()函数相同,只不过此函数在cnt个数据包被处理或出现错误时才返回,但读取超时不会返回。而如果为pcap_open_live()函数指定了一个非零值的超时设置,然后调用pcap_dispatch()函数,则当超时发生时pcap_dispatch()函数会返回。cnt参数为负值时pcap_loop()函数将始终循环运行,除非出现错误。
       8)输出数据包
      函数名称
:void pcap_dump(u_char *user, struct pcap_pkthdr *h,u_char *sp) 
      函数功能:向调用pcap_dump_open()函数打开的文件输出一个数据包。该函数可作为pcap_dispatch()函数的回调函数。
      参数说明: 参数1: 所建立的文件pcap_dump_open()的返回值,要进行强制转换.;参数2: 数据包特有的内容.;参数 3: 数据包内容指针

9)编译字串至过滤程序

函数名称:int pcap_compile(pcap_t *p, struct bpf_program *fp,char *str, int optimize, bpf_u_int32 netmask) 
       函数功能:将str参数指定的字符串编译到过滤程序中。 
       参数说明:fp是一个bpf_program结构的指针,在pcap_compile()函数中被赋值。optimize参数控制结果代码的优化。netmask参数指定本地网络的网络掩码。

10)指定过滤程序
       函数名称
:int pcap_setfilter(pcap_t *p, struct bpf_program *fp) 
       函数功能:指定一个过滤程序。 
       参数说明:fp参数是bpf_program结构指针,通常取自pcap_compile()函数调用。
       返回值:出错时返回-1;成功时返回0

11)获取下一个数据包
       函数名称
:u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h) 
       函数功能:返回指向下一个数据包的u_char指针

12)获取数据链路层类型
      函数名称:int pcap_datalink(pcap_t *p) 
      函数功能:返回数据链路层类型,例如DLT_EN10MB

13)获取快照参数值
      函数名称
:int pcap_snapshot(pcap_t *p) 
      函数功能:返回pcap_open_live被调用后的snapshot参数值

14)检测字节顺序
     函数名称
:int pcap_is_swapped(pcap_t *p) 
     函数功能:返回当前系统主机字节与被打开文件的字节顺序是否不同

15)获取主版本号
    函数名称
:int pcap_major_version(pcap_t *p) 
    函数功能:返回写入被打开文件所使用的pcap函数的主版本号

16)获取辅版本号
    函数名称
:int pcap_minor_version(pcap_t *p) 
    函数功能:返回写入被打开文件所使用的pcap函数的辅版本号

17)结构赋值
   函数名称
:int pcap_stats(pcap_t *p, struct pcap_stat *ps) 
   函数功能:向pcap_stat结构赋值。成功时返回0。这些数值包括了从开始捕获数据以来至今共捕获到的数据包统计。如果出错或不支持数据包统计,则返回-1,且可调用pcap_perror()或pcap_geterr()函数来获取错误消息。

18)获取打开文件名
    函数名称:FILE *pcap_file(pcap_t *p) 
    函数功能:返回被打开文件的文件名。

19)获取描述字号码
    函数名称
:int pcap_fileno(pcap_t *p) 
    函数功能:返回被打开文件的文件描述字号码。

 20)显示错误消息
    函数名称
:void pcap_perror(pcap_t *p, char *prefix) 
    函数功能:在标准输出设备上显示最后一个pcap库错误消息。以prefix参数指定的字符串为消息头。

网络编程第三方库——libpcap库(接收) 一、主要作用 1、补货各种数据包 eg:网络流量统计 2、过滤网络数据包 eg:过滤掉本地的一些数据,类似防火墙 3、分析网络数据包 eg:分析网络协议,数据的采集 4、存储网络数据包 eg:保存补货的数据以为将来进行分析 二、ubuntu安装指令 sudo apt-get install libpcap-dev 三、使用libcap库的开发步骤 ①打开网络设备 ②设备过滤规则(可选) ③捕获数据 ④关闭网络设备 头文件:#include <pcap.h> 编译时需要加上: -lpcap 四、 阅读详情

相关推荐

libpcap详解

libpcap(packet capture library),即数据包捕获函数库,是Unix/Linux平台下的网络数据包捕获函数库。它是一个独立于系统的用户层的包捕获API接口,为底层网络监测提供了一个可移植的框架。 一、工作原理 libpcap主要由两部分组成:网络分接头(network tap)和数据过滤器(packet filter)。网络分接头从网络设备驱动程序中收集数据进行拷贝,过滤器决定是否接收该数据包。libpcap利用BSD packet filter(BPF)算法对网卡接收到的链路层数

kking_edc的博客 8614

监听WebMail发信交互过程

该实验是了监听WebMail发信交互过程,所以程序要完成的工作是抓取客户端和mail服务器交互的数据包,并从原始数据包中取出有效数据,这些数据具体包括用户名、密码、收件人、发件人、邮件内容。 Libnids(Library Network Intusion Detection System)网络入侵检测开发包,基于libpcap和libnet开发,是仿照linux内核中的TCP/IP协议部分而实现的。由于Libnids支持TCP数据流的重组,所以我选择LIbnids做开发。 本次实验中,我完成了对邮件发送过程的监听。我学会了如何使用Libnids进行捕包,并且由于Libnids对TCP流重组有很好的支持。 实验内容:监听WebMail发信交互过程。 哈工大信息内容安全实验报告。

linux 下 tcpdump 详解 前篇(libpcap库源码分析)

一 概述 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。 至于tcpdump参数如何使用,这不是本章讨论的重点。 liunx系统抓包工具,毫无疑问就是tcpdump。而windows的抓包工具,wireshark也是一款主流的抓包工具。wireshark 使用了winpcap库。tcpdump...

bie_niu1992的专栏 2065

Libpcap抓包原理

最近看的开源代码是有关网络监控的,它使用Libpcap进行抓包,然后处理。为了更好的理解代码的实现过程,我关注了Libpcap的抓包原理,至于详细的实现暂时还没有研究。 1libpcap的工作原理 1.1组成部分    libpcap主要由两部份组成:网络分接头(Network Tap)和数据过滤器(Packet Filter)。网络分接头从网络设备驱动程序中收集数据拷贝,过滤器决定是否接收

jlccwss的专栏 1368

libpcap抓包的原理是什么?

libpcap是一个开源库,用于捕获计算机网络上的数据包。它是网络数据包捕获的事实标准,并被许多工具使用,包括Wireshark和Tcpdump。

willluckysmile的博客 819

libpcap源码分析

今天刚好在写总结,就将之前分析的libpcap文档与大家分享一下。 百度文库的地址:http://wenku.baidu.com/view/1a8fc4baa26925c52cc5bff2#  其中有部分是参考网上资料。 1、Libpcap介绍 Libpcap是Packet Capture Library的英文缩写,即数据包捕获函数库。该库提供的C函数接口用于捕获及格过指定

yl_bean的专栏 5105

利用libpcap捕获DPDK网络包

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

cxz825的博客 2727

Linux下使用Qt + libpcap

Libpcap是的英文缩写,即数据包捕获函数库。该库提供的C函数接口用于捕捉经过指定网络接口的数据包,该接口应该是被设为混杂模式。这个在原始套接子中有提到。著名的软件TCPDUMP就是在Libpcap的基础上开发而成的。Libpcap提供的接口函数实现和封装了与数据包截获有关的过程。Libpcap提供了用户级别的网络数据包捕获接口,并充分考虑到应用程序的可移植性。Libpcap可以在绝大多数Linux平台上运行。Wincap。它的工作在上层应用程序与网络接口之间。数据包捕获:捕获流经网卡的原始数据包。

贝勒里恩的博客 2085

libpcap抓包原理

libpcap数据包捕获函数库,是Unix/Linux平台下的网络数据包捕获函数库。它是一个独立于系统的用户层包捕获的API接口,为底层网络监测提供了一个可移植的框架。 Library),即数据包捕获函数库,是Unix/Linux平台下的网络数据包捕获函数库。它是一个独立于系统的用户层包捕获的API接口,为底层网络监测提供了一个可移植的框架。 一、        libpc

Jingle的专栏 6065

libpcap实现机制及接口函数

1.Libpcap 的工作原理 Libpcap的工作原理可以描述为,当一个数据包到达网卡时,通过网络分接口(即旁路机制)将数据包发给BPF过滤器,匹配通过的数据包可以被libpcap利用创建的套接字PF_PACKET从链路层驱动程序中获得。进而在用户空间提供独立于系统的用户级API接口。 流程图示意图 一个数据包的捕捉分为三个主要部分 面向底层包捕获、 面向中间层的数据包过滤...

whatday的专栏 2002

Libpcap和Qt的安装及数据包抓包、过滤、保存

是unix/linux平台下的网络数据包捕获函数包,大多数网络监控软件都以它为基础。Libpcap可以在绝大多数类unix平台下工作。Libpcap是一个网络数据包捕获函数库,功能非常强大,Linux下著名的tcpdump就是以它为基础的。

m0_62022097的博客 4076

libpcap介绍(一)

Libpcap是Packet Capture Libray的英文缩写,即数据包捕获开源的C函数库,用于捕获网卡数据或分析pcap格式的抓包报文。Tcpdump和wireshark均是以此为基础的。主要功能有:网络报文抓取;网络报文的构建;抓包文件的分析;自定义BFP过滤。

木牛的博客 1743

libpcap使用简解

libpcap的简单实用案例以及工作原理浅析

勿忘初心,方得始终 6424

【转】libpcap实现机制及接口函数

转自:libpcap实现机制及接口函数 - 简书 1.Libpcap 的工作原理 Libpcap的工作原理可以描述为,当一个数据包到达网卡时,通过网络分接口(即旁路机制)将数据包发给BPF过滤器,匹配通过的数据包可以被libpcap利用创建的套接字PF_PACKET从链路层驱动程序中获得。进而在用户空间提供独立于系统的用户级API接口。 流程图示意图 一个数据包的捕捉分为三个主要部分 面向底层包捕获、 面向中间层的数据包过滤 面向应用层的用户接口 这与Linux操作系统对.

sinolover的专栏 1048

libpcap介绍

libpcap(Packet Capture Library),即数据包捕获函数库,是Unix/Linux平台下的网络数据包捕获函数库。它是一个独立于系统的用户层包捕获的API接口,为底层网络监测提供了一个可移植的框架。 一、libpcap工作原理 libpcap主要由两部份组成:网络分接头(Network Tap)和数据过滤器(Packet Filter)。网络分接头从网络设备驱动程序中收集数据拷贝,过滤器决定是否接收该数据包。Libpcap利用BSD Packet F...

zgjxhgh的专栏 521

网络数据包捕获函数Libpcap安装与使用(非常强大)

1.Libpcap简介   Libpcap是Packet Capture Libray的英文缩写,即数据包捕获函数库。该库提供的C函数接口用于捕捉经过指定网络接口的数据包,该接口应该是被设为混杂模式。这个在原始套接子中有提到。   著名的软件TCPDUMP就是在Libpcap的基础上开发而成的。Libpcap提供的接口函数实现和封装了与数据包截获有关的过程。   Libpcap提供了用户级别...

weixin_34400525的博客 3888

Libpcap开发库的使用(最全指南!)(包含实操)

这与Linux操作系统对数据包的处理流程是相同的(网卡->网卡驱动->数据链路层->IP层->传输层->应用程序)。包捕获机制是在数据链路层增加一个旁路处理(并不干扰系统自身的网络协议栈的处理),对发送和接收的数据包通过Linux内核做过滤和缓冲处理,最后直接传递给上层应用程序。作为捕捉网络数据包的库,它是一个独立于系统的用户级的API接口,为底层网络检测提供了一个可移植的框架。可以看到,过滤器表达式的具体内容取决于你想要捕获的数据包的特定条件。3. 允许用户输入过滤器,根据过滤器过滤特定的数据包。

weixin_73727639的博客 1万+
上一篇: syslog-ng简介
下一篇: tcpdump命令简介
fraser
博客等级 码龄17年 9粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值