笑看天下无敌手 发表于 2024-6-27 04:36:04

ARP协议详解


ARP概述


ARP协议的定义

地址剖析协议(Address Resolution Protocol,ARP):ARP协议可以将IPv4地址(一种逻辑地址)转换为各种网络所需的硬件地址(一种物理地址)。换句话说,所谓的地址剖析的目的就是发现逻辑地址与物理地址的映射关系。 ARP仅用于IPv4协议,IPv6利用邻居发现协议(NDP)替代。
ARP协议现在最广泛应用于探求32位IPv4地址与以太网的48位MAC地址之间的映射。


把握ARP协议前,需要明确什么是逻辑地址和物理地址。
物理地址

物理地址:物理地址对于主机就雷同身份证对于人类。对于每个网络适配器,设置制造商都会给定一个永久的物理地址,将其存储在装备的永久性内存中。就像身份证一样,物理地址就是网络适配器的ID。留意,物理地址是和网络适配器绑定的,如果主机更换了网络适配器,那么它的物理地址也会相应改变。(虽然网络适配器的物理地址是固定的,但也可以通过特别方法修改,但这种情况极少出现,不影响我们明确)
在TCP/IP分层体系布局中,数据链路层和物理层利用的地址是物理地址。而网络层、传输层和应用层利用的地址是IP地址(逻辑地址)。


逻辑地址

逻辑地址:逻辑地址就是我们常说的IP地址,由于IP地址是由软件实现的,所以把它称为逻辑地址。IP地址是不固定的,它通常从某个网络的IP地址池中获得,改变网络环境,IP地址就会改变。


为什么需要2级地址

分组进行传输必须要2级地址:逻辑地址和物理地址。
IP地址和物理地址是在不同的条理下运行的。同一个目的IP地址大概经过多段链路,每段链路都大概运行不同的链路层和物理层协议,它们的物理地址格式大概都截然不同;同理,同一段链路大概接收来自不同的网络层协议,好比IPv4大概IPX。
有人大概以为,直接用物理地址替代IP地址不就行了么?
这是由于对IP地址不敷了解。实际中,有很多链路层和物理层的协议,它们都有不同的物理地址。如果完全依赖物理地址,那么路由表就需要对每个物理地址建立一个项,那样没有一个路由器可以或许负担如此巨大的表项。
而IP地址提供了更高条理的抽象,将不同的物理地址抽象为统一的逻辑地址。
IP地址有精良的分层。如果分组转发到同一子网,只需要在路由表中记载统一的网络前缀。好比,一个子网有6000个IP地址,对应6000个物理地址。记载IP地址网络前缀只需要1行,记载物理地址则需要6000行。
有了IP地址,分组的路由(也就是找路)的工作仿佛在同一个网络中进行。如果传输IPv4分组,那么IPv4分组传输过程中经过的所有网络都利用IPv4协议,仿佛它们在一个逻辑上的网络中。

ARP工作原理

ARP协议主要依赖ARP高速缓存(ARP cache)。ARP高速缓存就是一个映射表,它记载了IP地址和物理地址的映射关系。每一台主机和路由器都设有ARP高速缓存,在实际传输中,通常已知下一跳的目的IP地址(这是通过查询路由表完成的,不是本篇的知识),通过查询ARP高速缓存即可知道对应的物理地址。


怎样建立ARP高速缓存

高速缓存记载的映射表不是一开始就有的。假设已知下一跳的目的IP地址,怎样通过ARP协议得知下一跳对应的物理地址呢?
答案是通过广播ARP请求分组。
ARP请求分组有3个紧张信息:1.源IP地址。2.对应的源物理地址。3.目的IP地址。
查询的内容为:对应的目的物理地址。
以下是具体步骤:

