发送ARP数据包_第1页
发送ARP数据包_第2页
发送ARP数据包_第3页
发送ARP数据包_第4页
发送ARP数据包_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录一 课程设计目的1二 课程设计要求1三 系统开发语言及环境的选择1四 相关知识 1-31ARP协议的工作原理1-22.ARP的包格式 23.ARP包的填充2-3五 课程设计过程3-111.流程图 3-42.源程序代码 4-103.程序运行结果分析10-11六 课程设计小结11七 参考文献11-12一 课程设计目的 1) ARP协议用于完成IP地址与MAC地址间的转换。2) 熟悉ARP协议对于IP数据包的传输过程具有重要意义。3) 本课程设计的主要目的是通过封装与发送ARP帧,了解ARP协议的工作原理与ARP帧的结构。二 课程设计要求根据后面介绍的ARP包结构,编写程序封装并发送ARP包。1

2、) 以命令行形式运行: arpsend src_ip src_mac dst_ip dst_mac flag其中arpsend作为程序名。各参数意义:src_ip: 源IP地址。src_mac: 源MAC地址。dst_ip: 目的IP地址。dst_mac: 目的MAC地址。Flag:0表示ARP请求;1表示ARP应答。例如: Arpsend FA:01:02:03:04:05 0D:E1:02:03:B4:06 12) 输出内容:ARP帧的各字数值,包括源IP地址,源MAC地址,目的IP地址,目的MAC地址等。三 系统开发语言及环境的选择操作系统

3、:Windows XP运行环境:Microsoft Visual C+ 6.0开发语言:C语言,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识别出自己的I

4、P地址,发送给应答报文,告诉A自己的物理地址。但是,所有的源节结点在发送任何一个分组或者连续向同一个目的主机发送分组时,都要通过ARP服务去获取目的物理地址,他的工作效率肯定很低。为了克服这个缺点,要对ARP做些改进。ARP改进的一个重要方法是,在使用ARP的主机上保留一个专用的高速缓存,用于存放最近的IP地址和物理地址的绑定,在发送ARP请求时先看看这个高速缓存。例如,在命令窗口中输入:arp-a 得到: Internet Address Physical Address Type50 00-30-6e-07-e6-de dynamic 这就是该计算机里存储的IP地址与

5、MAC地址的对应关系,dynamic表示临时存储在ARP缓存中的条目,过一段时间系统就会自动删除。 这样,当计算机要和另一台计算机9通信时,他会先检查ARP缓存,查找是否与9对应的ARP条目。如果没找到,他就会发送ARP请求包,广播询问与9对应的MAC地址。9发现ARP请求包中的IP一样,就会发送ARP应答分组,通知自己IP地址与MAC地址的对应关系。于是,计算机的ARP缓存就会相应刷新,增加以下信息:9 00-40-05-42-84-f4 dynamic 。 2.ARP的包格式图1给

6、了ARP分组格式的示意图。物理帧头(14B)ARP帧结构(28B)填充数据(18B)CRC(4B)图1 ARP包格式(1) 物理帧头物理帧头的结构如2图所示。目的MAC (6B)源MAC(6B) 类型(2B) ARP帧:0x0806图2 物理帧头格式(2)ARP帧结构 图3给出了ARP帧格式的示意图,长度为28B。 3ARP包的填充 要注意的是,填充请求包时。因为包要在Ethernet上广播,所以,物理帧头的“目的MAC”字段要填充为FFFFFFFFFFFF;而ARP帧结构中的目的MAC可填充为任意值,因为它此时不起作用。“填充数据”字段要填充为0。 0 8 16 24 31(位) 硬件类型(

7、Ethernet:0x1) 上层协议类型(IP:0x0800)硬件地址长度(0x6)IP地址长度(0x4) 操作(请求: 0x1; 应答: 0x2) 源MAC地址 源MAC地址 源IP地址 源IP地址 目的MAC地址 目的MAC地址 目的IP地址图3 ARP帧结构五 课程设计过程 1.流程图NNNYNYARP请求,填充DLC头中目的MAC(广播,全F)及FlagFlag=0?N开始YYY结束关闭网卡 释放包结构发送包成功?分配及初始化发送包结构选择网卡并打开?获取网卡列表?进入发送ARP包函数填充DLC的其他字段及ARP头的各字段ARP请求,填充DLC头中目的MAC及Flag定义ARP包结构并

