广工计算机网络课程设计.docx
《广工计算机网络课程设计.docx》由会员分享,可在线阅读,更多相关《广工计算机网络课程设计.docx(9页珍藏版)》请在冰豆网上搜索。
广工计算机网络课程设计
标准化管理处编码[BBX968T-XBB8968-NNJ668-MM9N]
广工计算机网络课程设计
课程设计
课程名称计算机网络
题目名称使用ARP获取局域网
内部活动主机的物理地址
学生学院计算机学院
专业班级
学号
学生姓名
指导教师
2013年1月6日
计算机网络课程设计任务书
设计题目
使用ARP协议获取局域网内部活动主机的物理地址
已知技术参数和设计要求
1.已知参数:
选择适当的网络适配器,以绑定Winpcap(利用Win32环境下数据包捕获的开发代码函数库实现抓包和分析)。
2.设计要求:
定义和封装ARP数据包,将主机对应的网卡设置成混杂模式,截取局域网的数据包,并设置过滤后获取ARP包,分析ARP包,获得活动主机的物理地址。
协议包的格式定义ARP包结构并初始化。
如何获取主机的网卡列表
如何将网卡的工作方式设置为混杂模式
如何过滤ARP数据包
如何解析目的主机的响应ARP帧
用列表的方式显示局域网当前各活动主机的物理地址。
设计内容与步骤
1.熟悉ARP协议的工作原理;
2.熟悉ARP协议相关数据帧结构;
3.构造ARP请求数据帧;
4.使用Winpcap相关函数(ARP包的发送函数)实现数据帧的发送;
5.接收及解析目的主机的响应数据帧;
6.获得IP地址与MAC地址的对应关系并显示;
设计工作计划与进度安排
1.知识准备,整体思路设计2小时
2.开发环境与程序调试环境4小时
3.构造协议需要的相关数据帧,使用标准数据帧结构2小时
4.数据帧的发送10小时
5.接收、解析目的主机的相应数据帧,并显示结果12小时
6.完成课程设计报告5小时
使用ARP协议获取局域网内部活动主机的物理地址
1.实验需求分析
实验要求
定义和封装ARP数据包,将主机对应的网卡设置成混杂模式,截取局域网的数据包,并设置过滤后获取ARP包,分析ARP包,获得活动主机的物理地址。
实验内容与步骤
(1).熟悉ARP协议的工作原理;
(2).熟悉ARP协议相关数据帧结构;
(3).构造ARP请求数据帧;
(4).使用Winpcap相关函数(ARP包的发送函数)实现数据帧的发送;
(5).接收及解析目的主机的响应数据帧;
(6.)获得IP地址与MAC地址的对应关系并显示;
编程环境
Win7,visualstudio2010,wincap
2.项目设计
概要设计
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协议工作的过程如下:
广播一个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个字节。
(7)WinPcap是用于网络封包抓取的一套工具,可适用于32位的操作平台上解析网络封包,包含了核心的封包过滤,一个底层动态链接库,和一个高层系统函数库,及可用来直接存取封包的应用程序界面。
Winpcap是一个免费公开的软件系统。
它用于windows系统下的直接的网络编程。
3.数据结构
n");
return-1;
}
printf("\n");
printf("请选择要打开的网卡号(1-%d):
",i);
scanf("%d",&inum);
if(inum<1||inum>i)
{
printf("\n该网卡号超过现有网卡数!
请按任意键退出…\n");
getchar();
getchar();
/*释放设备列表*/
pcap_freealldevs(alldevs);
return-1;
}
/*跳转到选中的适配器*/
for(d=alldevs,i=0;inext,i++);
/*打开设备*/
if((adhandle=pcap_open(d->name,适配器%s不被WinPcap支持\n",d->name);
/*释放设备列表*/
pcap_freealldevs(alldevs);
return-1;
}
ifget(d,ip_addr,ip_netmask);.\n",inum);
/*释放设备列表*/
pcap_freealldevs(alldevs);
getchar();
getchar();
return0;
}
/*获取可用信息*/
voidifget(pcap_if_t*d,char*ip_addr,char*ip_netmask)
{
pcap_addr_t*a;
charip6str[128];
/*IPaddresses*/
for(a=d->addresses;a;a=a->next)
{
switch(a->addr->sa_family)
{
caseAF_INET:
if(a->addr)
{
char*ipstr;
ipstr=iptos(((structsockaddr_in*)a->addr)->;d.%d.%d",p[0],p[1],p[2],p[3]);
returnoutput[which];
}
char*ip6tos(structsockaddr*sockaddr,char*address,intaddrlen)
{
socklen_tsockaddrlen;
#ifdefWIN32
sockaddrlen=sizeof(structsockaddr_in6);
#else
sockaddrlen=sizeof(structsockaddr_storage);
#endif
if(getnameinfo(sockaddr,
sockaddrlen,
address,
addrlen,
NULL,
0,
NI_NUMERICHOST)!
=0)address=NULL;
returnaddress;
}
/*获取自己主机的MAC地址*/
intGetSelfMac(pcap_t*adhandle,constchar*ip_addr,unsignedchar*ip_mac)
{
unsignedcharsendbuf[42];d.%d.%dMAC地址:
",recv->&255,recv->>>8&255,recv->>>16&255,recv->>>24&255);
for(inti=0;i<6;i++)
{
Mac[i]=*(unsignedchar*)(pkt_data+22+i);
printf("%02x",Mac[i]);
}
printf("\n");
}
}
}
Sleep(10);
}
return0;
}
5.实验结果
6.实验总结
实验中最难做的是vs2010的环境变量的设置,找了很多的网站才找到此环境变量的图解。
对vs2010的认识更深了,更需加强对软件的应用。