您好,欢迎访问三七文档
封皮-1-成绩评定表学生姓名范哲铭班级学号1204050316专业计算机科学与技术课程设计题目发送ARP数据包评语组长签字:成绩日期20年月日-2-课程设计任务书学院信息科学与工程学院专业计算机科学与技术学生姓名范哲铭班级学号1203050316课程设计题目发送ARP数据包实践教学要求与任务:根据后面介绍的ARP包结构,编写程序封装并发送ARP包。1.以命令形式运行:SendArpsource_ipsource_macdest_ipdest_mac其中SendArp为程序名,source_ip为源ip地址,source_mac为源mac地址,dest_ip为目的ip地址,dest_mac为目的mac地址.2.输出内容:ARP帧各字段值,包括源IP地址,源MAC地址,目的IP地址,目的MAC地址等工作计划与进度安排:第17周星期一:设计任务分析和总体设计星期二:软件算法和流程设计星期三:软件编码实现星期四:软件总体调试星期五:交课程设计报告、答辩、验收程序指导教师:2013年12月9日专业负责人:2013年12月10日学院教学副院长:2013年12月11日-3-摘要计算机网络是多个计算机的集合,在网络中的计算机若想互相通信就需要用到Ethernet设备。Ethernet设备有自己全球唯一的MAC地址,它们以MAC地址来传输Ethernet数据包,但他们却不能识别IP包的IP地址。所以,在Ethernet中进行IP通信时就需要一个协议来建立IP地址和MAC地址的对应关系。在ARP协议中对于这种情况会发送Arp数据包用来寻找目的主机并建立对应关系用于下次传输。关键字:物理帧ARP帧ip地址mac地址-4-目录一课程设计目的………………………………………1二课程设计要求………………………………………1三系统开发语言及环境的选择………………………1四相关知识…………………………………………1-31.ARP协议的工作原理……………………1-22.ARP的包格式……………………………23.ARP包的填充………………………………2-3五课程设计过程……………………………………3-111.流程图…………………………………3-42.源程序代码……………………………4-103.程序运行结果分析……………………10-11六课程设计小结…………………………………11七参考文献………………………………………11-12-5-一课程设计目的1)ARP协议用于完成IP地址与MAC地址间的转换。2)熟悉ARP协议对于IP数据包的传输过程具有重要意义。3)本课程设计的主要目的是通过封装与发送ARP帧,了解ARP协议的工作原理与ARP帧的结构。二课程设计要求根据后面介绍的ARP包结构,编写程序封装并发送ARP包。1)以命令行形式运行:arpsendsrc_ipsrc_macdst_ipdst_macflag其中arpsend作为程序名。各参数意义:src_ip:源IP地址。src_mac:源MAC地址。dst_ip:目的IP地址。dst_mac:目的MAC地址。Flag:0表示ARP请求;1表示ARP应答。例如:Arpsend192.168.1.1FA:01:02:03:04:05192.168.1.20D:E1:02:03:B4:0612)输出内容:ARP帧的各字数值,包括源IP地址,源MAC地址,目的IP地址,目的MAC地址等。三系统开发语言及环境的选择操作系统:Windows8运行环境:MicrosoftVisualC++6.0开发语言:C++。四相关知识1.ARP协议的工作原理Ethernet设备(比如网卡)有自己全球唯一的MAC地址,它们以MAC地址来传输Ethernet数据包,但他们却不能识别IP包的IP地址。所以,在Ethernet中进行IP通信时就需要一个协议来建立IP地址和MAC地址的对应关系,这个协议就是ARP协议。ARP的基本运行过程是:1)主机A希望发行数据分组给主机B,但不知道B的物理地址。2)A发送广播报文,要求B主机用他的物理地址来响应。3)网站上所有主机都接收到这个分组。4)B识别出自己的IP地址,发送给应答报文,告诉A自己的物理地址。-6-但是,所有的源节结点在发送任何一个分组或者连续向同一个目的主机发送分组时,都要通过ARP服务去获取目的物理地址,他的工作效率肯定很低。为了克服这个缺点,要对ARP做些改进。ARP改进的一个重要方法是,在使用ARP的主机上保留一个专用的高速缓存,用于存放最近的IP地址和物理地址的绑定,在发送ARP请求时先看看这个高速缓存。例如,在命令窗口中输入:arp-a得到:InternetAddressPhysicalAddressType192.168.1.25000-30-6e-07-e6-dedynamic这就是该计算机里存储的IP地址与MAC地址的对应关系,dynamic表示临时存储在ARP缓存中的条目,过一段时间系统就会自动删除。这样,当计算机要和另一台计算机192.168.1.19通信时,他会先检查ARP缓存,查找是否与192.168.1.19对应的ARP条目。如果没找到,他就会发送ARP请求包,广播询问与192.168.1.19对应的MAC地址。192.168.1.19发现ARP请求包中的IP一样,就会发送ARP应答分组,通知自己IP地址与MAC地址的对应关系。于是,计算机的ARP缓存就会相应刷新,增加以下信息:192.168.1.1900-40-05-42-84-f4dynamic。2.ARP的包格式图1给了ARP分组格式的示意图。物理帧头(14B)ARP帧结构(28B)填充数据(18B)CRC(4B)图1ARP包格式(1)物理帧头物理帧头的结构如2图所示。ARP帧:0x0806图2物理帧头格式(2)ARP帧结构图3给出了ARP帧格式的示意图,长度为28B。3.ARP包的填充要注意的是,填充请求包时。因为包要在Ethernet上广播,所以,物理帧头的“目的MAC”字段要填充为FFFFFFFFFFFF;而ARP帧结构中的目的MAC可填充为任意值,因为它此时不起作用。“填充数据”字段要填充目的MAC(6B)源MAC(6B)类型(2B)-7-为0。08162431(位)硬件类型(Ethernet:0x1)上层协议类型(IP:0x0800)硬件地址长度(0x6)IP地址长度(0x4)操作(请求:0x1;应答:0x2)源MAC地址源MAC地址源IP地址源IP地址目的MAC地址目的MAC地址目的IP地址图3ARP帧结构五课程设计过程1.流程图-8-图5程序流程图YYN命令行参数=5?定义arp跑结构并初始化Arp请求,填充dlc头中目的mac及flag填充dlc的其他字段及arp头的各字段进入发送arp包函数关闭网卡结束NArp请求,填充dlc头中目的mac及flagNNYYYN分配并初始化发送包结构获取网卡列表?选择并打开网卡?释放包结构发送成功?Flag=0?开始-9-2.源程序代码#includeiostream#includepcap.h//此头文件在VC中并不包含需另行下载#pragmacomment(lib,wpcap.lib)#pragmacomment(lib,ws2_32.lib)usingnamespacestd;typedefstructphyframe//用结构体自定义物理帧结构{unsignedchardesmac[6];unsignedcharsrcmac[6];unsignedshortframetype;}PHYFRAME;typedefstructarpframe//用结构体自定义ARP帧结构{unsignedshorthardwaretype;unsignedshortprotocoltype;unsignedcharmaclen;unsignedchariplen;unsignedshortflag;unsignedcharsrcmac[6];unsignedcharsrcip[4];unsignedchardesmac[6];unsignedchardesip[4];unsignedcharpadding[18];}ARPFRAME;typedefstructarppacket//定义ARP数据包,其中包含物理帧和ARP帧{PHYFRAMEphyf;ARPFRAMEarpf;}ARPPACKET;ARPPACKETarpp;intcheckmac(char*argv,unsignedchar*mac_add)//定义checkmac函数用来检测输入的硬件地址格式是否正确,如果正确进行赋值{charmac[18];inti=0,j=0,k=0;strcpy(mac,argv);intm=strlen(argv);for(i=0;im;i++){if((mac[i]'-')||(mac[i]'-'&&mac[i]'0')||(mac[i]'9'&&mac[i]'A')||-10-(mac[i]'Z'&&mac[i]'a')||mac[i]'z')//对输入的硬件地址的格式进行检查当字符串中的每一位出现除了个位数,大或小写字母和-以外的字符时报错{coutMAC格式错误endl;return0;}else{if(mac[i]!='-')j++;else{k++;if(j2)//如果有连续两个-出现,报错{coutMAC格式错误!endl;return0;}elsej=0;if(k5)如果-的个数大于5个报错{coutMAC格式错误!endl;return0;}}}}for(i=0;i6;i++)用一个for循环进行赋值{while(*(mac+j)=='-')j++;if(*(mac+j)='0'&&*(mac+j)='9')mac_add[i]=(unsignedchar)(*(mac+j)-'0');if(*(mac+j)='a'&&*(mac+j)='z')mac_add[i]=(unsignedchar)(*(mac+j)-'a'+10);if(*(mac+j)='A'&&*(mac+j)='Z')mac_add[i]=(unsignedchar)(*(mac+j)-'A'+10);mac_add[i]*=16;if(*(mac+j)='0'&&*(mac+j)='9')mac_add[i]+=(unsignedchar)(*(mac+j)-'0');if(*(mac+j)='a'&&*(mac+j)='z')mac_add[i]+=(unsignedchar)(*(mac+j)-'a'+10);if(*(mac+j)='A'&&*(mac+j)='Z')mac_add[i]+=(unsignedchar)(*(mac+j)-'A'+10);-11-}return1;}intcheckip(char*argv,unsignedchar*ip_add)//定义checkip函数用来检测输入的硬件地址格式是否正确,如果正确进行赋值{charip[16];inti=0,j=0,k=0;strcpy(ip,argv);intm=strlen(argv);for(i=0;im;i++){if((ip[i]'.')||(ip[i]'.'&&ip[i]'0')||ip[i]'9')//对输入的ip地址进行检查,如果出现数字和.以外的字符报错{coutIP地址错误!endl;return0;}else{if(ip[i]!='.')j++;else{k++;if(j3)//出现连续四位都是数字时报错{coutIP地址错误!endl;return0;}elsej=0;if(k3)//.一共出现三次以上时报错{coutip地址错误!endl;return0;}}}}for(i=0;i4;i++)//如没有错误对IP地址进行赋值{while(*(ip+j
本文标题:发送ARP数据包
链接地址:https://www.777doc.com/doc-2568478 .html