8、初始化命令行参数 = 6? 图5 程序流程图2.源程序代码头文件keshe.h#include <iostream.h>#include <fstream.h>#include <stdlib.h>#include <conio.h>#include <stdio.h>#include "Packet32.h"#include "Ntddndis.h"#pragma comment(lib,"Packet.lib")/ DLC头typedef struct DLCHeader

9、 unsigned char DesMAC6;/目的MAC地址 unsigned char SrcMAC6;/源MAC地址 unsigned short Ethertype;/帧类型DLCHEADER;/ ARP桢typedef struct ARPFrame unsigned short HW_Type;/硬件类型 unsigned short Prot_Type;/上层协议类型 unsigned char HW_Addr_Len;/MAC地址长度 unsigned char Prot_Addr_Len;/IP地址长度 unsigned short Flag;/1表示请求,2表示应答 uns

10、igned char Send_HW_Addr6;/源MAC地址 unsigned char Send_Prot_Addr4;/源IP地址 unsigned char Targ_HW_Addr6;/目的MAC地址 unsigned char Targ_Prot_Addr4;/目的IP地址 unsigned char padding18;/填充数据ARPFRAME;/ ARP包=DLC头+ARP桢typedef struct ARPPacket DLCHEADER dlcHeader; ARPFRAME arpFrame;*PARPPACKET;ARPPacket ARPPACKET;源文件 k

11、eshe.cpp#include<iostream.h>#include<string.h>#include "keshe.h"int transIP(char *,unsigned char *);/填充IP地址int transMAC(char *,unsigned char *);/填充MAC地址LPADAPTER lpAdapter;/网卡结构指针LPPACKET lpPacket;/接收包结构指针bool Send();/发送包函数void main(int argc,char *argv)if(argc!=6)/命令行参数!=6,输入错误

