ARP协议

网络设备有数据要发送给另一台网络设备时,必须要知道对方的网络层地址(即IP地址)。IP地址由网络层来提供,但是仅有IP地址是不够的,IP数据报文必须封装成帧才能通过数据链路进行发送。数据帧必须要包含目的MAC地址,因此发送端还必须获取到目的MAC地址。通过目的IP地址而获取目的MAC地址的过程是由ARP(Address Resolution Protocol)协议来实现的。

一、ARP数据包格式

在这里插入图片描述
表项释义:

表项释义
Hardware Type硬件地址类型,一般为以太网
protocol Type三层协议地址类型,一般为IP
Hardware LengthMAC地址长度,单位位字节
Protocol LengthIP地址长度,单位位字节
Operation code指定的ARP报文类型,包括ARP request和ARP reply
Source Hardware Address发送ARP报文设备的MAC地址
Source Protocol Address发送ARP报文设备的IP地址
Destination Hardware Address接受者的MAC地址,在ARP Request 报文中该字段为0
Destination Protocol Address接受者的IP地址

二、ARP工作过程

  • 通过ARP协议,网络设备可以建立目标IP地址和MAC地址之间的映射。网络设备通过网络层获取到目的IP地址之后,还要判断目的MAC地址是否已知。

在这里插入图片描述

2.1ARP缓存

在这里插入图片描述
网络设备一般都有一个ARP缓存(ARP Cache),ARP缓存用来存放IP地址和MAC地址的关联信息。在发送数据前,设备会先查找ARP缓存表。如果缓存表中存在对方设备的MAC地址,则直接采用该MAC地址来封装帧,然后将帧发送出去。如果缓存表中不存在相应信息,则通过发送ARP request报文来获得它。学习到的IP地址和MAC地址的映射关系会被放入ARP缓存表中存放一段时间。在有效期内,设备可以直接从这个表中查找目的MAC地址来进行数据封装,而无需进行ARP查询。过了这段有效期,ARP表项会被自动删除。如果目标设备位于其他网络,则源设备会在ARP缓存表中查找网关的MAC地址,然后将数据发送给网关,网关再把数据转发给目的设备。

2.2 ARP请求

在这里插入图片描述
本例中,主机A的ARP缓存表中不存在主机C的MAC地址,所以主机A会发送ARP request来获取目的MAC地址。ARP request报文封装在以太帧里。帧头中的源MAC地址为发送端主机A的MAC地址。此时,由于主机A不知道主机C的MAC地址,所以目的MAC地址为广播地址FF-FF-FF-FF-FF-FF。ARP request报文中包含源IP地址、目的IP地址、源MAC地址、目的MAC地址,其中目的MAC地址的值为0。ARP Request报文会在整个网络上传播,该网络中所有主机包括网关都会接收到此ARP request报文。网关将会阻止该报文发送到其他网络上。

2.3 ARP响应

在这里插入图片描述

所有的主机接收到该ARP Request报文后,会检查它的目的协议地址字段与自身的IP地址是否匹配。如果不匹配,则该主机将不会响应该ARP Request报文。如果匹配,则该主机会将ARP报文中的源MAC地址和源IP地址信息记录到自己的ARP缓存表中,然后通过ARP Reply报文进行响应。假设主机C会向主机A回应ARP Reply报文。ARP Reply报文中的源协议地址是主机C自己的IP地址,目标协议地址是主机A的IP地址,目的MAC地址是主机A的MAC地址,源MAC地址是自己的MAC地址,同时Operation Code被设置为reply。ARP Reply报文通过单播传送。主机A收到ARP Reply以后,会检查ARP报文中目的MAC地址是否与自己的MAC匹配。如果匹配,ARP报文中的源MAC地址和源IP地址会被记录到主机A的ARP缓存表中。ARP表项的老化超时时间缺省为1200秒。

2.4 ARP代理

  • 位于不同网络的网络设备在不配置网关的情况下,能够通过ARP代理实现相互通信。

在这里插入图片描述
在上述例子的组网中,主机A需要与主机B通信时,目的IP地址与本机的IP地址位于不同网络,但是由于主机A未配置网关,所以它将会以广播形式发送ARP Request报文,请求主机B的MAC地址。但是,广播报文无法被路由器转发,所以主机B无法收到主机A的ARP请求报文,当然也就无法应答。在路由器上启用代理ARP功能,就可以解决这个问题。启用代理ARP后,路由器收到这样的请求,会查找路由表,如果存在主机B的路由表项,路由器将会使用自己的G0/0/0接口的MAC地址来回应该ARP request。主机A收到ARP reply后,将以路由器的G0/0/0接口MAC地址作为目的MAC地址进行数据转发。

