我的理解是,使用 APIPA,当 DHCP 服务器不可用时,客户端可以自动自行配置 IP 地址和子网掩码。我知道这种方法由于多种原因并不实用,但我很好奇:协议中是否有内置功能可以检查给定的 IP 地址是否正在被使用?
例如,假设我的主机选择使用169.254.0.2
。如果广播域中的另一台主机已经拥有该地址怎么办?我的主机在完成自我分配之前会进行检查吗?
答案1
答案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 链路本地地址。