实验2 基于ARP协议获取局域网活动主机的物理地址(MAC地址)
实验目的
1、掌握ARP协议分组结构与协议运作过程;初中数学总复习
2、了解ARP协议获取活动主机MAC地址的方法与软件实现;
实验原理
实验环境(设备)
windows XP
Visual Studio 2008
实验内容
【实验方案设计】
(1)掌握ARP协议分组结构与协议运作过程;
(2) 了解ARP协议获取活动主机MAC地址的方法与软件实现;
(3)在windows平台上构造自定义数据帧,并通过指定网络适配器(网卡)发送的基本方法。
【实验过程】(实验步骤、记录、数据、分析)
(1)掌握ARP协议分组结构与协议运作过程;
什么是ARP? ARP (Address Resolution Protocol) 是个地址解析协议。最直白的说法是:在IP以太网中,当一个上层协议要发包时,有了该节点的IP地址,ARP就能提供该节点的MAC地址。
在实际的应用中,我们经常会遇到这样的问题:已经知道一个机器的IP地址,需要出其相应的物理地址,ARP地址解析协议就是用来解决这个问题的。
ARP协议的分组结构:
ARP帧结构
金喜善裸照struct ethernet_head
{ // 物理帧帧头结构 unsigned char dest_mac[6]; //目的MAC地址 unsigned char source_mac[6]; //源MAC地址
unsigned short eh_type; //帧类型
};
/*ARP帧数据结构*/
typedef struct ARPFrame
{
unsigned short hardware_type; //硬件类型 unsigned short protocol_type; //协议类型 unsigned char add_len; //MAC硬件地址长度 unsigned char pro_len; //IP地址长度 unsigned short Flag //ARP操作:1表示请求,2表示应答
unsigned char sour_addr[6]; //源MAC地址:发送方的MAC地址
unsigned long sour_IP; / /源IP地址:发送方的IP地址 unsigned char dest_addr[6]; //目的MAC地址
unsigned long dest_IP; //目的IP地址 unsigned char padding[18];
};
ARP协议的工作原理:
1)在局域网中,网络中实际传输的是“帧”,帧里面是有目标主机的MAC地址的。
2) 在以太网中,一个主机要和另一个主机进行直接通信,必须要知道目标主机的MAC地址。所谓“地址解析”就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。
3) ARP协议的基本功能就是通过目标设备的IP地址,查询目标主机的MAC地址,以保证通信的顺利进行。
(2) 了解ARP协议获取活动主机MAC地址的方法与软件实现
世界名牌音箱 1、ARP协议获取活动主机的MAC地址:
每个主机都设有一个ARP高速缓存,里面有本局域网上各主机和路由器 的IP地址到硬件地址的映射表。当某主机要向该局域网的另一个主机发送信息时,先在其ARP高速缓存中查看有无该地址,如果有就查出其对应的硬件地址,写入MAC帧,然后把该帧发往目的地址。如果ARP高速缓存中没有该地址,则源主机自动运行ARP,其运作过程如下:
(1)ARP进程在本局域网上广播发送ARP请求,把自己的ARP地址到硬件地址的映射写入ARP请求中。
(2)在本局域网上的所有主机上运行的ARP进程均收到此ARP请求分组。
(3)目的主机在ARP请求中见到自己的IP地址, 并向源主机发送ARP响应,并写下自己的硬件地址。其余的主机都不理睬
(4)源主机收到目的主机的响应后,就在ARP告诉缓存中写入目的主机的IP地址到硬件地址的映射
2、 特殊情况:
ARP是解决同一个局域网上的主机或路由器的IP地址和硬件地址的映射问题。如果所要的目标主机办理营业执照和源主机不在同一个局域网上。则
(1) 此时主机A就无法解析出主机B的硬件地址
(2) 个人养老金账户查询此时主机A需要的是将路由器R1的IP地址解析出来,然后将该IP数据报发送给路由器R1.
(3) R1从路由表中出下一跳路由器R2,同时使用ARP解析出R2的硬件地址。于是IP数据报按照路由器R2的硬件地址转发到路由器R2。
水鱼怎么杀(4) 路由器R2在转发这个IP数据报时用类似方法解析出目的主机B的硬件地址,使IP数据报最终交付给主机B.
核心代码:
int GetSelfMac() //获得自己主机的MAC地址{
unsigned char sendbuf[42]; //ARP包结构大小
int i = -1;
int res;
ethernet_head eh;
arp_head ah;
struct pcap_pkthdr * pkt_header;
const u_char * pkt_data;
memset(eh.dest_mac_add,0xff,6);
memset(eh.source_mac_add,0x0f,6);
memset(ah.source_mac_add,0x0f,6);
memset(ah.dest_mac_add,0x00,6);
eh.type = htons(ETH_ARP);
ah.hardware_type = htons(ARP_HARDWARE);
ah.protocol_type = htons(ETH_IP);
ah.hardware_add_len = 6;
ah.protocol_add_len = 4;
ah.source_ip_add = inet_addr("219.219.71.230"); //请求方的ip
ah.operation_field = htons(ARP_REQUEST);
// unsigned long ip;
// ip = ntohl(inet_addr("192.168.1.101"));
// ah.dest_ip_add =htonl(ip + loop);
ah.dest_ip_add = localIP;//inet_addr("192.168.1.102");
memset(sendbuf,0,sizeof(sendbuf));
memcpy(sendbuf,&eh,sizeof(eh));
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论