2.5 免费ARP

  • 免费ARP可以用来探测IP地址是否冲突。
    在这里插入图片描述
    主机被分配了IP地址或者IP地址发生变更后,必须立刻检测其所分配的IP地址在网络上是否是唯一的,以避免地址冲突。主机通过发送ARP request报文来进行地址冲突检测。
    主机A将ARP Request广播报文中的目的IP地址字段设置为自己的IP地址,该网络中所有主机包括网关都会接收到此报文。当目的IP地址已经被某一个主机或网关使用时,该主机或网关就会回应ARP reply报文。通过这种方式,主机A就能探测到IP地址冲突了。

三、ARP实验

3.1 ARP请求与响应

实验拓扑:
在这里插入图片描述

PC1 ping PC2:
在这里插入图片描述
这里可以打开报文,观察报文的源、目的MAC,源、目的IP等详细信息。
PC1 ARP缓存表:
在这里插入图片描述

3.2ARP代理实验:

实验拓扑:在这里插入图片描述

AR1:

<Huawei>system-view 
[Huawei]interface GigabitEthernet 0/0/0
[Huawei-GigabitEthernet0/0/0]ip address 192.168.1.1 24
[Huawei-GigabitEthernet0/0/0]arp-proxy enable
[Huawei-GigabitEthernet0/0/0]quit
[Huawei]interface GigabitEthernet 0/0/1
[Huawei-GigabitEthernet0/0/1]ip address 192.168.2.1 24
[Huawei-GigabitEthernet0/0/1]arp-proxy enable
[Huawei-GigabitEthernet0/0/1]quit

PC配置:
在这里插入图片描述
PC1 ping 通PC2:
在这里插入图片描述
PC1ARP缓存表:在这里插入图片描述

### ARP协议的工作原理 ARP(Address Resolution Protocol)是用于将IP地址解析为MAC地址的协议。在网络通信中,数据传输依赖于MAC地址而非IP地址。每个设备在发送数据之前,必须知道目标设备的MAC地址。如果只知道目标设备的IP地址而不知道其MAC地址,则需要通过ARP协议进行查询。 当一个设备需要解析目标设备的MAC地址时,它会广播一个ARP请求帧。该请求帧包含自己的IP地址和MAC地址作为源信息,以及目标设备的IP地址[^3]。所有接收到此广播的设备都会检查是否与请求中的目标IP地址匹配。如果匹配,则目标设备会向发起请求的设备发送一个单播ARP应答帧,其中包含其自身的MAC地址[^1]。 #### ARP缓存的作用 为了提高效率并减少网络中的广播流量,设备通常会维护一个ARP缓存表。这个表记录了已知IP地址与MAC地址之间的映射关系。当设备需要解析某个IP地址对应的MAC地址时,首先会在本地ARP缓存中查找。如果找到匹配项,则直接使用缓存中的MAC地址;如果没有找到,则发起ARP请求[^5]。 #### ARP协议与MAC地址的关系 ARP协议的核心功能就是建立IP地址与MAC地址之间的映射关系。在网络通信中,IP地址用于标识主机的位置,而MAC地址用于标识主机的物理接口。当两台主机位于同一子网内时,它们可以直接通过ARP协议解析彼此的MAC地址并进行通信。如果两台主机不在同一子网内,则需要通过路由器转发数据包。在这种情况下,源主机首先需要解析默认网关(通常是路由器接口)的MAC地址,然后将数据包发送给路由器[^3]。 ```python # 示例代码:模拟ARP请求与应答过程 class ARP: def __init__(self): self.cache = {} def request(self, source_ip, source_mac, target_ip): print(f"Broadcasting ARP request: Who has {target_ip}? Tell {source_ip}") return {"type": "request", "source_ip": source_ip, "source_mac": source_mac, "target_ip": target_ip} def reply(self, source_ip, source_mac, target_ip, target_mac): self.cache[target_ip] = target_mac print(f"Sending ARP reply: {source_ip} is at {source_mac}") return {"type": "reply", "source_ip": source_ip, "source_mac": source_mac, "target_ip": target_ip} # 创建ARP实例 arp = ARP() # 发起ARP请求 request_packet = arp.request("192.168.1.10", "AA-BB-CC-DD-EE-FF", "192.168.1.1") # 接收ARP应答 reply_packet = arp.reply("192.168.1.1", "00-11-22-33-44-55", "192.168.1.10", "AA-BB-CC-DD-EE-FF") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值