资源描述:
《基于libpcap捕获数据包的开发》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、在对数据进行捕获时,主要有两种方法:1.主要借助原始套接字Socket,套接字是网络应用编程接门,应用程序可以使用它进行网络通信发送和接收网络层以上的原始数据包,而对底层的细节是透明的.2.使用系统抓包库Libpcap和Winpcap,通过数据链路层获取以太帧,可以从网卡捕获或者发送原始数据同时能过滤及存储数据包.这种方式的捕获是工作在网络底层数据链路层,能拦截所有正在网络上传送的数据包,并且可以通过相应的处理,从而实时的分析数据包的内容,使用数据包捕获函数來获得底层数据。2.1Libpcap方法开发的过程釆用Libpcap捕获网络数据铋
2、的开发过程.主程序的流程如下图所示:捕获网络数据包过程按以下步骤进行,程序开发过程中主要语句的实现:char*dev,errbuf[PCAP-ERRBUFSIZE];//定义接口设备名和缓冲区的大小pcap-tp;//捕获数据包句柄,非常重要的数据结构intsnaplen=65535;//代表用户期望的捕获数据包最大长度inttimcout=1000;//代表函数超时返回的时间(1)进行本地网络设置检测,获得网络接口设备.调用函数dev=pcap-lookupdev(errbuf).Linux中最常见的接口设备名ethO和lo,而ethO
3、对应了实际的网卡,数据的传输都要经过ethO.(2)设备找到后,打幵以准备捕获数据包.调用的主函数是口=pcap-open-live(dev,snaplen,1,timeout,errbuf),根据给定的接口设备名dev,获得一个结构为pcap-t的捕获句柄p,函数屮的1代表设置接门为混杂模式.(3)若用户设置了过滤条件,则编译和安装过滤代码.编译过滤规则调用函数pcap-compile(p,&filter,filter-app,0,net),函数将规则字符串转化为内核过滤程序.根据过滤规则设置过滤器pcap-setfilter(p,&f
4、ilter)传给BPF,由BPF过滤器捕获用户所需要的数据包.(4)反复捕获数据包.调用pcap-loop(p,ent,packet-print,NULL)进入循环捕获,对捕获的数据处理放在回调函数(如packet-print())中进行.(5)关闭设备.调用pcap-close(p),将打开设备时得到的结构为pcap-t的捕获句柄,作为参数传入.2.2对数据包处理的回调函数的开发过程在实现对捕获的数据处理的回调函数packet-print()中,具体分析的流程如图所示:捕获网络数据包函数屮主要语句的实现://对以太头部进行分析,判断所包
5、含的数据包类型,做进一步的处理//对捕获的数据进行类型转换,转化成以太数据类型eth=(structether-header氺)p;//若以太帧的协议类型为TCP/IPif(eth->ether-type==ntohs(ET11ERTYPE-IP)){…//获取IP头信息iph=(structip本)(p+sizeof(structethcrheader));•參.//判断上层协议是否为TCP协议if(iph_>ip-p==6){…//获取TCP头信息tcph=(structtcphdr本)(p+sizeof(structether-he
6、ader)+4氺iph->ip-hl)//TCP包内容的长度tcplength=ntohs(iph~>ip-len)-4氺iph~>ip-hl-4*tcph->doff;//TCP包的数据内容data=(u-char*)(p+sizeof(structetherheader)+4*iph->ip-hl+4*tcph->doff);•••//申请一长度为tcplength字符串变量tcpdata=(u-char本)malloc(tcplength);//把TCP内容拷贝到tcpdata变量中memcpy(tcpdata,data,tcple
7、ngth);…}-}if(eth->ether-type==ntohs(ETHERTYPE-ARP))由于在以太帧首部含有协议类型字段,所以可进一步实现上层协议包的首部提取.对IP报头首部提取,从中可获取源和目的地址;对TCP报文段首部提取,从屮可获取源和目的端门号;若想获取数据包的更多内容,可继续分析上层协议,做进一步处理.至此完成了捕获网络数据包工具的开发工作.文章编号:1004-9762(2007)02-0152-05Linux系统屮基于PF_RTNG套接字的高性能捕获技术顾瑞春,谭跃生,贾元春,王静宇(内蒙古科技大学网络屮心内蒙古
8、包头014010)关键词:数据包捕获;设备轮询;环形缓冲区;PF_RTNG套接字中图分类号:TP393文献标识号:A摘耍:介绍一种新型的数据包捕获方式111基于PF_RING套接字的数据包捕获