[*] 源主机大概路由器会给该网络的所有主机发送ARP请求分组(也就是给这个网络广播该分组),所有主机会查抄分组的目的IP地址是否与自身的IP地址相同。如果不相同,就抛弃该分组;如果相同,就说明本身就是被探求的目的主机大概路由器。
[*] 目的主机(或目的路由器)在收到ARP请求分组后,会做两件事:
1.将源主机的IP地址和对应的物理地址添加进自身的ARP高速缓存映射表。
这是由于既然源主机会和本身通信,那么本身之后也大概会主动和源主机通信,提前建立源主机的映射表项是有须要的,之后本身要主动和源主机通信就不消广播ARP请求分组了。
2.给源主机发送ARP相应报文(留意,该报文是单播的)
目的主机需要给源主机发送ARP相应报文,告知源主机本身的物理地址。源主机在收到所需的ARP相应报文,就可以发送帧给目的主机了。
为什么是单播而不是广播呢?那是由于目的主机已经有源主机的物理地址了,可以直接给源主机发送对应的帧,不需要广播。
[*] 当源主机接收到ARP相应报文后,也会将目的主机的IP地址和对应的物理地址添加到本身的ARP高速缓存映射表中,这样下次再和该主机通信,就不消广播ARP分组了。之后就可以通过物理地址,给目的主机发送帧了。


利用ARP协议的4种不怜悯况

ARP协议是在单个网络内部运行的。如果源主机和目的主机不在一个网络中,必须多次利用ARP协议。
无论情况多复杂,都是由以下4种情况组合而成的。
https://img-blog.csdnimg.cn/d2d4298f640143b498faff32075e5fc2.png
如果源主机和目的主机在一个网络中,这就很简单,源主机直接通过ARP协议探求目的主机的物理地址。
也就是情况1:源主机直接通过ARP协议探求同一个网络下目的主机的物理地址。
https://img-blog.csdnimg.cn/66c19e4df9ef4104a142ff821157c916.png
如果源主机和目的主机不在一个网络中,就必须通过路由器路由。通过查找路由表,将目的主机的IP地址转换为下一跳的IP地址。再通过ARP协议,将下一跳的IP地址转换为对应的物理地址。
细分有3种情况:
情况2:源主机探求下一跳路由器的物理地址。
情况3:路由器探求在同一个网络中的目的主机的物理地址。
情况4:路由器和目的主机不在同一个网络中,路由器A探求下一条路由器B的物理地址。
其实这4种情况非常好明确,只需要明确路由表的作用和ARP映射表的作用即可。


高速缓存的生存周期

ARP高速缓存是动态的,而且缓存记载的映射项有生存周期,一般默认是20分钟。超过生存周期,那条映射就会从映射表中移除。
为什么需要设置生存周期呢?
是由于物理地址和IP地址都大概改变。好比目的主机更换了网络适配器,那么目的主机的物理地址就改变了。
如果源主机通过查看ARP映射表得到了目的主机从前的物理地址,肯定是无法正常通信的。但随着该表项生存周期到时,源主机会重新广播ARP请求分组,这样就可以得到目的主机新的物理地址。从而和目的主机正常通信。

ARP报文格式

https://img-blog.csdnimg.cn/731c954929f64444b8bb422137fc103c.jpeg#pic_center

[*]硬件类型:该字段有16bit。指定运行ARP协议的物理网络类型,ARP协议可以运行在任何物理网络上。以太网是类型1。
[*]协议类型:该字段有16bit。指定高层协议的类型。ARP可用于任何高层协议。IPv4协议的值为0x0800。
[*]硬件长度:该字段有8bit。定义物理地址的长度,以字节为单元。对于以太网,该值为6字节。
[*]协议长度:该字段有8bit。定义逻辑地址的长度,以字节为单元。对于IPv4,该值为4字节。
[*]操纵:该字段有16bit。用于定义分组类型,现在常用2种。ARP请求分组和ARP相应分组。
[*]发送方硬件地址:记载发送方的物理地址。
[*]发送方协议地址:记载发送方的逻辑地址。
[*]接收方硬件地址:如果是ARP请求报文,由于不知道接收方的物理地址(请求报文就是通过广播扣问接收方物理地址,当然事先不知道),该字段全部填充为0。
[*]接收方协议地址:记载接收方的逻辑地址。

封装ARP协议

