我在一本 CCNA 预备书中读到了以下摘录,但我觉得不太舒服:
因此,在分配 IP 地址期间,DHCP 服务器会使用 Ping 程序检查冲突,以测试地址是否可用,然后再从地址池中分配地址。如果没有主机回复,则 DHCP 服务器会假定该 IP 地址尚未分配。
我明白目的和理由,但这真的是 ICMP 请求吗?为什么不是 ARP?
答案1
DHCP 服务器使用 ICMP 而不是 ARP 的简单原因是无法保证 DHCP 服务器与客户端位于同一子网(因为您可以拥有带有中继代理的集中式 DHCP 服务器)。
RFC 2131 因此指出:
作为一致性检查,分配服务器应该在分配地址之前探测重用的地址,例如使用 ICMP 回显请求,而客户端应该探测新收到的地址,例如使用 ARP。
答案2
这是客户端那使用 ARP 进行冲突检测,如RFC 5227,它澄清了 DHCP 规范中已经提到的一些细节:
-- 现有的地址解析协议 (ARP) 为主机提供了一种简单的方法来检测这种错误配置并将其报告给用户。DHCP 规范[RFC2131]简要提到了 ARP 在检测错误配置中的作用,如以下 RFC 2131 中的三段摘录所示:
客户端应该探测新收到的地址,例如使用 ARP
客户端应该对参数进行最终检查(例如,分配网络地址的 ARP)
如果客户端检测到该地址已被使用(例如,通过使用 ARP),则客户端必须向服务器发送 DHCPDECLINE 消息
RFC 5227 还将 DHCP 扩展到所有 IPv4 地址的使用:
在开始使用 IPv4 地址(无论是通过手动配置、DHCP 还是其他方式获得)之前,实施此规范的主机必须通过广播 ARP 探测数据包来测试该地址是否已被使用。当网络接口从非活动状态转换为活动状态时、当计算机从睡眠状态唤醒时、当链路状态更改表示以太网电缆已连接时、当 802.11 无线接口与新基站关联时,或者当发生任何其他连接变化(主机主动连接到逻辑链路时)时,这也适用。
主机绝对不能定期执行此检查。这会浪费网络带宽,而且由于主机能够被动发现冲突,因此没有必要执行此检查,如第 2.4 节。
假设 Windows DHCP 服务器,服务器端冲突检测使用ICMP 回显请求(ping)默认情况下处于禁用状态,并且建议不要使用它除某些罕见情况外:
如果您的网络包含旧版 DHCP 客户端(运行早于 Windows 2000 版本的 Windows 的客户端),您可以在特定情况下使用 DHCP 服务器服务提供的服务器端冲突检测。例如,此功能在删除并重新创建作用域时的故障恢复过程中可能很有用。有关详细信息,请参阅 DHCP 故障排除。
默认情况下,DHCP 服务不执行任何冲突检测。要启用冲突检测,请增加 DHCP 服务在将每个地址租给客户端之前对该地址执行的 ping 尝试次数。请注意,DHCP 服务每执行一次额外的冲突检测尝试,就会在协商 DHCP 客户端租约所需的时间上增加额外的秒数。
答案3
是的。启用冲突检测后,DHCP 服务器将 ping 其想要授予租约的 IP 地址,以确保没有其他计算机正在使用该 IP 地址。如果 ping 请求收到回复,服务器将把该 IP 标记为 BAD_ADDRESS。如果没有收到回复,服务器将把 IP 地址分配给请求的客户端(DHCP 客户端通过发送免费 ARP 数据包来探测 IP 地址)。