您的位置 首页 编程

ARP的组成与解析及单片机程序

简介arp:地址解析协议,简单的来说,对于底层的以太网通讯,有两个地址需要了解,一个地址叫ip地址,第二个地址叫mac地址,只有知道了这两

简介

arp:地址解析协议,简略的来说,关于底层的以太网通讯,有两个地址需求了解,一个地址叫ip地址,第二个地址叫mac地址,只要知道了这两个地址,才能够进行点对点的通讯,那么有的时分,体系只知道IP地址,不知道mac地址,那么这个时分,怎么办呢?就用arp协议,arp协议归于网络层,和ip协议平级,他是以播送方式宣布的,宣布时,带有一个方针ip,契合方针ip的主机收到这个信息后,就会把自己的mac地址依照arp协议告知问询主机。这便是arp。

关于arp的组成
arp分为问包和答包,一般有42个字节组成,发送接纳一般都是42个字节。
arp包由以太网帧,arp报文组成,帧数据为,方针地址以播送方式,即6个0xff。源地址则是自己的mac地址。类型则为0x0806,这样,以播送的方式发送给一切机器。(疑问,这个播送是怎么传递到方针ip的呢?经过路由器,那么这个arp是怎么挑选目的地的呢?在局域网内还好点,但在广域网内,就不知道了),以上是以太网帧类型,以太网帧后边则是,arp帧,arp帧首要包含着2位硬件类型,2位协议类型,一般是0x8000,后边跟的是mac长度和ip长度,一般是6和4,便是mac地址和ip的字节数。最终是一个问答字节,0001代表问,0002代表答

解析
解析的时分,首要判别以太网帧类型是否为arp,若为arp,则判别是否为问指令,若为问指令则持续判别ip字节,一般的情况下,mac便是6个字节,但ip则因为版别不一样,ip地址字节数也不一样,所以判别ip字节数即可,若悉数经过,则进行arp应对。

应对
应对进程:1、首要装入mac地址
2、然后将自己的mac地址填入源地址,
3、改动问答包
4、装入ip数据
5、发送

下面是51单片机驱动enc28j60的驱动
//方针mac地址
#define ETH_DST_MAC 0
//源mac地址
#define ETH_SRC_MAC 6
#define ETH_DST_MAC 0
#define ARP_SRC_MAC 0x16 //arp包中的发端mac
#define ARP_SRC_IP 0x1c //arp包中的发端ip
#define ARP_DST_MAC 0x20 //arp包中的收端mac
#define ARP_DST_IP 0x26 //arp包中的方针ip
#define ARP_DST_IP_0 0x26
#define ARP_DST_IP_1 0x27
#define ARP_DST_IP_2 0x28
#define ARP_DST_IP_3 0x29
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//arp解析句子
if(eth_ip_type == ETH_TYPE_ARP) //arp类型
{
if(buf[ARP_PLEN] == ARP_PLEN_VALUE) //判别协议字节是否为4,若为4,则是ipv4,进行ip比较
{
//检测IP地址,假如是本机ip则进行回来处理,假如不是ip则不处理
if((buf[ARP_DST_IP_0] == myip[0]) && (buf[ARP_DST_IP_1] == myip[1]) && (buf[ARP_DST_IP_2] == myip[2]) && (buf[ARP_DST_IP_3] == myip[3]))
{
//判别是否为问数据
if(buf[ARP_OP] == 0x01)
{
//进行回来数据处理
eth_arp_ack(buf);
return 0;
}
}
}
}
//////////////////////////////////////////////////////////////////////////////////////////////
arp应对函数
void eth_arp_ack(u8 *buf)
{
u8 i = 0;
//制造方针地址,源地址,发端地址,收端地址
while(i < 6)
{
buf[ETH_DST_MAC + i] = buf[ETH_SRC_MAC + i]; //方针地址
buf[ARP_DST_MAC + i] = buf[ETH_SRC_MAC + i]; //收端地址

buf[ETH_SRC_MAC + i] = mymac[i]; //源地址
buf[ARP_SRC_MAC + i] = mymac[i]; //发端地址

i++;
}

buf[ARP_OP] = ARP_OP_ACK;

i = 0;

while(i<4)
{
buf[ARP_DST_IP + i] = buf[ARP_SRC_IP + i];
buf[ARP_SRC_IP + i] = myip[i];
i++;
}
// eth+arp is 42 bytes:
enc28j60PacketSend(42,buf);
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/biancheng/318725.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部