为什么服务器不能像在DHCP Discover和Request的源IP中使用0.0.0.0的目标IP地址那样使用它?它可以使用从DHCP Discover和Request中学到的客户端MAC地址来将帧定向到适当的客户端机器。
在 DHCP RFC 2131 中指定了单播或广播选择:
如果来自客户端的 DHCP 消息中的 'giaddr' 字段非零,则服务器将任何回复消息发送到 'giaddr' 中出现的 BOOTP 中继代理的“DHCP服务器”端口。 如果 'giaddr' 字段为零且 'ciaddr' 字段不为零,则服务器将 DHCPOFFER 和 DHCPACK 消息单播到 'ciaddr' 中的地址。 如果 'giaddr' 为零且 'ciaddr' 为零,并且设置了广播位,则服务器向 0xffffffff 广播 DHCPOFFER 和 DHCPACK 消息。 如果未设置广播位并且 'giaddr' 为零且 'ciaddr' 为零,则服务器将 DHCPOFFER 和 DHCPACK 消息单播到客户端的硬件地址和 'yiaddr' 地址。 在所有情况下,当 'giaddr' 为零时,服务器将任何 DHCPNAK 消息广播到 0xffffffff。
其中,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中没有中继代理。来自RFC 2131,第24页:
通常,DHCP服务器和BOOTP中继代理会尝试直接向客户端发送DHCPOFFER、DHCPACK和DHCPNAK消息,使用单播传递。IP目标地址(在IP头中)设置为DHCP“yiaddr”地址,链路层目标地址设置为DHCP“chaddr”地址。不幸的是,一些客户端实现无法接收这样的单播IP数据报,直到该实现已配置了有效的IP地址(导致死锁,在此期间无法传递客户端的IP地址,直到客户端已配置了IP地址)。