基于libpcap捕获数据包的开发
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在对数据进行捕获时, 主要有两种方法: 1. 主要借助原始套接字Socket , 套接字是网络应用编程接口, 应用程序可以使用它进行网络通信发送和接收网络层以上的原始数据包, 而对底层的细节是透明的. 2. 使用系统抓包库Libpcap 和Winpcap, 通过数据链路层获取以太帧, 可以从网卡捕获或者发送原始数据包, 同时能过滤及存储数据包.这种方式的捕获是工作在网络底层数据链路层,能拦截所有正在网络上传送的数据包,并且可以通过相应的处理,从而实时的分析数据包的内容,使用数据包捕获函数来获得底层数据。
2. 1 Libpcap 方法开发的过程
采用Libpcap捕获网络数据包的开发过程. 主程序的流程如下图所示:
捕获网络数据包过程按以下步骤进行, 程序开发过程中主要语句的实现:
char * dev, errbuf [ PCAP- ERRBU FSIZE]
; / / 定义接口设备名和缓冲区的大小
pcap- t p; / / 捕获数据包句柄, 非常重要的数据结构
int snaplen = 65535; / / 代表用户期望的捕获数据包最大长度
int t imeout= 1000; / / 代表函数超时返回的时间
( 1) 进行本地网络设置检测, 获得网络接口设备. 调用函数dev= pcap- lookupdev ( er rbuf ) . Linux中最常见的接口设备名eth0 和lo, 而eth0 对应了实际的网卡, 数据包的传输都要经过eth0.
( 2) 设备找到后, 打开以准备捕获数据包. 调用的主函数是p = pcap- open- live ( dev, snaplen, 1,timeout , errbuf ) , 根据给定的接口设备名dev, 获得一个结构为pcap- t 的捕获句柄p, 函数中的1 代表设置接口为混杂模式. ( 3) 若用户设置了过滤条件, 则编译和安装过
滤代码. 编译过滤规则调用函数pcap- compile( p,&f ilter , f ilter- app, 0, net ) , 函数将规则字符串转化为内核过滤程序. 根据过滤规则设置过滤器pcap- set filter( p, &filter) 传给BPF, 由BPF 过滤器捕获用户所需要的数据包.
( 4) 反复捕获数据包. 调用pcap- loo p( p, cnt ,packet - print , NULL) 进入循环捕获, 对捕获的数据包处理放在回调函数( 如packet - print ( ) ) 中进行.
( 5) 关闭设备. 调用pcap- close ( p) , 将打开设备时得到的结构为pcap- t 的捕获句柄, 作为参数传入.
2. 2 对数据包处理的回调函数的开发过程
在实现对捕获的数据包处理的回调函数packet- print ( ) 中, 具体分析的流程如图所示:
函数中主要语句的实现:
/ / 对以太头部进行分析, 判断所包含的数据包类型, 做进一步的处理/ / 对捕获的数据进行类型转换, 转化成以太数据包类型
eth= ( st ruct ether - header * ) p;
/ / 若以太帧的协议类型为TCP/ IP
if ( eth-> ether - type = = nto hs ( ETHERTYPE-
IP) )
{ ⋯
/ / 获取IP 头信息
iph= ( st ruct ip * ) ( p + sizeof ( st ruct etherheader
) ) ;
⋯
/ / 判断上层协议是否为T CP 协议
if( iph-> ip- p= = 6)
{ ⋯
/ / 获取TCP 头信息
tcph= ( st ruct tcphdr * ) ( p + sizeof ( st ruct
ether- header) + 4 * iph-> ip- hl ) ;
⋯
/ / T CP 包内容的长度
tcplength = ntohs ( iph-> ip- len) -4 * iph->
ip- hl-4* tcph-> doff ;
⋯
/ / T CP 包的数据内容
data= ( u- char * ) ( p+ sizeof ( st ruct etherheader
) + 4* iph-> ip- hl+ 4* tcph-> doff ) ;
⋯
/ / 申请一长度为tcplength 字符串变量
tcpdata= ( u- char * ) malloc( tcpleng th) ;
⋯
/ / 把T CP 内容拷贝到tcpdata 变量中
memcpy ( tcpdata, data, tcplength) ;
⋯}
⋯}
if ( eth-> ether - type = = nto hs ( ETHERTYPE-
ARP) )
⋯
由于在以太帧首部含有协议类型字段, 所以可进一步实现上层协议包的首部提取. 对IP 报头首部提取, 从中可获取源和目的地址; 对T CP 报文段
首部提取, 从中可获取源和目的端口号; 若想获取数据包的更多内容, 可继续分析上层协议, 做进一步处理. 至此完成了捕获网络数据包工具的开发工作
.文章编号:1004-9762(2007) 02- 0152-05
Linux系统中基于PF
_RING套接字的
高性能包捕获技术