Login
升级VIP 登录 注册 安全退出
当前位置: 首页 > word文档 > 学习教育 > ARP地址解析,arp地址解析协议

ARP地址解析,arp地址解析协议

收藏

本作品内容为ARP地址解析,格式为 doc ,大小 254464 KB ,页数为 19页

ARP地址解析


('使用ARP协议获取局域网内活动主机物理地址专业:计算机应用技术姓名:金晶学号:21201103771背景知识1.1ARP协议工作原理ARP协议工作在TCP/IP协议的第二层(数据链路层),用于将IP地址转换为网卡物理地址(NIC的MAC地址,媒体访问控制地址)。无论是任何高层协议的通信,最终都将转换为数据链路层的MAC通信。所以说,ARP协议时保证网络通信的基础协议。每台主机都会在自己的ARP缓冲区(ARPcache)中建立一个ARP列表,以存储IP地址和MAC地址的对应关系。ARP协议的工作流程为;(1)在发送一个分组之前,源主机首先根据目的IP地址,在本地ARP高速缓存表中查找与之对应的目的物理地址。如果找到对应的物理地址,就不用进行地址解析,否则需要进行地址解析。(2)实现地址解析的第一步是产生ARP请求分组。在相应的字段写入本地主机的源物理地址、源IP地址、目的IP地址、在目的物理地址字段写入0,并在操作字段中写入1。(3)将ARP分组发送到本地的数据链路层,并封装成帧。以源物理地址作为源地址,以物理广播地址(FF-FF-FF-FF-FF-FF)作为目的地址,通过物理层发送出去。(4)由于采用了广播地址,因此网段内所有的主机或设备都能够接收到该帧。除了目的主机外,所有接收到该分组的主机和设备都会丢弃该分组,因为目的主机能够识别ARP消息中的IP地址。(5)目的主机构造ARP应答分组。在ARP应答分组中,以请求分组中源物理地址,源IP地址作为其目的物理地址,目的IP地址,并将目的主机自身的物理地址,IP地址填入应答分组的源物理地址,源IP地址字段,并在操作字段中写入2。该分组通过数据链路层以点对点的方式发送出去。(6)源结点接收到ARP应答分组,知道对应于目的IP地址的目的物理地址,将它作为一条新纪录加入到ARP高速缓存表。(7)源结点将包含完整源IP地址,源物理地址,目的IP地址,目的物理地址的信息和数据作为一个发送分组,传送给它的数据链路层并封装成帧,然后以点对点的方式发送到目的主机。1.2ARP协议相关数据帧结构图1.1显示了ARP数据帧结构。图1.1ARP数据帧结构在Ethernet网上发送数据帧,还需要将此数据封装到物理帧中,封装后结构如图1.2所示。图1.2物理帧结构物理帧头结构如图1.3所示。图1.3物理帧头结构1.2Winpcap简介Winpcap(windowspacketcapture)是Win32平台上的、强大的、有较好扩展性的底层网络分析体系结构,是UNIX下的lipbcap移植到Windows下的产物,是Win32环境下数据包捕获的开放代码函数库。Winpcap是第一个win32开放式的捕获包的体系结构,能支持大多数应用程序的需要。Winpcap包含了一个内核级的数据包过滤器——NPF(NetgroupPacketFilter)、一个底层动态链接库(Packet.dll)和一个高层的独立于系统的库(Wpcap.dll)。这三个模块中,NPF属于内核级,其他两模块属于用户级。NPF模块过滤数据包,将数据包不做任何改动的传递给用户,它还包含了一些操作系统专用代码(如时间戳管理)。Packet.dll模块提供了Win32平台下的捕获包的驱动接口。实际上,不同版本的Windows都提供了不同的内核模块和应用程序之间的接口函数,Packet.dll有一套独立于系统的API函数来处理这些差异。基于Packet.dll编写的程序可以不经过重新编译就在各种Win32平台下实现捕获数据包。Packet.dll还包含了一些其他的函数,它可以进行一些底层的操作,Packet.dll和NPF都依赖于操作系统,并且由于Windows95/98和WindowsNT/2000之间操作系统的不同而在不同版本的操作系统上有所不同。Wpcap.dll库不依赖于操作系统,并且它包含了一些其他高层的函数,比如,过滤器生成器、用户定义的缓冲区和高层特性(数据统计和构造数据结构包)。Winpcap提供的功能包括4个方面:(1)捕获原始数据包,包括在共享网络上各主机发送/接收的以及相互之间交换的数据包;(2)在数据包发送应用程序之前,按照自定义的规则将某些特殊的数据包过滤掉;(3)在网络上发送原始的数据包;(4)收集网络通信过程中的数据流量。Winpcap的主要功能在于独立于主机协议(如TCP/IP)而发送和接收原始数据包。也就是说,Winpcap不能阻塞、过滤或控制其他应用程序数据包的收发,它只是监听共享网络上传送的数据包。因此,它不能用于QoS调度程序或个人防火墙。1.3使用Winpcap编程的一般步骤使用Winpcap编程的准备工作如下:(1)下载Winpcap驱动程序和相关版本的WpdPack包(Developers’sPack)。WpdPack包中含有Winpcap编程所需的头文件和lib库文件以及一些示例程序和帮助文档。下载地址为http://www.winpcap.org/install/default.htm。当前Winpcap的最新版本WinPcap4.0。(2)根据屏幕提示安装Winpcap驱动程序,安装后重启机器。(3)将WpdPack包解压到某个自定义的目录,在该目录中会看到docs、Include、lib、Example等文件夹。(4)在VC中设定Include目录及Library目录。(5)单击“Project->settings->Link”,在Object/librarymodules中添加wpcap。Lib。基于Winpcap的应用程序一般按照下面几个步骤:(1)获取网络设备列表;(2)选择网卡并打开;(3)当捕获数据包时,可能需要设置过滤器;(4)捕获数据包或者发送数据包。2开发环境操作系统:WindowsXP编程语言:C++开发环境:MicrosoftVisualC++6.0,Winpcap4.0运行环境:MicrosoftVisualC++6.0,Winpcap4.03程序主流程说明程序的主要流程为:(1)由于Winpcap需要绑定在某特定的网络适配器上,所以程序在开始的时候要首先获得系统中全部的网络适配器列表,由用户选择适当的适配器。(2)程序检测用户选择是否正确,确认无误后,获得本机的IP地址和MAC地址。(3)开启两个工作者进程分别获得发送ARP请求数据帧和接收分析ARP响应数据帧的工作。(4)接收到ARP响应数据帧后分析其有效性,并在确定某响应数据帧有效性后发送更新消息通知用户界面线程刷新界面显示刚刚获得的对应关系。程序流程图如图3.1所示。开始获取设备列表选择一个设备,并检查设备合法性获得本机IP地址和MAC地址开启两个工作者线程分别负责ARP数据包的收发接受消息,更新界面给本局域网内全部主机发送ARP请求数据包监听ARP响应数据包给主线程发送消息,更新界面超时程序结束YN图3.1程序流程图4程序详细设计4.1ARP数据包本程序涉及的核心数据结构包括Ethernet帧头部结构、ARP数据帧头部结构和最后封装ARP包结构。(1)Ethernet帧头部结构如下所示:structethernet_head{unsignedchardest_mac[6];//目的主机MAC地址unsignedcharsource_mac[6];//源端MAC地址unsignedshorteh_type;//Ethernet网类型};(2)ARP数据帧头部结构如下所示:structarp_head{unsignedshorthardware_type;//硬件类型:Ethernet网接口类型为1unsignedshortprotocol_type;//协议类型:IP协议类型为0x0800unsignedcharadd_len;//硬件地址长度:MAC地址长度为6Bunsignedcharpro_len;//协议地址长度:IP地址长度为4Bunsignedshortoption;//操作:ARP请求为1,ARP应答为2unsignedcharsour_addr[6];//源MAC地址:发送方的MAC地址unsignedlongsour_ip;//源IP地址:发送方的IP地址unsignedchardest_addr[6];//目的MAC:ARP请求中没有意义,相应中为接受方MACunsignedlongdest_ip;//目的IP:ARP请求中为请求解析的IP;ARP相应中为接受方IPunsignedcharpadding[18];};(3)ARP包结构如下所示:structarp_packet//ARP包结构{ethernet_headeth;//Ethernet网头部arp_headarp;//ARP数据帧头部};4.2显示网卡列表一台主机可能对应多个网卡,程序初始化时要分别列出所有网卡的详细信息,以供用户选择。显示网卡列表的代码下所示:if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,&alldevs,errbuf)==-1)//枚举系统所有网络适配器的名称{MessageBox("没有找到网络设备!",NULL,MB_OK);//显示错误信息return;}num=0;for(d=alldevs;d!=NULL;d=d->next)//显示网络列表{num++;buffer+=(char)(d->name);if(d->description){buffer+="";buffer+=(char)(d->description);buffer+="\\r\\n";GetDlgItem(IDC_COMPILE)->SetWindowText(buffer);//在编辑框中显示网络适配器名称}elseMessageBox("没有找到网络设备!",NULL,MB_OK);4.3选择网络适配器在编辑框中输入要选择的网络适配器的编号,根据通知消息EN_UPDATE得到选择的网络适配器以及网络适配器的接口列表。其主要实现代码如下:m_Select.GetWindowText(string);select=atoi(string);if(select>num)MessageBox("您所选择的网络适配器不存在!",NULL,MB_OK);//得到选择的网络适配器号d=alldevs;for(intl=0;lnext;//得到接口列表if(d->addresses==NULL){LocalIP=NULL;return;}else{for(addr=d->addresses;addr;addr=addr->next){if(addr->addr->sa_family==AF_INET){if(addr->addr){LocalIP=((structsockaddr_in)addr->addr)->sin_addr.s_addr;sprintf(strbuf,"%s",iptos(((structsockaddr_in)addr->addr)->sin_addr.s_addr));}if(addr->netmask){nMask=((structsockaddr_in)addr->netmask)->sin-addr.s_addr;sprintf(strbuf,"%s",iptos(((structsockaddr_in)addr->netmask)->sin_addr.s_addr));}m++;}elseMessageBox("不是IP地址!",NULL,MB_OK);}}pResult=0;4.4设置过滤器WinPcap提供的最强大的特性之一就是过滤引擎。它是被集成到了winpcap的捕获机制中的,提供了一种非常高效的方法来获取部分网络数据。设置过滤引擎的主要代码如下所示:charpacket_filter[]="arp";//设置过滤字符串bpf_programfcode;if(pcap_compile(adhandle,&fcode,packet_filter,1,nMask)<0)//编译过滤字符串,失败{MessageBox("无法编译报过滤器,请检查语法!");//输出错误信息exit(1);//退出程序}if(pcap_setfilter(adhandle,&fcode)<0)//设置设备过滤失败{MessageBox("设置过滤器时发生错误");//输出错误信息exit(1);//退出程序}4.5数据包捕获线程在发送数据包之前,首先要打开数据包捕获线程,以防止先发送后监听造成的数据包丢失问题。为提高程序处理效率,本程序中采用Capturer线程来负责接受数据包,接收后并不立即处理,而是提交给onpacket()函数对数据包进行解析。自定义WM_PACKET消息,由OnPacket函数实现对WM_PACKET消息的映射。数据包捕获线程的主要代码代码如下所示:while(adhandle!=NULL&&(j=pcap_next_ex(adhandle,&pkt_header,(constu_char)&pkt_data))>=0){if(j==0)continue;else{AfxGetApp()->m_pMainWnd->SendMessage(WM_PACKET,0,0);//PostMessage--异步模式//SendMessage--同步模式,等待消息被处理后再返回}4.6获取本机MAC地址向局域网内主机发送ARP包需要填写源MAC地址,而从网卡信息中读到的内容不包括网卡的MAC地址,因此要首先向自己发送一个伪ARP包,以获取本机的MAC地址,主要代码如下所示:BoolARPQuestForSelf()//获取本机MAC地址{arp_packetARPpacket;//声明一个ARP包ARPpacket.eth.eh_type=htons(0x0806);//协议类型:0x0806//硬件类型:Ethernet网接口类型为0x0001ARPpacket.arp.hardware_type=htons(0x0001);//上层协议类型:IP协议类型为0X0800ARPpacket.arp.protocol_type=htons(0x0800);//硬件地址长度:MAC地址长度为6BARPpacket.arp.add_len=6;ARPpacket.arp.pro_len=4;//协议地址长度:IP地址长度为4B//操作:ARP请求为1,ARP应答为2ARPpacket.arp.option=htons(0x0001);for(inti=0;i<6;i++){//目的MAC为广播地址FF-FF-FF-FF-FF-FF,源MAC以66-66-66-66-66-66伪装ARPpacket.eth.dest_mac[i]=0xff;ARPpacket.eth.source_mac[i]=0x66;ARPpacket.arp.sour_addr[i]=0x66;ARPpacket.arp.dest_addr[i]=0x00;}ARPpacket.arp.sour_ip=htonl(0x70707070);//112.112.112.112ARPpacket.arp.dest_ip=LocalIP;if(pcap_sendpacket(adhandle,(u_char)&ARPpacket,sizeof(ARPpacket))!=0){returnfalse;}else{returntrue;}}4.7向局域网内主机发送ARP请求包发送ARP请求包之前,首先要生成ARP请求包。ARP请求生成主要是向ARP请求包的各个字段进行填充,方法与获取本机MAC时发送的ARP请求包类似。生成ARP请求包后,要向局域网内所有主机发送。子网内任何一个IP地址都可以分解为“子网号”和“主机号”两部分,由子网掩码将它们分离:子网掩码值为1的bit位为子网号,子网掩码值为0的bit位为主机号。在同一子网内,各个IP的子网号是相同的,所以子网内IP的列举,实际上就是主机号的列举。子网号由本机IP&子网掩码得到;主机号初始为1,不断递增,直至主机号&子网掩码不为0为止。主要代码如下所示:unsignedlongnSubnet=LocalIP&nMask;//得到子网unsignedlongmask=htonl(nMask);//子网掩码->网络序unsignedlonghostnumber=1;//从第一个主机开始依次发送ARP请求包while((htonl(hostnumber)&nMask)==0){unsignedlongtempIP;tempIP=(htonl(hostnumber)nSubnet);//拼成子网主机IPif(tempIP!=LocalIP){arp_packetpacket=ArpRequest(LocalIP,tempIP,LocalMAC);pcap_sendpacket(adhandle,(u_char)&packet,sizeof(arp_packet));}hostnumber++;}4.8ARP应答包解析对于接收到的ARP包,调用OnPacket()函数解析,过滤出有效的ARP应答,并根据其各字段的取值,分析出局域网中主机IP-MAC映射关系,存放至模拟的ARP缓存表中。同时,如果某映射关系已存在于缓存表中,则不重复插入,这符合ARP高速缓存表的原理。主要代码如下所示:arp_packetArppacket;Arppacket=(arp_packet)pkt_data;CStringstr3;charstr2=0;if(Arppacket->arp.option==htons(0x0002)&&Arppacket->eth.eh_type==htons(0x0806)&&Arppacket->arp.hardware_type==htons(0x0001)&&Arppacket->arp.protocol_type==htons(0x0800)){if(Arppacket->arp.sour_ip==LocalIP)//自己的应答{for(inti=0;i<6;i++){LocalMAC[i]=Arppacket->arp.sour_addr[i];}CStringmac=ConvertMAC(LocalMAC);SendArpQuest(adhandle);}else//其他主机的应答{if(arp.AddARPItem(Arppacket->arp.sour_ip,Arppacket->arp.sour_addr))/{sprintf(str2,"%s%s",iptos(Arppacket->arp.sour_ip),ConvertMAC(Arppacket->arp.sour_addr));str3+=str2;str3+="\\r\\n";length++;}}GetDlgItem(IDC_MAC)->SetWindowText(str3);}return0;5程序运行结果(1)打开Arpw.exe文件,点击“分析系统”按钮,得到本机所有的适配器名称,并显示出来。运行结果如图5.1所示。图5.1分析系统(2)在“选择第个网络适配器”的编辑框中输入所选择的适配器。由上图可知,本机中只有两个网络适配器,若选择的号数比2大,则会弹出对话框“您所选择的网络适配器不存在”,如图5.2所示。图5.2对话框1(3)选择过适配器后,点击开始捕捉,则Wincap开始抓取数据包,并将抓取包的IP地址与MAC地址的对应关系显示出来。如图5.3所示。图5.3开始捕捉若选择的是第一个适配器,点击“开始捕捉”,因为此适配器没有绑定IP,则会弹出对话框“该网卡未绑定IP地址,请重新选择”。如图5.4所示。图5.4对话框(4)点击“停止捕捉”按钮,关闭与网络接口相关联的文件,并释放资源。(5)点击“关闭”按钮,关闭对话框。参考资料[1]《计算机网络高级教程》,吴功宜编著,清华大学出版社,2007年10月[2]《计算机网络高级软件编程技术》,吴功宜董大凡王珺刘乾编著,清华大学出版社,2008年1月份[3]《Winpcap基础知识》,来自http://blog.csdn.net/qsycn/archive/2009/08/18/4458008.aspx[4]《Winpcap的使用指南文档》,来自http://ppyuan.blog.hexun.com/5324023_d.html',)


  • 编号:1700739465
  • 分类:学习教育
  • 软件: wps,office word
  • 大小:19页
  • 格式:docx
  • 风格:商务
  • PPT页数:254464 KB
  • 标签:

广告位推荐

相关学习教育更多>