当前位置:首页 > 单片机 > 单片机
[导读] 1. ARP的简介Address Resolution Protocol-地址解析协议ARP为IP地址到对应的硬件地址之间提供动态映射。从逻辑Internet地址到对应的物理硬件地址需要进行翻译。这就是ARP的功能。ARP的功能是在32 bit的

1. ARP的简介

Address Resolution Protocol-地址解析协议

ARP为IP地址到对应的硬件地址之间提供动态映射。从逻辑Internet地址到对应的物理硬件地址需要进行翻译。这就是ARP的功能。ARP的功能是在32 bit的IP地址和采用不同网络技术的硬件地址之间提供动态映射。


2. ARP的应答流程


任何时候我们敲入下面这个形式的命令:

[html]view plaincopy

  1. %ftpbsdi//示例而已

都会进行以下这些步骤。这些步骤的序号如图 4 - 2所示。

1) 应用程序FTP客户端调用函数gethostbyname(3)把主机名(bsdi)转换成32 bit的IP地址。这个函数在DNS(域名系统)中称作解析器,我们将在第1 4章对它进行介绍。这个转换过程或者使用DNS,或者在较小网络中使用一个静态的主机文件(/etc/hosts) 。

2) FTP客户端请求TCP用得到的IP地址建立连接。

3) TCP发送一个连接请求分段到远端的主机,即用上述 IP地址发送一份IP数据报(在第1 8章我们将讨论完成这个过程的细节) 。

4) 如果目的主机在本地网络上(如以太网、令牌环网或点对点链接的另一端) ,那么IP数据报可以直接送到目的主机上。如果目的主机在一个远程网络上,那么就通过 IP选路函数来确定位于本地网络上的下一站路由器地址,并让它转发 IP数据报。在这两种情况下,IP数据报都是被送到位于本地网络上的一台主机或路由器。

5) 假定是一个以太网,那么发送端主机必须把 32 bit的IP地址变换成48 bit的以太网地址。从逻辑Internet地址到对应的物理硬件地址需要进行翻译。这就是 ARP的功能。ARP本来是用于广播网络的,有许多主机或路由器连在同一个网络上。

6) ARP发送一份称作ARP请求的以太网数据帧给以太网上的每个主机。这个过程称作广播,如图 4 - 2中的虚线所示。 ARP请求数据帧中包含目的主机的IP地址(主机名为bsdi) ,其意思是“如果你是这个IP地址的拥有者,请回答你的硬件地址。 ”

7) 目的主机的ARP层收到这份广播报文后,识别出这是发送端在寻问它的 IP地址,于是发送一个ARP应答。这个ARP应答包含IP地址及对应的硬件地址。

8) 收到ARP应答后,使ARP进行请求—应答交换的IP数据报现在就可以传送了。

9) 发送IP数据报到目的主机。

3. ARP的分组格式


?以太网报头中的前两个字段是以太网的源地址和目的地址。目的地址为全 1的特殊地址是广播地址。电缆上的所有以太网接口都要接收广播的数据帧。

?两个字节长的以太网帧类型表示后面数据的类型。对于 A R P请求或应答来说,该字段的值为0 x 0 8 0 6。

?硬件类型字段表示硬件地址的类型。它的值为 1即表示以太网地址。

?协议类型字段表示要映射的协议地址类型。它的值为 0 x 0 8 0 0即表示I P地址。它的值与包含I P数据报的以太网数据帧中的类型字段的值相同,这是有意设计的(参见图 2 - 1) -忘了截过来了。

?接下来的两个1字节的字段,硬件地址长度和协议地址长度分别指出硬件地址和协议地址的长度,以字节为单位。对于以太网上I P地址的ARP请求或应答来说,它们的值分别为6和4。

?操作字段(op)指出四种操作类型,它们是 ARP请求(值为1) 、ARP应答(值为2) 、RARP请求(值为3)和R ARP应答(值为4) (我们在第5章讨论RARP) 。这个字段必需的,因为ARP请求和ARP应答的帧类型字段值是相同的。

?接下来的四个字段是发送端的硬件地址(在本例中是以太网地址) 、发送端的协议地址(IP地址) 、目的端的硬件地址和目的端的协议地址。注意,这里有一些重复信息:在以太网的数据帧报头中和ARP请求数据帧中都有发送端的硬件地址。

