使用ARP发现局域网内活动主机.docx
- 文档编号:12708483
- 上传时间:2023-04-21
- 格式:DOCX
- 页数:11
- 大小:97.04KB
使用ARP发现局域网内活动主机.docx
《使用ARP发现局域网内活动主机.docx》由会员分享,可在线阅读,更多相关《使用ARP发现局域网内活动主机.docx(11页珍藏版)》请在冰豆网上搜索。
使用ARP发现局域网内活动主机
一课程设计名称:
使用ARP发现局域网内活动主机
——自行构造、发送ARP请求数据帧
二使用工具软件:
MicrosoftVisualC++;
winpcap;
三课程设计内容简介:
1课程设计中涉及的网络基本理论简介:
(1)在网际协议中定义的是因特网的IP地址,但在实际进行通信时,物理层不能识别IP地址只能识别物理地址。
因此,需在IP地址与物理地址之间建立映射关系,地址之间的这种映射称为地址解析。
(2)以太网网络中的物理地址即网卡的序列号。
IEEE规定网卡序列号为6个字节(48位),前三个字节为厂商代号,由于厂商向IEEE注册登记申请,后3个字节为网卡的流水号。
(3)地址解析包括从IP地址到物理地址的映射和从物理地址到IP地址的映射。
TCP/IP协议组提供了两个映射协议:
地址解析协议ARP和逆向地址解析协议RARP。
ARP用于从IP地址到物理地址的映射,RARP用于从物理地址到IP地址的映射。
(4)地址解析协议的ARP的工作原理:
假定在一个物理网络上,A(源主机)要与D(目的主机)进行通信,但是不知道D的物理地址。
A利用ARP协议工作的过程如下:
A广播一个ARP请求报文,请求IP地址为IPD的主机回答其物理地址。
网上所有主机都能收到该ARP请求,并将本机IP地址与请求的IP地址比较,D主机识别出自己的地址IPD,并作出回应,通报自己的物理地址。
A收到这个ARP回应包后,就可以与D进行通信。
为了提高效率,ARP协议使用了高速缓存技术。
在每台使用ARP的主机中,都保留了一个专用的内存区,一收到ARP应答,主机就将获得的IP地址和物理地址存入缓存。
以后每次要发送报文时,首先到缓存中查找有无相应的项,若找不到,再利用ARP进行地址解析。
由于多数网络通信都要连续发送多个报文,所以高速缓存大大提高ARP的效率。
在ARP请求报文中还放入源主机的“IP地址——物理地址”的地址对,源主机在广播ARP请求时,网络上所有主机都可以知道该源主机的“IP地址——物理地址”的地址对并将其存入自己的缓存。
在新主机入网时,令其主动广播其地址映射,以减少其他主机进行ARP请求。
(5)网卡具有如下的几种工作模式:
广播模式(BroadCastModel):
它的物理地址(MAC)地址是0Xffffff的帧为广播帧,工作在广播模式的网卡接收广播帧。
多播传送(MultiCastModel):
多播传送地址作为目的物理地址的帧可以被组内的其它主机同时接收,而组外主机却接收不到。
但是,如果将网卡设置为多播传送模式,它可以接收所有的多播传送帧,而不论它是不是组内成员。
直接模式(DirectModel):
工作在直接模式下的网卡只接收目地址是自己Mac地址的帧。
混杂模式(PromiscuousModel):
工作在混杂模式下的网卡接收所有的流过网卡的帧,信包捕获程序就是在这种模式下运行的。
(6)ARP帧的数据结构表达方式:
以太网帧头中的前两个字段是以太网的目的地址和源地址。
目的地址为全1时为广播地址。
两个字节长的以太网帧类型表示后面数据的类型。
对于ARP请求或应答来说,该字段的值为0X0806.
硬件类型字段:
指明了发送方想知道的硬件地址的类型,以太网的值为1;
协议类型字段:
表示要映射的协议地址类型,IP为0X0800;
硬件地址长度和协议地址长度:
指明了硬件地址和高层协议地址的长度,这样ARP帧就可以在任意硬件和任意协议的网络中使用。
对于以太网上IP地址的ARP请求或应答来说,它们的值分别为6和4;
操作字段:
用来表示这个报文的类型,ARP请求为1,ARP响应为2,RARP请求为3,RARP响应为4;
发送端的以太网地址:
源主机硬件地址,6个字节;
发送端IP地址:
发送端的协议地址(IP地址),4个字节;
目的以太网地址:
目的端硬件地址,6个字节;
目的IP地址:
目的端的协议地址(IP地址),4个字节。
2运行结果:
3实现程序的基本结构流程
四得意之出:
本程序能够实现课程设计要求的全部内容。
程序运行后,能够进行网卡的选择,并且可以通过指定的网卡发送帧。
自行构造和发送ARP请求数据帧。
并且数据帧的封装属性齐全,物理帧、ARP帧、IP数据帧的所需基本属性全部包括在内。
可以将局域网中的所有活动主机的IP地址和MAC地址的对应关系一一显示出来。
构造的APR数据帧进行整体的发送,并在能解析目的主机相应的数据帧。
整个程序的流程简单,注释较为详细,有助于对程序的理解。
程序的运行过程简单,容易使用。
程序的帮助信息详细,运用方法有详细的文字说明,可以按照指引信息方便的运行程序。
通过整个程序可以对APR解析协议的实现过程有深刻的理解。
五技术实现:
1重点技术实现:
(1)帧的封装技术,自行构造数据帧。
将物理帧、ARP帧、IP数据报头封装为一个结构体。
(2)ARP请求数据帧的发送。
发送ARP请求数据报,请求获得目的ip的mac地址。
以本地主机mac地址作为源地址,以物理广播地址作为物理帧目的地址,ARP帧目的地址置0。
初始化一个_PACKET结构,最后发送数据报。
2核心程序以及技术实现简介:
1)帧的封装:
(1)物理帧头部结构:
typedefstructethernet_head
{
unsignedchareh_dest_mac[6];
unsignedchareh_source_mac[6];
unsignedshorteh_type;
}ethernet_head,*pEthernetHead;
其中:
eh_dest_mac[6]为目标主机的MAC地址;
eh_source_mac[6]本地主机的MAC地址;
eh_type为MAC地址的类型;
(2)ARP帧结构:
typedefstructarpHead
{
unsignedshortarp_hardwaretype;
unsignedshortarp_protocoltype;
unsignedchararp_har_len;
unsignedchararp_pro_len;
unsignedshortarp_option;
unsignedchararp_sour_addr[6];
unsignedlongarp_sour_ip;
unsignedchararp_dest_addr[6];
unsignedlongarp_dest_ip;
unsignedcharpadding[18];
}arpHead,*pArpHead;
其中:
arp_hardwaretype为硬件类型(2bit)码
arp_protocoltype为协议类型(2bit)码
arp_har_len为硬件地址长度(1bit)
arp_pro_len为协议地址长度(1bit)
arp_option为操作号(2bit)
arp_sour_addr[6]为源硬件地址(6bit)
arp_sour_ip为源协议地址(4bit)
arp_dest_addr[6]为目的硬件地址(6bit)
arp_dest_ip为目的协议地址(4bit)
padding[18]为填充数据(18bit)
(3)IP数据报头结构:
typedefstructipHead
{
unsignedcharh_lenver;
unsignedchartos;
unsignedshorttotal_len;
unsignedshortident;
unsignedshortfrag_and_flags;
unsignedcharttl;
unsignedcharproto;
unsignedshortchecksum;
unsignedintsourceip;
unsignedintdestip;
}ipHead,*PipHead;
其中:
h_lenver为版本(4bits)+首部长度(4bits)
Tos为服务类型(Typeofservice)
total_len为IP数据报总长(Totallength)
ident为IP数据报标识(Identification)
frag_and_flag为标志位(Flags)(3bits)+段偏移量(Fragmentoffset)(13bits)
ttl为IP数据报存活时间(Timetolive)
proto为协议(Protocol)
checksum为IP数据报首部校验和(Headerchecksum)
sourceip为源地址(Sourceaddress)
destip为目的地址(Destinationaddress)
(4)发送ARP请求数据帧
/*发送ARPRequest数据报,请求获得目的ip的mac地址*/
DWORDWINAPItransmit(LPVOIDno)
{
inti;
charsendbuf[1024];//发送缓存
ethernet_headeth;
arpHeadarp;
/*初始化mac地址和ip地址,以本地主机mac地址作为源地址,以物理广播地址作为物理帧目的地址,ARP帧目的地址置0*/
for(i=0;i<6;i++)
{
eth.eh_dest_mac[i]=0xff;
arp.arp_dest_addr[i]=0x00;
}
memcpy(eth.eh_source_mac,mymac,6);
eth.eh_type=htons(ETH_ARP);
arp.arp_hardwaretype=htons(ARP_HARDWARE);//硬件类型0x0001,并将16位的主机字节顺序转化为16位的网络字节顺序
arp.arp_protocoltype=htons(ETH_IP);//协议类型0x0800
arp.arp_har_len=6;
arp.arp_pro_len=4;
arp.arp_option=htons(ARP_REQUEST);//操作字段写入1
arp.arp_sour_ip=htonl(myip);//将本机ip地址作为源ip地址,并将32位的主机字节顺序转化为32位的网络字节顺序
memcpy(arp.arp_sour_addr,mymac,6);//本机mac地址作为源mac地址
arp.arp_dest_ip=htonl((myip&0xffffff00)+1+(num++));//本地主机IP与子网掩码“与”运算得到网关IP
memset(sendbuf,0,sizeof(sendbuf));//初始化发送缓存
memcpy(sendbuf,ð,sizeof(eth));//把eth放入发送缓存
memcpy(sendbuf+sizeof(eth),&arp,sizeof(arp));//把arp放入发送缓存
//初始化一个_PACKET结构
PacketInitPacket(lppackets,sendbuf,sizeof(eth)+sizeof(arp));
//发送数据报,不成功时退出
if(PacketSendPacket(lpadapter,lppackets,TRUE)==FALSE)
{
printf("PacketSendPacketintransmitError:
&d\n",GetLastError());
return-1;
}
return0;
}
发送ARP请求数据帧的过程如下:
首先发送ARPRequest数据报,请求获得目的ip的mac地址。
接着初始化mac地址和ip地址,以本地主机mac地址作为源地址,以物理广播地址作为物理帧目的地址,ARP帧目的地址置0。
将硬件类型设为0x0001,并将16位的主机字节顺序转化为16位的网络字节顺序。
将协议类型设为0x0800。
将本机ip地址作为源ip地址,并将32位的主机字节顺序转化为32位的网络字节顺序。
将本机mac地址作为源mac地址。
将本地主机IP与子网掩码“与”运算得到网关IP。
初始化一个_PACKET结构,最后发送数据报,不成功时退出。
六课程设计中目前存在的问题:
程序应用了winpcap的wpdpack开发包,在其他C++环境的机器上无法通过编译,需要安装wpdpack开发包并且进行相关设置才能正常使用。
程序中有许多部分是网上查找的,没有将他变成自己的东西,加以运用。
七设计实践过程中的自我感受:
本次课程设计主要是让我们对计算机通信与网络方面的知识有所了解。
我们所选的题目是使用ARP发现局域网内的活动主机,主要是对ARP解析协议的运作过程作深入的了解。
整个课程设计的过程,首先要对网络方面关于ARP协议的知识进行回顾,因此找此方面的资料便是应当做的首要任务。
我们通过阅读此方面的书籍熟练掌握ARP协议的详细过程。
在网际协议中定义的是因特网的IP地址,但在实际进行通信时,物理层不能识别IP地址只能识别物理地址。
因此,需在IP地址与物理地址之间建立映射关系,地址之间的这种映射称为地址解析。
ARP地址解析协议就是实现地址之间的这种映射关系的。
ARP地址解析协议的整个运作过程我简单的理解为:
源主机广播一个ARP请求报文,请求目的主机回答其物理地址。
网上所有主机都能收到该ARP请求,并将本机IP地址与请求的IP地址比较,目的主机识别出自己的地址IP,并作出回应,通报自己的物理地址。
源主机收到这个ARP回应包后,就可以与目的主机进行通信。
了解APR协议的过程,是编写程序的基本要求。
在对ARP协议的过程熟悉之后,便是设计程序的流程图,并编写程序。
程序的编写我们使用的是C++语言,但是我们之前对C++的使用并不是很熟悉,只对浅层次的功能有所了解。
因此对我们的程序编写造成了很大的阻碍。
使我们不得不对C++这门语言更深入的学习。
程序的有些部分是在网上找到的,对程序不是很理解,出现了错误也不知道如何修改。
我们通过请教老师、同学对程序进行改正。
在网上对每个函数、变量进行查找,学习这些函数的使用,参数的传递,最终调试成功。
整个过程不是很顺利,但是运行成功后的喜悦是不言而喻的。
在整个设计的过程中,我负责对构造和发送APR请求数据帧。
因此我要对物理帧、ARP帧和IP数据报的结构进行了解。
我在网上查找帧的结构,每个帧包含的属性、每个属性的类型以及属性的值应该如何定义。
在这之前我对这些帧的了解,还停留在初步认识,仅知道每种帧在哪一层进行传递,这些帧的内部结构也只知道少数常用的属性,记忆也并不深刻。
由于这次课程设计的原因,使我必须对帧的结构进行了解,才能对构造出一个完整的类,方便数据帧的发送与接收。
但是仍有个别属性的作用不是很清楚,例如:
协议类型字段的作用,它是表示要映射的协议地址类型,IP为0X0800。
由于时间原因没能详细理解,不过我会利用以后的时间对它们进行逐个深入的学习。
通过本次课程设计,使我对网络方面的知识有了更深入的认识。
深刻体会了ARP协议的帧结构及运作过程,让我们把网络课上学到得书面的知识在实践中加以运用,深入理解。
并且增强了我们的合作能力,学会和同伴一起去完成任务。
本次课程设计确实不容易做,很多东西都是自己没学过的。
整个过程要不断地学习,借鉴别人的程序。
学会自己去学习和探索知识,把别人的东西加以利用变成自己的东西,我想这就是课程设计的真正目的。
知识的海洋是无穷无尽的,我们要不断地学习。
参考文献
1.《计算机网络课程设计》吴功宜等编著/2005年09月/机械工业出版社
2.《C++程序设计》谭浩强编著/2004年07月/清华大学出版社
3.《TCP/IP协议及网络编程技术》罗军舟等编著/2004年/清华大学出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 使用 ARP 发现 局域网 活动 主机