使用 APIPA 的设备在自行分配 IP 之前是否会检查地址冲突?如果会,如何检查?

使用 APIPA 的设备在自行分配 IP 之前是否会检查地址冲突?如果会,如何检查?

我的理解是,使用 APIPA,当 DHCP 服务器不可用时,客户端可以自动自行配置 IP 地址和子网掩码。我知道这种方法由于多种原因并不实用,但我很好奇:协议中是否有内置功能可以检查给定的 IP 地址是否正在被使用?

例如,假设我的主机选择使用169.254.0.2。如果广播域中的另一台主机已经拥有该地址怎么办?我的主机在完成自我分配之前会进行检查吗?

答案1

两台设备为自己选择相同的IP几乎是不可能的。

每个设备都会选择一个地址,然后通过广播 ARP 探测数据包来测试该地址是否已被使用。所有冲突情况都已得到很好的解决,例如在没有答案时重复请求、另一台设备对同一 IP 的 ARP 请求等。

最后,设备通过 ARP 向网络宣布自己及其选择的 IP,由算法保证其是唯一的(或几乎保证)。

有关详细信息,请参阅 RFC 5227 其中包含所有自组织网络必须遵循的标准。

链路本地地址 是此算法的一个变体,于 1998 年首次在 MacOS 9 中实现,其中每个设备都会选择一个随机地址作为其第一次尝试。这里的标准是 RFC 3927

答案2

该协议定义在RFC 3927, 和第 2 节致力于地址选择。在 2.2 小节中,您将找到:

2.2. 声明链接本地地址

在选择了 IPv4 链路本地地址之后,主机必须先测试该 IPv4 链路本地地址是否已被使用,然后才能开始使用它。[...]

2.2.1. 探针细节

在支持 ARP 的链路层(例如 IEEE 802)上,使用 ARP 探测进行冲突检测。[...]

主机通过广播所需地址的 ARP 请求来探测某个地址是否已被使用。客户端必须在 ARP 请求的“发送方硬件地址”字段中填写其发送数据包的接口的硬件地址。“发送方 IP 地址”字段必须设置为全零,以避免在地址已被其他主机使用的情况下污染同一链路上其他主机的 ARP 缓存。“目标硬件地址”字段将被忽略,并且应设置为全零。“目标 IP 地址”字段必须设置为被探测的地址。以这种方式构造的具有全零“发送方 IP 地址”的 ARP 请求称为“ARP 探测”。[..]

[...] 主机应发送 PROBE_NUM 个探测数据包,每个探测数据包的间隔随机为 PROBE_MIN 到 PROBE_MAX 秒。如果在此期间,从探测过程开始到最后一个探测数据包发送后的 ANNOUNCE_WAIT 秒内,主机收到任何 ARP 数据包(请求或者如果在执行探测的接口上发现数据包的“发送方 IP 地址”是被探测的地址,并且该地址是“回复”,则主机必须将该地址视为其他主机正在使用,并且必须选择一个新的伪随机地址并重复该过程。[...]

如果在传输最后一个 ARP 探测之后的 ANNOUNCE_WAIT 秒内没有收到冲突的 ARP 答复或 ARP 探测,则主机已成功声明所需的 IPv4 链路本地地址。

相关内容