12、cout<<"输入格式错误"<<endl;return;int i=0;memset(&ARPPACKET, 0, sizeof(ARPPACKET);/初始化ARP包if(*argv5='0')/输入flag参数为0,ARP请求for(i=0;i<6;i+)/DLC头中目的MAC地址为广播形式ARPPACKET.dlcHeader.DesMACi=0xff;ARPPACKET.arpFrame.Flag=(unsigned short)1;/ARP帧中flag位置1elseif(*argv5='1')/

13、输入flag参数为1,ARP响应/填充DLC头中目的MAC地址if(!transMAC(argv4,ARPPACKET.dlcHeader.DesMAC)return;/ARP桢中flag位置2ARPPACKET.arpFrame.Flag=(unsigned short)0x0200;elsecout<<"flag位输入错误"<<endl;if(!transMAC(argv2,ARPPACKET.dlcHeader.SrcMAC)/填充DLC头中源MAC地址return;/填充DLC头中桢类型ARPPACKET.dlcHeader.Ethertyp

14、e=htons(unsigned short)0x0806);ARPPACKET.arpFrame.HW_Type=(unsigned short)0x0100;/ARP头中硬件类型/(Ethernet类型)ARPPACKET.arpFrame.Prot_Type=(unsigned short)0x0008;/上层协议(IP)类型ARPPACKET.arpFrame.HW_Addr_Len=(unsigned char)6;/MAC地址长度ARPPACKET.arpFrame.Prot_Addr_Len=(unsigned char)4;/IP地址长度if(!transMAC(argv2,A

15、RPPACKET.arpFrame.Send_HW_Addr)/源MAC地址return;if(!transIP(argv1,ARPPACKET.arpFrame.Send_Prot_Addr)/源IP地址return;if(!transMAC(argv4,ARPPACKET.arpFrame.Targ_HW_Addr)/目的MAC地址return;if(!transIP(argv3,ARPPACKET.arpFrame.Targ_Prot_Addr)/目的IP地址return;for(i=0;i<18;i+)ARPPACKET.arpFrame.paddingi=0;/填充数据if(!

16、Send()cout<<"发送arp包失败"<<endl;/发送ARP包int transIP(char *argv,unsigned char *a)char ip16;int i=0,j=0,k=0;strcpy(ip,argv);int m=strlen(argv);for(i=0;i<m;i+) /判断命令行输入的IP格式是否正确if(ipi<'0'|ipi>'9')&&ipi!='.')cout<<"输入ip:"<<

17、argv<<"格式错误"<<endl;return 0;elseif(ipi!='.')j+;elsek+;if(j>3)cout<<"输入ip:"<<argv<<"格式错误"<<endl;return 0;elsej=0;if(k>3)cout<<"输入ip:"<<argv<<"格式错误"<<endl;return 0;j=0;for(i=0;i&

18、lt;4;i+) /填充IP地址while(*(ip+j)<'0'|*(ip+j)>'9')j+;ai=(unsigned char)atoi(ip+j);while(*(ip+j)>='0'&&*(ip+j)<='9')j+;return 1;int transMAC(char *argv,unsigned char *b)char mac18;int i=0,j=0,k=0;strcpy(mac,argv);int m=strlen(argv);for(i=0;i<m;i+) /判

19、断命令行输入的MAC地址是否正确if(maci<'0'|(maci>':'&&maci<'A')|(maci>'Z'&&maci<'a')|maci>'z')cout<<"输入mac:"<<argv<<"格式错误"<<endl;return 0;elseif(maci!=':')j+;elsek+;if(j>2)cout&l

20、t;<"输入mac:"<<argv<<"格式错误"<<endl;return 0;elsej=0;if(k>5)cout<<"输入mac:"<<argv<<"格式错误"<<endl;return 0;for(i=0;i<6;i+) /填充MAC地址while(*(mac+j)=':'|*(mac+j)='-')j+;if(*(mac+j)>='0'&&a

21、mp;*(mac+j)<='9')bi=(unsigned char)(*(mac+j)-'0');if(*(mac+j)>='a'&&*(mac+j)<='z')bi=(unsigned char)(*(mac+j)-'a'+10);if(*(mac+j)>='A'&&*(mac+j)<='Z')bi=(unsigned char)(*(mac+j)-'A'+10);j+;bi*=16;if(*(mac+

22、j)>='0'&&*(mac+j)<='9')bi+=(unsigned char)(*(mac+j)-'0');if(*(mac+j)>='a'&&*(mac+j)<='z')bi+=(unsigned char)(*(mac+j)-'a'+10);if(*(mac+j)>='A'&&*(mac+j)<='Z')bi+=(unsigned char)(*(mac+j)-'A&

23、#39;+10); j+;return 1;bool Send() char AdapterNameA8192; char AdapterNameU2*sizeof(AdapterNameA); unsigned long AdapterAlength=sizeof(AdapterNameA); unsigned long AdapterUlength=2*sizeof(AdapterNameA); DWORD dwVersion=GetVersion (); DWORD dwWindowsMajorVersion=(DWORD)(LOBYTE(LOWORD(dwVersion); if(!(

24、dwVersion >= 0x80000000 && dwWindowsMajorVersion >=4)/Windows NT/获取UNICODE码网卡名列表if(PacketGetAdapterNames(AdapterNameU,&AdapterUlength)=FALSE)cout<<"无法得到网卡列表!"<<endl;return FALSE;/将第一个网卡名转为ASCII码unsigned short *pAdapterName=(unsigned short *)AdapterNameU;for(un

25、signed i=0;i<AdapterAlength;i+)if(AdapterNameAi=(char)pAdapterNamei)='0')break;else/Windows 9x/获取ASCII码网卡名列表if(PacketGetAdapterNames(AdapterNameA,&AdapterAlength)=FALSE)cout<<"无法得到网卡列表!"<<endl;return FALSE;lpAdapter=PacketOpenAdapter(AdapterNameU);/打开网卡if(!lpAdap

26、ter|lpAdapter->hFile=INVALID_HANDLE_VALUE)cout<<"无法打开网卡,错误码:"<<GetLastError()<<endl;return FALSE;/发送帧LPPACKET lpPacket; /分配发送包结构if(lpPacket=PacketAllocatePacket()!=NULL)/初始化发送包结构PacketInitPacket(lpPacket,&ARPPACKET,sizeof(ARPPACKET);/ 每次只发送一个包PacketSetNumWrites(lpA

27、dapter,1);/发送包if(PacketSendPacket(lpAdapter,lpPacket,true)=1)cout<<"send ok"<<endl;elsecout<<"发送包失败"<<endl;PacketFreePacket(lpPacket); /释放发送包结构elsecout<<"分配发送包LPPACKET结构失败!"<<endl; PacketCloseAdapter(lpAdapter);return TRUE;3.程序运行结果分析 1)安装驱动程序。下载Winpcap Driver软件并安装,安装后重启机器。 2)下载wpdpack(Developers pack)。解压后会看到其中包含docs、Include、lib、Examp

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论