对于一个ARP请求来说,除目的端硬件地址外的所有其他的字段都有填充值。当系统收到一份目的端为本机的 ARP请求报文后,它就把硬件地址填进去,然后用两个目的端地址分别替换两个发送端地址,并把操作字段置为 2,最后把它发送回去。

--------------------------------以上内容整理于《TCP/IP协议详解:卷1》----------------------------

理是那个那个理,但是过于抽象了,不过是基础,看完上面再看实现,那感觉很爽的~~~

------------------------------------------以下内容产生于代码及分析--------------------------------------

4. ARP的宏定义实现

以太网协议而非802.3协议,看ETH命名的头名字就晓得了,地址位置可以结合两个header算算就出来了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27


//*******ARP*******
//ARP包长度
#defineETH_ARP_PACKET_LEN28

//硬件地址长度值
#defineETHTYPE_ARP_L_V0x06
//协议地址长度值
#defineETHTYPE_ARP_PROTOCOL_SIZE_V0x04
//操作码位置2字节
#defineETH_ARP_OPCODE_H_P0x14
#defineETH_ARP_OPCODE_L_P0x15
//ARP请求操作码值
#defineETH_ARP_OPCODE_REQUEST_V0x0001
#defineETH_ARP_OPCODE_REQUEST_H_V0x00
#defineETH_ARP_OPCODE_REQUEST_L_V0x01
//ARP响应操作码值
#defineETH_ARP_OPCODE_REPLY_V0x0002
#defineETH_ARP_OPCODE_REPLY_H_V0x00
#defineETH_ARP_OPCODE_REPLY_L_V0x02
//发送者源硬件地址位置6字节
#defineETH_ARP_SRC_MAC_P0x16
//发送者源IP地址位置4字节
#defineETH_ARP_SRC_IP_P0x1c
//目标硬件地址位置6字节
#defineETH_ARP_DST_MAC_P0x20
//目标IP地址位置4字节
#defineETH_ARP_DST_IP_P0x26

5. ARP的实现函数

以太网的header在ARP的header之前,很简单的,介绍先。

配置以太网的头,为14字节:6字节目的mac地址+6字节源mac地址+2字节协议类型,如图4-3

1
2
3
4
5
6
7
8
9
10
11
12
13


