还剩16页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
南京工程学院算通081周洁南京工程学院(课程设计)院系通信工程学院课程名称:计算机网络与通信设计名称解析ARP数据包班级算通081班姓名周洁学号:208080311设计时间2011年06月13日——2011年06月16日目录
1.课程设计目的………………………………………
22.课程设计要求………………………………………
23.相关知识………………………………………………31ARP数据报的消息格式……………………32ARP协议的工作流程………………………..
44.课程设计分析……………………………………….61课程设计中的重点及难点………………..62参考算法………….………………………………73核心代码…………………………………………..
85.相关扩展………………………………………………
156.心得体会………………………………………………
167.____………………………………………………
171、课程设计目的本课程设计的目的是对网络上的ARP数据包进行解析,从而熟悉ARP数据包的结构,对ARP协议有更好的理解和认识
2、课程设计要求通过编制程序,获取网络中的ARP数据包,解析数据包的内容,将结果显示在标准输出上,并同时写入日志文件程序的具体要求如下所示1,以命令行的形式运行,如下所示11ARP其中,11ARP为程序名;11为日志文件名2,程序输出内容如下所示源IP地址 源MAC地址 目的IP地址 操作 时间各部分的说明如下所示源IP地址输出ARP消息格式中的源IP地址字段;源__C地址输出ARP消息格式中的源物理地址字段;目的IP地址输出ARP消息格式中的目的IP地址字段;目的__C地址输出ARP消息格式中的目的物理地址字段;操作输出ARP消息格式中的操作字段,若为ARP请求,则为1,若为ARP应答,则为2;时间该ARP包产生的时间3,当程序接收到键盘输入Ctrl+C时字段
3、相关知识aARP数据报的消息格式网络上的每台主机或设备都有一个或多个IP地址IP地址是网络层的地址,在网络层,数据被组装成IP包但是发送IP包需要物理设备的支持(通常是Ethernet设备,在本课程设计中我们指定为Ethernet设备),即发送端必须知道目的物理地址才能将IP包发送出去,所以需要一种将IP地址映射为物理地址的机制ARP协议就是用来完成这个任务的ARP协议能够在同一个物理网络中,在给定目的主机或设备的IP地址的条件下,得到目的主机或设备的物理地址ARP协议的数据包格式如图所示08162431(位)硬件类型协议类型物理地址长度协议地址长度操作源物理地址(八位组0~3)源物理地址(八位组4~5)源IP地址(八位组0~1)源IP地址(八位组2~3)目的物理地址(八位组0~1)目的物理地址(八位组2~5)目的IP地址(八位组0~3)ARP数据包的消息格式下面对数据包的各个部分进行说明硬件类型指定硬件接口类型例如,值为1表示Ethernet协议类型指定发送方支持的上层协议的类型物理地址长度指定物理(硬件)地址的长度协议地址长度网络层协议的地址长度若为IP协议,其值为4操作指定ARP的操作类型,例如,1表示ARP请求,2表示ARP应答源物理地址指定发送方的IP地址目的物理地址指定目的物理地址目的IP地址指定目的IP地址ARP分组必须在数据链路层中被封装成侦,才能发送出去封装形式如图所示将ARP数据包封装成一个帧b)ARP协议的工作流程1在发送一个ARP分组之前,源主机首先根据目的IP地址,在本地ARP高速缓存表中查找与之对应的目的物理地址如果找到对应的物理地址,就不用进行地址解析,否则需要进行地址解析2实现地址解析的第一步是产生ARP请求分组在相应的字段写入本地主机的源物理地址、源IP地址,在目的物理地址字段写入0,并在操作字段写入13将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.课程设计中的重点及难点1程序中会用到Winpcap,Winpcap是Win32环境下数据包捕获的开放代码函数库基于Winpcap的应用程序一般按照下面几个步骤进行设计输出网卡设备列表选择网卡并打开捕获数据包时,可能需要设置过滤器捕获数据包或者发送数据包2在程序设计过程中需要注意网络—主机字节顺序的转化由于不同的计算机系统所采用的数据表示方式不同,对于2B或4B的数据,有的采用低字节地址存放数据的高权值位,而有的却以低地址字节存放数据低权位值,在网络的数据传输中,我们应该统一表示,所以我们在捕获数据包后,应将数据包头部的表示长度或类型的数据转换成本地机的表达形式可以利用函数ntohs将网络字节序转换为主机字节序3选择网卡并打开时,注意选择可用的网卡
2.参考算法1取得当前网卡设备列表2选择Ethernet网卡并打开,注意判断所选网卡是否为实际存在的可用网卡3设置过滤器,此处的过滤器正则表达式为“arp”或者“etherproto\\arp”4捕获数据包并进行处理(包括输出各IP地址,物理地址,操作类型以及时间)由于要记录日志文件,为了便于输出流参数,建议采用pcap_next_ex函数流程图如图所示
3.核心代码ARP数据包结构structarppkt{unsignedshorthdtyp;//硬件类型值0001表示其为Ethernetunsignedshortprotyp;//协议类型值0800表示上层协议为IPunsignedcharhdsize;//硬件地址长度值为06unsignedcharprosize;//协议地址长度值为04unsignedshortop;//操作值为0001/0002,分别表示ARP请求/应答u_char__ac
[6];//源__C地址,6Bu_charsip
[4];//源IP地址,4Bu_chard__c
[6];//目的__C地址u_chardip
[4];//目的IP地址};获取网络设备列表,并以混杂模式打开网络设备//获取网络设备列表ifpcap_findalldevsalldevserrbuf==-1{coutErrorinpcap_findalldevs:errbuf;return;}//选择Ethernet卡ford=alldevs;d;d=d-next{//以混杂模式打开网卡,以接受所有的帧ifadhandle=pcap_open_lived-name10001300errbuf==NULL{cout\nUnabletoopentheadapter.;pcap_freealldevsalldevs;//释放设备列表return;}ifpcap_datalinkadhandle==DLT_EN10MBd-addresses!=NULLbreak;}编译过滤器并设置过滤器,只捕获ARP数据包charpacket_filter[]=”etherproto\\arp\\\\arp”;//过滤,选择arp协议ifpcap_compileadhandlefcodepacket_filter1net__sk0{cout\nUnabletocompilethepacketfilter.Checkthesyntax.\n;pcap_freealldevsalldevs;return;}//设置过滤器ifpcap_setfilteradhandlefcode0{cout\nErrorsettingthefilter.\n;pcap_freealldevsalldevs;return;}循环捕获ARP包,并进行解析whileresult=pcap_next_exadhandleheaderpkt_data=0{输出ARP数据包的各个域的内容到文件和屏幕上}源程序#includewinsock
2.h#prag__commentlibWs2_
32.lib//用到ntobs//等同于__project-setting-link打开o__ect/librarymodule编辑框后加入文件#prag__commentlibwpcap.lib#includepcap.h//此头文件没有包含在VC中需要另外加入#includefstream.h#includeio__nip.h//格式化输出需要用到#includeconio.h//用到_getch//注意到接收的数据包头中代表类型数据长度的字段采用的是big-endian//所以对于2B/4B的数据要用ntohs转换为本机形式//ARP包结构structarppkt{unsignedshorthdtyp;//硬件类型.值0001unsignedshortprotyp;unsignedcharhdsize;unsignedcharprosize;unsignedshortop;u_char__ac
[6];u_charsip
[4];u_chard__c
[6];u_chardip
[4];};voidpacket_handlerconstpcap_pkthdr*headerconstu_char*pkt_dataostreamout;void__inintar__char*argv[]{ifar__!=2{coutUsage:arpparselogfilenameendl;coutpressanykeytocontinue.endl;_getch;return;}pcap_if_t*alldevs;pcap_if_t*d;pcap_t*adhandle;charerrbuf[PCAP_ERRBUF_SIZE];u_intnet__sk;charpacket_filter[]=etherproto\\arp;structbpf_programfcode;structpcap_pkthdr*header;constu_char*pkt_data;ifpcap_findalldevsalldevserrbuf==-1{coutErrorinpcap_findalldevs:errbuf;return;}ford=alldevs;d;d=d-next{ifadhandle=pcap_open_lived-name10001300errbuf==NULL{cout\nUnabletoopentheadapter.;pcap_freealldevsalldevs;return;}ifpcap_datalinkadhandle==DLT_EN10MBd-addressess!=NULLbreak;}ifd==NULL{cout\nNointe_____sfound!__kesureWinpcapisinstalled.\n;return;}//获得子网掩码net__sk=sockaddr_in*d-net__sk-sin_addr.s_un.s_addr;//编译过滤器,只捕获ARP包ifpcap_compileadhandlefcodepacket_filter1net__sk0{cout\nUnabletocompilethepacketfilter.Checkthesyntax.\n;pcap_freealldevsalldevs;return;}//设置过滤器ifpcap_setfilterashandlefcode0{cout\nErrorsettingthefilter.\n;pcap_freealldevsalldevs;return;}cout\t\tlisteningond-description...endlendl;//显示提示信息及每项含义ofstreamfoutargv
[1]ios::app;//日志记录文件//为了查看日志时的方便,其中加入了日期记录time_tt;timet;fout.seekp0ios::end;iffout.____p!=0foutendl;fout\t\tARPrequest1/reply2onctimet;coutSourIpAddrSour__CAddressDesIpAddrDes__CAddressOPTimeendl;foutSourIpAddrSour__CAddressDesIpAddrDes__CAddressOPTimeendl;//释放设备列表pcap_freealldevsalldevs;intresult;whileresult=pcap_next_exadhandleheaderpkt_data=0{ifresult==0continue;packer_handlerheaderpkt_datacout;packet_handlerheaderpkt_datafout;}}voidpacket_handlerconstpcap_pkthdr*headerconstu_char*pkt_dataostreamout{arpkt*arph=arppkt*pkt_data+14;forinti=0;i3;i++outintarph-sip[i].;out.setfios::left;outsetw3intarph-sip
[3];out.unsetfios::uppercase;fori=0;i5;i++outhexsetw2intarph-__ac[i]-;outhexsetw2intarph-__ac
[5];out.filloldfillchar;out.unsetfios::hex|ios::uppercase;fori=0;i3;i++outintarph-dip
[3].;out.unsetfios::left;//输出目的__C地址out.fill0;out.setfios::uppercase;fori=0;i5;i++outhexsetw2intarph-d__c[i]-;out.filloldfillchar;out.unsetfios::hex|ios::uppercase;outntohsarph-op;structtm*ltime;ltime=localtimeheader-ts.tv_sec;out.fill0;outltime-tm_hour:setw2ltime-tm_min:setw2ltime-tm_sec;out.filloldfillchar;outendl;}
五、相关扩展本课程设计还可以在Linux环境下用rawsocket完成算法和代码提示1调用socket()打开协议簇为PF_PACKET的原始套接字,这样我们就可以收到数据链路帧intfd=socketPF_PACKETSOCK_RAMhtonsETH_P_ALL;2对打开的套接字调用ioct1(),将网卡设置为混杂模式,这样我们就可以接受到局域网中所有的包(包括目的地址不是本机的帧)structifreqreq;memsetreq0sizeofreq;strncpyreq.ifr_name”eth0”strlen“eth0”+1;ioctlfdSIOCGIFFLASreq;req.ifr_flags|=IFF_PROMISC;//设置为混杂模式icotlfdSIOCGIFFLAGSreq;3利用recvfrom()接收包recvformfdbuffersizeofbuffer0structsockaddr*fromfrom_len;4接收到包后,判断是否为ARP包,若是ARP包则进行处理,否则丢弃Ifntohseth_header-ether_type==0x0806ntohsarp_header-ar_hrd==0x0001ntohsarp_header-ar_pro==0x0800arp_header-ar_hln==0x06arp_header-ar_pln==0x04ntohsarp_header-ar_op==0x01||ntohsarp_header-ar_op==0x02{对ARP数据包进行分析并打印}5算法在
3、4步之间进行循环,直到强行退出为止
六、心得体会本次课程设计,完成了在xp环境下的解析ARP数据包在具体实现获取网络中的ARP数据包解析数据包的内容,并将其写入日志文件的过程中,是我更加清楚物理地址、IP地址的关联,源地址与目的地址的关系,以及二者对数据类型的格式要求最重要的是通过这次的实际训练让我对ARP协议更加理解本次课程设计查阅了大量的案例,学到了很多知识,使我对计算机网络有了更深入的了解我觉得这次课程设计我觉得收获挺大的之前的学习仅限于书本,网络的很多东西都只知道其然而不知道其所以然在这次课程设计中,也遇到了很多的难题,如在开始查找资料并编写程序时,需用到Wincap软件,且要对它进行正确的__把Wincap文件中的Include和Lib里的全部文件分别__到__VC++的位置中的Include和Lib中课程设计是培养我们综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节是对我们实际工作能力的具体训练和考察过程随着科学技术发展的日新月异,网络已经成为当今计算机发展中空前活跃的领域,在生活中可以说是无处不在,因此作为__一世纪的计算机专业的大学生来说掌握网络组网技术是十分重要的
七、参考资料
1.谢希人著.计算机网络(第四版)大连理工大学出版社
20032.宋凯等著.计算机网络.北京清华大学出版社
20103.吴功宜等著.计算机网络课程设计.北京:机械工业出版社
2005.
94.李爱华等著.面向对象程序设计(C++语言).北京清华大学出版社2010ARP消息帧头部帧数据开始获取网卡列表选取Ethernet网卡打开网卡(混杂模式)编译设置过滤器捕获ARP包并将其相应内容输出1。