单片机enc28j60的ARP实验

一、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








  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

做了不一定能实现但不做一定不会实现

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值