//makeareturnethheaderfromareceivedethpacket
voidmake_eth(unsignedchar*buf)
{
unsignedchari=0;

//copythedestinationmacfromthesourceandfillmymacintosrc
while(i{
buf[ETH_DST_MAC+i]=buf[ETH_SRC_MAC+i];
buf[ETH_SRC_MAC+i]=macaddr[i];
i++;
}
}


展开就是这样的,看看宏定义是否与此一一对应呢。


在判断为arp请求之后,填充以太网的头之后响应arp请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31


voidmake_arp_answer_from_request(unsignedchar*buf)
{
unsignedchari=0;
//配置以太网的头,为14字节:6字节目的mac地址+6字节源mac地址+2字节协议类型
make_eth(buf);
buf[ETH_ARP_OPCODE_H_P]=ETH_ARP_OPCODE_REPLY_H_V;//arp响应
buf[ETH_ARP_OPCODE_L_P]=ETH_ARP_OPCODE_REPLY_L_V;

//后面的ARP_DEBUG插入此处即可。

//fillthemacaddresses:
while(i{
buf[ETH_ARP_DST_MAC_P+i]=buf[ETH_ARP_SRC_MAC_P+i];
buf[ETH_ARP_SRC_MAC_P+i]=macaddr[i];
i++;
}

i=0;
//filltheipv4addresses
while(i{
buf[ETH_ARP_DST_IP_P+i]=buf[ETH_ARP_SRC_IP_P+i];
buf[ETH_ARP_SRC_IP_P+i]=ipaddr[i];
i++;
}

//eth+arpis42bytes:
enc28j60PacketSend(ETH_HEADER_LEN+ETH_ARP_PACKET_LEN,buf);
}

当然,响应ARP请求的前提是你得确定有人向你发出ARP请求(下面那个函数就是了),并且这个人是谁,你是要知道的(通过发送者的IP和MAC地址),这个很容易,本协议是将地址放在几个全局变量里面的,大家就都知道了,虽然全局变量用起来很爽,但是对模块化以及后期维护带来的不便也是很大的。

检查是否为合法的eth,并且只接受发给本机的arp数据,此函数在上面那个函数之前被调用,再下面的代码就是演示的例程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30


//检查是否为合法的eth,并且只接受发给本机的arp数据
unsignedchareth_type_is_arp_and_my_ip(unsignedchar*buf,unsignedintlen)
{
unsignedchari=0;

//帧长度不得小于以太网的最小帧长度值,即46-除以太网头和CRC检测
if(len{
return(0);
}

if(buf[ETH_TYPE_H_P]!=ETHTYPE_ARP_H_V||buf[ETH_TYPE_L_P]!=ETHTYPE_ARP_L_V)
{
return(0);
}

//不是发给本机IP地址的不接收,那么如此说来,我在这里可以设定监听其他IP的信息!
while(i{
if(buf[ETH_ARP_DST_IP_P+i]!=ipaddr[i])
{
return(0);
}

i++;
}

return(1);
}

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在人工智能飞速发展的当下,大模型展现出了强大的语言理解与生成能力。然而,要让这些模型真正在实际场景中发挥作用,与外部丰富的工具及数据源顺畅交互至关重要。在此背景下,Model Context Protocol(MCP),...

关键字: 人工智能 大模型 协议

在智能汽车飞速发展的当下,汽车内各种电气设备之间的数据交互愈发频繁和复杂。车载以太网作为连接这些设备的关键物理网络,正扮演着日益重要的角色。它基于传统以太网协议,对物理接口电气特性进行了改造,并依据车载网络需求制定了新标...

关键字: 以太网 车载网络 协议

I2C 总线的起始条件和终止条件通常由主机产生。起始条件是在 SCL 高电平时,SDA 从高电平转为低电平;而终止条件则是当 SCL 高电平时,SDA 从低电平转化为高电平。这两个条件的准确识别对于 I2C 通信的正确启...

关键字: I2C 总线 数据 协议

在当今数字化时代,互联网已经成为人们生活和工作中不可或缺的一部分。从浏览网页、发送电子邮件,到视频通话、在线购物,每一项网络活动的背后都离不开一套复杂而精妙的协议体系 ——TCP/IP 协议族。作为支撑现代互联网运行的基...

关键字: 协议 互联网 TCP/IP 协议

串口:串口是一个泛称,UART、TTL、RS232、RS485都遵循类似的通信时序协议,因此都被通称为串口。串口通讯应用是工控人必须掌握的一个技能,几乎在每一个项目中都会用到,今天我们就来详细比较一下它们究竟有何区别。

关键字: 串口 协议

随着社会经济的不断发展进步,科技的不断飞升,在新时代的背景下网络通信已经成了人们最为常 用的科学技术产品之一,由于生活水平得到了提高人们在日常的追求上也发生着变化,而对于通信 的产品可以说是有着日新月异的变化,人们在网络...

关键字: 通信 协议 控制

新一代人工智能的发展,是国家层面的战略大协作。由科技部主导,共15个国家部门构成的新一代人工智能发展规划推进办公室,着力推进项目、基地、人才统筹布局,打造国家级专家库,成立新一代人工智能战略咨询委员会。很多时候企业拥有重...

关键字: 人工智能 自动化 平台

没想到一家半导体公司创始人的经历可以如此传奇,从大屠杀中活了下来,他就是威世(Vishay)创始人费利克斯·赞德曼(Felix Zandman)。本以为世界级半导体公司的创始人都是从小理科天赋过人、名校背景,成长故事如同...

关键字: 半导体 平台 公司

据路透社等海外媒体报道,美国商务部官员Wilbur Ross在4月16日透露,因未履行和解协定中的部分协议,美国商务部将禁止美国企业向中兴通讯销售元器件,时间有可能长达7年。该消息公布之后,国内部分产业人士认为是假消息,...

关键字: 协议 元器件 中兴通讯

显然这是目前存在的现状,蓝牙Mesh、Zigbee等一些标准共存于物联网智能家居江湖,但又谁也取代不了谁。正如周巍所说:“没有任何一个标准能在一个应用层垄断,尽管小米阿里在主推蓝牙Mesh,华为在推Zigbee,但未来迟...

关键字: 物联网 协议 通讯
关闭