一、ARP的功能
ARP的基本功能是使用目标主机的IP(网络地址)地址,查询对应的MAC(物理地址)地址,以保证底层连路上数据包通信的进行。
二、ARP的种类
ARP的种类包括两种:
ARP请求包--通过以太网广播的方式发送的,用于向具有某个IP地址的主机发送请求,希望该主机返回其MAC地址。
ARP应答包--收到ARP请求的主机会比对该数据包的IP地址与自己的IP地址是否符合,如果是,则向源主机返回一个ARP应答包,向主机报告自己的MAC地址。
三、ARP功能举例
假如开发板(192.168.1.11)需要向电脑(192.168.1.37)发送一个IP数据包,当发送数据时,开发板并不知道电脑的MAC地址,所以开发板会发送一个广播包(ARP请求 以太网的目的地址为 全FF ),同一网段所有的电脑都会收到广播(192.168.1.37的MAC地址是多少,快回答我),电脑为(192.168.1.37)的接收到这个广播后,有义务回答(ARP应答包),192.168.1.37的MAC地址是(04-02-35-00-00-01),这样开发板就知道电脑(192.168.1.37)的MAC地址了,然后才能发送数据。
四、ARP报文
ARP请求和ARP应答都是组装在一个ARP数据包中发送的,上图是一个典型的ARP包的组成结构。
以太网目的地址:以太网的目的MAC地址,全为1的特殊地址是以太网的广播地址。
以太网源地址:以太网的源MAC地址。
帧类型:0x0806为ARP包 0x0800为IP包。
硬件类型:对于以太网MAC地址他的值为1.
协议类型:0x0800表示映射为IP地址。
硬件地址长度:MAC地址的长度6字节
协议地址长度:IP地址的长度4字节
OP:ARP数据包的类型 1 - ARP请求 2 - ARP应答
发送方以太网地址:源MAC地址
发送方协议地址:源IP地址
接收方以太网地址:目的MAC地址
接收方协议地址:目的IP地址
五、ARP请求包
void eth_arp_request(u8 *buf)//arp地址解析
{
uint8_t i = 0;
while(i < 6)
{
buf[ETH_DST_MAC + i] = 0xff;//目的地址 广播
buf[ETH_SRC_MAC + i] = network.s_mac[i];//源地址
i++;
}
buf[ETH_TYPE_H_P] = ETHTYPE_ARP_H_V;
buf[ETH_TYPE_L_P] = ETHTYPE_ARP_L_V;//长度类型 0x0800 代表IP数据包 0x0806代表ARP包
buf[14] = 0;
buf[15] = 1;//这两个字节代表硬件类型 对入MAC地址值是1
buf[16] = 8;
buf[17] = 0;//这两个是代表协议类型 表示要映射的协议地址类型 值是0x0800
buf[18] = 6;//硬件地址长度
buf[19] = 4;//协议地址长度
buf[ETH_ARP_OPCODE_H_P]=ETH_ARP_OPCODE_REQUEST_H_V;
buf[ETH_ARP_OPCODE_L_P]=ETH_ARP_OPCODE_REQUEST_L_V;//这两个字节代表ARP的数据包类型 01为请求 02为应答
i = 0;
while(i < 6)
{
buf[ETH_ARP_SRC_MAC_P+i] = network.s_mac[i];//源地址 发送方以太网地址
//buf[ETH_ARP_DST_MAC_P+i]=0;
i++;
}
i = 0;
while(i < 4)
{
buf[ETH_ARP_SRC_IP_P+i]= network.s_ip[i];//发送方IP地址
i++;
}
i = 0;
while(i < 6)
{
buf[ETH_ARP_DST_MAC_P+i]=0;//接收放MAC地址 ARP请求获取 所以填0
i++;
}
i = 0;
while(i < 4)
{
buf[ETH_ARP_DST_IP_P+i]= network.t_ip[i];//接收方IP
i++;
}
enc28j60PacketSend(42,buf);
}
六、main函数代码
其中eth_type_is_arp_and_my_ip(buf,len)是判断是否是自己的IP对应的ARP包
7、实验结果
8、完整的工程
我使用的是stm32c8t6单片机,工程是keil建的
网址点击打开链接http://download.csdn.net/detail/chen244798611/9725012