总结 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:40 | 10.0.0.56 | 0 | 10.0.0.3 |
2、ARP 应答
IP 地址为 10.0.0.3 的设备收到请求后,回复一个 ARP 应答消息,消息中包括应答方的 IP 和 MAC 地址(填在发送方地址字段)
应答消息不是广播
链路层广播 | 操作类型 | 发送方 MAC | 发送方 IP | 目的 MAC | 目的 IP |
---|---|---|---|---|---|
否 | 2(应答) | 0:0:c0:c2:9b:26 | 10.0.0.3 | 0:0:c0:6f:2d:40 | 10.0.0.56 |
3、免费 ARP
源 IP 和目的 IP 相同的 ARP 请求叫做免费 ARP,通过广播发送:
链路层广播 | 操作类型 | 发送方 MAC | 发送方 IP | 目的 MAC | 目的 IP |
---|---|---|---|---|---|
是 | 1(请求) | 0:0:c0:6f:2d:40 | 10.0.0.56 | 0 | 10.0.0.56 |
这样只有 IP 地址和自己相同的才会回应。发送免费 ARP 后并不期望收到回应,当收到一个回应时说明有地址冲突。免费 ARP 主要用来实现两个功能:
- 允许一台主机确定另一台主机是否配置相同的 IP 地址
- 通知其它主机发送方主机的 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:40 | 0 | 0 | 10.0.0.56 |
3.2、ARP 通告分组
发送方 IP 地址不是 0 的叫通告分组,用来实现免费 ARP 中的通知 MAC 地址变更功能
链路层广播 | 操作类型 | 发送方 MAC | 发送方 IP | 目的 MAC | 目的 IP |
---|---|---|---|---|---|
是 | 1(请求) | 0:0:c0:6f:2d:40 | 10.0.0.56 | 0 | 10.0.0.56 |
4、免费 ARP 和探测、通告分组的关系
ARP 探测分组和通告分组属于 IPv4 地址冲突检测(ACD)功能的一部分,免费 ARP 的两个功能分别由它们实现:
- 检测冲突的功能由探测分组实现
- 通知 MAC 地址变更的功能由通告分组实现
5、以上消息的应用场景
- 正常请求另一个 IP 地址对应的 MAC 地址时,发送请求分组,收到应答分组
- 当一个接口被启用或从睡眠中唤醒,或一个新的链路建立时,主机会发送一个ARP 探测分组。如果收到应答分组,说明其它站已使用候选 IP 地址。如果收到其它站发送的探测请求,说明其它站也在尝试获得候选 IP 地址。这两种情况系统都会提示地址冲突,然后使用其它可用的地址(比如使用 DHCP 分配)
- 如果前面的探测分组没有检测到冲突,则发送通告分组,更新其它站的缓存
- ACD 持续检测收到的请求和应答消息,如果自己的地址有出现在消息的发送方 IP 地址字段中,则说明有地址冲突(只检测发送方地址,不需要处理探测分组,因为收到探测分组后用正常的应答来阻止对方继续使用此 IP 即可)。这时候有三种处理方式:①停止使用此地址;②发送通告分组,如果冲突继续则停用此地址;③不理会冲突继续使用