您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 房地产 > 网络数据包的获取与libpcap应用
网络数据获取方法1网络信息获取网络信息获取是指通过物理线路接入到实际的网络中,实现获取该网络当前传输的所有信息,即获取当前传输的数据包,并根据信息的源主机、目标主机、服务协议和端口等信息简单过滤掉不关心的垃圾数据,然后提交给上层应用程序进行进一步处理。一、TCP/IP体系结构----------------------------------------------------|SMTP|DNS|HTTP|FTP|TELNET|应用层----------------------------------------------------|TCP|UDP|传输层----------------------------------------------------|IP|ICMP|ARPRARP|网络层---------------------------------------------------|IEEE802以太网SLIP/PPPPDNetc|数据链路层---------------------------------------------------数据包接收过程二、以太网以太网最初是由XEROX公司研制,并且在1980年由数据设备公司DEC(DIGIALEQUIPMENTCORPORATION)、INTEL公司和XEROX公司共同使之规范成形。后来它被作为802.3标准为电气与电子工程师协会(IEEE)所采纳。以太网是最为流行的网络传输系统之一。以太网的基本特征是采用一种称为载波监听多路访问/冲突检测CSMA/CD(CarrierSenseMultipleAccess/CollisionDetection)的共享访问方案。TCP/IP与以太网以太网和TCP/IP可以说是相辅相成的。以太网在一二层提供物理上的连线,使用48位的MAC地址TCP/IP工作在上层,使用32位的IP地址两者间使用ARP和RARP协议进行相互转换。载波监听指在以太网中的每个站点都具有同等的权利,在传输自己的数据时,首先监听信道是否空闲,如果空闲,就传输自己的数据,如果信道被占用,就等待信道空闲。冲突检测为了防止发生两个站点同时监测到网络没有被使用时而产生冲突。以太网采用广播机制,所有与网络连接的工作站都可以看到网络上传递的数据。CSMA/CD过程以太网的广播通讯在以太网中,所有的通讯都是广播的,通常在同一个网段的所有网络接口都可以访问在物理媒体上传输的所有数据网卡的MAC地址每一个网络接口都有一个唯一的硬件地址,这个硬件地址也就是网卡的MAC地址。大多数系统使用48比特的地址,这个地址用来表示网络中的每一个设备一般来说每一块网卡上的MAC地址都是不同的每个网卡厂家得到一段地址,然后用这段地址分配给其生产的每个网卡一个地址。在正常的情况下,网络接口应该只响应这样的两种数据帧:1.与自己硬件地址相匹配的数据帧。2.发向所有机器的广播数据帧。数据的收发是由网卡来完成的网卡接收到传输来的数据,网卡内的单片程序接收数据帧的目的MAC地址,根据计算机上的网卡驱动程序设置的接收模式判断该不该接收。认为该接收就接收后产生中断信号通知CPU认为不该接收就丢掉不管,所以不该接收的数据网卡就截断了,计算机根本就不知道.CPU得到中断信号产生中断,操作系统就根据网卡的驱动程序设置的网卡中断程序地址调用驱动程序接收数据驱动程序接收数据后放入信号堆栈让操作系统处理。网卡来说一般有四种接收模式:①广播方式:该模式下的网卡能够接收网络中的广播信息。②组播方式:设置在该模式下的网卡能够接收组播数据。③直接方式:在这种模式下,只有目的网卡才能接收该数据。④混杂模式:在这种模式下的网卡能够接收一切通过它的数据,而不管该数据是否是传给它的。总结一下首先,我们知道了在以太网中是基于广播方式传送数据的,也就是说,所有的物理信号都要经过我的机器,其次,广播模式下,网卡的一种模式叫混杂模式(promiscuous),在这种模式下工作的网卡能够接收到一切通过它的数据,而不管实际上数据的目的地址是不是它。再次,通过设置交换机监听端口。监听端口带宽要大于所监听的端口带宽,防止丢包。2网络数据包捕获技术不同的操作系统实现的底层包捕获机制可能是不一样的,但从形式上看大同小异。数据包常规的传输路径依次为网卡接口、设备驱动层、数据链路层、IP层、传输层、最后到达应用程序。而包捕获机制是在数据链路层增加一个旁路处理,对发送和接收到的数据包做过滤/缓冲等相关处理,最后直接传递到应用程序。2网络数据包捕获技术旁路处理机制基于socket的网络的编程方法数据链路提供者接口(DLPI)伯克利数据包过滤器(BPF)Lipcap零拷贝技术………libnet提供的接口函数主要实现和封装了数据包的构造和发送过程。libpcap提供的接口函数主要实现和封装了与数据包截获有关的过程。libnids提供的接口函数主要实现了开发网络入侵监测系统所必须的一些结构框架。libicmp等相对较为简单,它封装的是ICMP数据包的主要处理过程(构造、发送、接收等)。数据包捕获流程一、libpcap的数据类型定义structpcap_addr:网卡地址描述{pcap_addr*next;sockaddr*addr;sockaddr*netmask;sockaddr*broadaddr;sockaddr*dstaddr;};pcap_addr*next;如果非空,指向链表中一个元素的指针;空表示链表中的最后一个元素。sockaddr*addr;指向包含一个地址的sockaddr的结构的指针。sockaddr*netmask;如果非空,指向包含相对于addr指向的地址的一个网络掩码的结构。sockaddr*broadaddr;如果非空,指向包含相对于addr指向的地址的一个广播地址,如果网络不支持广播可能为空。sockaddr*dstaddr;如果非空,指向一个相对于addr指向的源地址的目的地址,如果网络不支持点对点通讯,则为空。structpcap_file_header{bpf_u_int32magic;u_shortversion_major;u_shortversion_minor;bpf_int32thiszone;/*gmttolocalcorrection*/bpf_u_int32sigfigs;/*accuracyoftimestamps*/bpf_u_int32snaplen;/*maxlengthsavedportionofeachpkt*/bpf_u_int32linktype;/*datalinktype(LINKTYPE_*)*/};u_shortversion_major;Libpcap的主版本号。u_shartversion_minor;Libpcap的从版本号。bpf_u_int32sigfigs;时间戳描述。bpf_u_int32snaplen;保存的每个pkt的分片号的最大值。bpf_u_int32linktype;数据链的类型。细节说明:libpcapdump文件头;libpcapdump文件中的第一个记录包含了一些标志的保存值,这些标志在打印阶段用到。这儿的很多域都是32位的int,所以compilers不用进行转化;这些文件需要具有跨层次的可交换性。无论如何不要改变结构的层次(包括仅仅改变这个结构中域的长度);structpcap_if{/*网卡数据链的一个元素*/structpcap_if*next;char*name;/*nametohandtopcap_open_live()*/char*description;/*textualdescriptionofinterface,orNULL*/structpcap_addr*addresses;u_intflags;/*PCAP_IF_interfaceflags*/};pcap_if*next;如果非空,指向链的下一个元素。如果为空是链的最后一个元素。char*name;指向一个字符串,该字符串是传给pcap_open_live()函数的设备名;char*description;如果非空,指向一个对设备的人性化的描述字符串。pcap_addr*addresses;指向网卡地址链中的第一个元素。u_intflags;PCAP_IF_网卡的标志。现在唯一可用的标识是PCAP_IF_LOOKBACK,它被用来标识网卡是不是lookback网卡。structpcap_pkthdr{/*dump文件中的数据包头*/structtimevalts;/*timestamp*/bpf_u_int32caplen;/*lengthofportionpresent*/bpf_u_int32len;/*lengththispacket(offwire)*/};timevalts;数据报时间戳;bpf_u_int32caplen;当前分片的长度;dpf_u_int32len;这个数据报的长度;细节描述:在dump文件中的每个数据报都有这样一个报头。它用来处理不同数据报网卡的不同报头问题。structpcap_stat{/*用来保存网卡静态变量的结构*/u_intps_recv;/*numberofpacketsreceived*/u_intps_drop;/*numberofpacketsdropped*/u_intps_ifdrop;/*dropsbyinterfaceXXXnotyetsupported*/};u_intps_recv;接受数据报的数目;u_intps_drop;被驱动程序丢弃的数据报的数目;u_intps_ifdrop;被网卡丢弃的数据报的数目;structpcap_sf{//pacap的savefile结构定义FILE*rfile;//该指针指向savefile文件intswapped;//?inthdrsize;//头大小吗?intversion_major;//主版本号intversion_minor;//从版本号u_char*base;//?};二、Libpcap过滤规则过滤规则是一个包含过滤表达式的ASCII码字符串,此规则表达式在程序中作为pcap_compile()函数的参数被编译,并用于内核级的包过滤机制使用.表达式决定哪种包将被捕获,如果表达式为空,所有网卡捕获到的数据包都会提交给内核过滤引擎,否则,只有满足表达式中关键字的数据包才会被捕获.表达式是由一个或者多个原语组成,而关键字通常是被一个或多个修饰词修饰的标识符(名称或序号)下面是三种不同类型的修饰词:type:此类修饰词决定哪种类型的标识符被引用,常用的修饰词有host,netandport.例如,`hostfoo',`net128.3',`port20'.在没有此类修饰符的情况下,默认使用host.dir:此修饰符类型从标识符指定了一个详尽的数据传输方向(使用and和or),常用的方向指示修饰符有src,dst,srcordstandsrcanddst.等.例如,`srcfoo',`dstnet128.3',`srcordstportftp-data'.在没有指定此类修饰符时,默认使用srcordst.protol:此类修饰符的作用是过滤指定协议数据包,常见的协议有:ether,ip,ip6,arp,rarp,tcpandudp,例如,`ethersrcfoo',`arpnet128.3',`tcpport21'.三、Libpcap函数—网络接口函数1、函数名称:char*pcap_lookupdev(char*errbuf)函数功能:用于返回可被pcap_open_live()或pcap_lookupnet()函数调用的网络设备名指针。获得本机的网络接口名称。参数说明:如果函数执行成功,则返回一个用于描述系统上的一个网卡的描述符的指针。如果失败,返回null,errbuf中存放出错信息。2、函数名称:intpcap_lookupnet(char*de
本文标题:网络数据包的获取与libpcap应用
链接地址:https://www.777doc.com/doc-3396854 .html