为什么服务器不能像 DHCP Discover and Request 的源 IP 一样使用目的 IP 地址 0.0.0.0?它可以使用从 DHCP 发现和请求中获知的客户端 MAC 地址将帧定向到适当的客户端计算机。
2 回答
单播或广播选项在DHCP RFC 2131中指定:
如果来自客户端的 DHCP 消息中的“giaddr”字段不为零,则服务器将任何返回消息发送到地址出现在“giaddr”中的 BOOTP 中继代理上的“DHCP 服务器”端口。如果“giaddr”字段为零且“ciaddr”字段不为零,则服务器将 DHCPOFFER 和 DHCPACK 消息单播到“ciaddr”中的地址。如果 'giaddr' 为 0 且 'ciaddr' 为 0,并且设置了广播位,则服务器将 DHCPOFFER 和 DHCPACK 消息广播到 0xffffffff。如果广播位未设置且“giaddr”为零且“ciaddr”为零,则服务器将 DHCPOFFER 和 DHCPACK 消息单播到客户端的硬件地址和“yiaddr”地址。在所有情况下,当 'giaddr' 为零时,
ciaddr和giaddr为:
ciaddr 4 Client IP address; only filled in if client is in BOUND, RENEW or REBINDING state and can respond to ARP requests. giaddr 4 Relay agent IP address, used in booting via a relay agent.
因此,DHCP 服务器根据客户端的当前状态(主要是是否已经有 IP 地址)以及消息的发送者(如果它是中继代理或只是客户端)选择广播或不广播。
在这种情况下,我的 DCHP 服务器选择单播 DHCPOFFER,因为我的机器已经有一个 IP 地址并且我的 LAN 中没有中继代理。
编辑:
并且没有人可以使用 IP 地址 0.0.0.0 作为目标地址。如IPv4 RFC 5735中所述:
0.0.0.0/8 - 此块中的地址是指“此”网络上的源主机。 地址 0.0.0.0/32 可用作此网络上此主机的源地址;0.0.0.0/8 内的其他地址可用于引用此网络上的指定主机([RFC1122],第 3.2.1.3 节)。
来自RFC 2131,第 24 页:
通常,DHCP 服务器和 BOOTP 中继代理会尝试使用 uicast 传递将 DHCPOFFER、DHCPACK 和 DHCPNAK 消息直接传递给客户端。IP 目标地址(在 IP 报头中)设置为 DHCP 'yiaddr' 地址,链路层目标地址设置为 DHCP 'chaddr' 地址。不幸的是,某些客户端实现在配置了有效的 IP 地址之前无法接收此类单播 IP 数据报(导致死锁,在客户端配置了 IP 地址之前无法传递客户端的 IP 地址)。
在客户端发送的任何 DHCPDISCOVER 或 DHCPREQUEST 消息中,在其协议软件配置 IP 地址之前无法接收单播 IP 数据报的客户端应该将“flags”字段中的 BROADCAST 位设置为 1。BROADCAST 位将向 DHCP 服务器和 BOOTP 中继代理提供提示,以将任何消息广播到客户端子网上的客户端。
可以在其协议软件配置之前接收单播 IP 数据报的客户端应该将 BROADCAST 位清除为 0。BOOTP 澄清文档讨论了使用 BROADCAST 位的后果。