ARP协议是很特别的协议,它像是介于网络层和链路层之间的协议。
ARP协议是封装在帧中的,就像IPv4协议封装在以太网帧一样,从这个角度讲,ARP协议像网络层协议。
但是ARP协议是为网络层协议服务的,从服务的角度讲,它又像链路层协议。
实际中,ARP协议常封装在以太网帧中。
当广播ARP请求分组时,该网络中的所有主机都会从以太网帧中提取出ARP协议分组,查抄接收方协议地址字段,如果和自身IP地址不相同,就抛弃该分组。如果相同,说明自身的物理地址就是被探求的地址。就需要给发送方回复ARP相应分组(通过单播)。
ARP的相应报文会将发送方硬件地址字段和发送方协议地址字段填写成自身的物理地址和IP地址。将接收方硬件地址和接收方协议地址填写为ARP请求报文的发送方硬件地址和发送方协议地址。

抓包分析


抓取ARP请求报文

https://img-blog.csdnimg.cn/9afab1f559d04c2c9ee45ef16d84e851.png#pic_center
从上图可知,ARP协议被封装在Ethernet协议(以太网协议)中。
我们先看Ethernet II部分:
Destination(目的物理地址)字段的值为:ff:ff:ff:ff:ff:ff
说明该以太网帧是广播帧,和ARP请求分组是通过广播情势发送吻合。
Source(源物理地址)字段的值为:50:eb:f6:56:ca:57
这是发送方主机的物理地址,和ARP协议的Sender MAC address字段的值完全吻合。
Type字段为:ARP(0x0806)。
说明该以太网帧封装的是一个ARP协议分组。
再看ARP协议部分:
前4个字段表明物理地址和逻辑地址的类型和长度,和之前讲解的吻合。
第五个字段Opcode的值为1,说明是ARP请求报文。
反面4个字段是源物理地址和IP地址,以及目的物理地址和IP地址。
值得留意的是,目的物理地址正如之前所说,全部填充的0。由于该字段正是ARP请求报文需要获取的,现在不知,只能全部填充为0。

抓取ARP相应报文

https://img-blog.csdnimg.cn/9a51d3bfcd0e4072b9334b145288e231.png#pic_center
先看Ethernet II部分:
Destination(目的物理地址)字段的值正好是ARP请求报文的Source字段的值。
也就是说,该ARP相应报文是用来回应之前的ARP请求分组的。
该值也和Target MAC address的值相同。
Source(源物理地址)字段的值为目的端的物理地址,该值和Sender MAC address的值相同。
Padding是填充字段,用来填充以太网帧到最小帧长。
再看ARP协议部分:
前4个字段没什么好讲的。
第五个字段Opcode为2,表示这是ARP相应分组。
反面4个字段,源MAC地址正是ARP请求报文想探求的物理地址。源IP地址正好是ARP请求分组的目的IP地址。目的物理地址和目的IP地址正好是ARP请求分组的源物理地址和源IP地址。


查看ARP高速缓存

https://img-blog.csdnimg.cn/6014f12c16784f68af7538f70f3fff69.png#pic_center
在windows系统的终端,输入arp -a下令可以显示ARP缓存中的所有条目。
可以看到,当源主机192.168.1.1向目的主机192.168.1.2发送ARP请求分组,而且得到对应的ARP相应分组后。
该表项192.168.1.2 8e-47-af-ef-a2-66就被添加到了ARP高速缓存中(第二项)。
静态映射与动态映射

可以看到,ARP高速缓存中,有的是静态映射,有的是动态映射。
通过ARP协议动态配置的表项就是动态映射。发送方查抄ARP缓存,如果没找到所需物理地址,就发送ARP请求报文,并得到ARP相应报文。之后再将对应的映射添加到ARP映射表上。这种方式得到的映射表项就是动态映射。
通过手动方式添加的表项就是静态映射。这种方式添加的表项比力枯燥,由于对应的映射关系不一定固定不变。但是,静态映射更加安全,不会被攻击者通过ARP请求相应报文添加错误的映射关系。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: ARP协议详解