ARP 协议

总结 ARP 协议,包括请求、应答、免费ARP、探测和通告分组

 

ARP 协议用于网络层地址和硬件地址之间的映射,实际使用中只用于 IPv4 地址到以太网 MAC 地址的映射

ARP 协议封装在链路层中传输,并且只能工作在支持广播的网络中。协议帧如下:

 

1、ARP 请求

在本地缓存中没有需要的 IPv4 地址到 MAC 地址的映射时,就需要发送一个 ARP 请求来获取 MAC 地址

发送 ARP 请求时,链路层中的目的地址填为全 f(广播),ARP 帧里的目的 MAC 地址填为0

链路层广播操作类型发送方 MAC发送方 IP目的 MAC目的 IP
1(请求)0:0:c0:6f:2d:4010.0.0.56010.0.0.3

 

2、ARP 应答

IP 地址为 10.0.0.3 的设备收到请求后,回复一个 ARP 应答消息,消息中包括应答方的 IP 和 MAC 地址(填在发送方地址字段)

应答消息不是广播

链路层广播操作类型发送方 MAC发送方 IP目的 MAC目的 IP
2(应答)0:0:c0:c2:9b:2610.0.0.30:0:c0:6f:2d:4010.0.0.56

 

3、免费 ARP

源 IP 和目的 IP 相同的 ARP 请求叫做免费 ARP,通过广播发送:

链路层广播操作类型发送方 MAC发送方 IP目的 MAC目的 IP
1(请求)0:0:c0:6f:2d:4010.0.0.56010.0.0.56

这样只有 IP 地址和自己相同的才会回应。发送免费 ARP 后并不期望收到回应,当收到一个回应时说明有地址冲突。免费 ARP 主要用来实现两个功能:

  1. 允许一台主机确定另一台主机是否配置相同的 IP 地址
  2. 通知其它主机发送方主机的 MAC 地址变了,更新其它主机中的缓存

如果一个主机A接收到一个主机B的 ARP 请求,该请求的发送方B的 IP 已经在接收方A的 ARP 缓存中了,则接收主机A用请求消息里的发送方 IP、MAC 地址对来更新本地 ARP 缓存里的记录,第二点正是通过这个特性来实现的。也正是由于这个特性,在地址冲突的情况下会存在缓存污染的问题。

所以免费 ARP 又根据发送方 IP 地址是否填 0 分成了两种:探测分组和通告分组。

3.1、ARP 探测分组

发送方 IP 地址是 0 的叫探测分组,通过广播发送。当一个接口被启用或从睡眠中唤醒,或一个新的链路建立时,主机会发送一个ARP 探测分组,将发送方 IP 填为 0 避免了在 IP 地址冲突的情况下存在的缓存污染问题,用来实现免费 ARP 中的冲突检测功能:

链路层广播操作类型发送方 MAC发送方 IP目的 MAC目的 IP
1(请求)0:0:c0:6f:2d:400010.0.0.56

 

3.2、ARP 通告分组

发送方 IP 地址不是 0 的叫通告分组,用来实现免费 ARP 中的通知 MAC 地址变更功能

链路层广播操作类型发送方 MAC发送方 IP目的 MAC目的 IP
1(请求)0:0:c0:6f:2d:4010.0.0.56010.0.0.56

 

4、免费 ARP 和探测、通告分组的关系

ARP 探测分组和通告分组属于 IPv4 地址冲突检测(ACD)功能的一部分,免费 ARP 的两个功能分别由它们实现:

  1. 检测冲突的功能由探测分组实现
  2. 通知 MAC 地址变更的功能由通告分组实现

 

5、以上消息的应用场景

  1. 正常请求另一个 IP 地址对应的 MAC 地址时,发送请求分组,收到应答分组
  2. 当一个接口被启用或从睡眠中唤醒,或一个新的链路建立时,主机会发送一个ARP 探测分组。如果收到应答分组,说明其它站已使用候选 IP 地址。如果收到其它站发送的探测请求,说明其它站也在尝试获得候选 IP 地址。这两种情况系统都会提示地址冲突,然后使用其它可用的地址(比如使用 DHCP 分配)
  3. 如果前面的探测分组没有检测到冲突,则发送通告分组,更新其它站的缓存
  4. ACD 持续检测收到的请求和应答消息,如果自己的地址有出现在消息的发送方 IP 地址字段中,则说明有地址冲突(只检测发送方地址,不需要处理探测分组,因为收到探测分组后用正常的应答来阻止对方继续使用此 IP 即可)。这时候有三种处理方式:①停止使用此地址;②发送通告分组,如果冲突继续则停用此地址;③不理会冲突继续使用
### 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") ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值