为什么DHCP Offer和Ack需要广播?

14
为什么服务器不能像在DHCP Discover和Request的源IP中使用0.0.0.0的目标IP地址那样使用它?它可以使用从DHCP Discover和Request中学到的客户端MAC地址来将帧定向到适当的客户端机器。

我怀疑这是在存在多个协作DHCP服务器的环境中工作所必需的。它也可能需要为中继代理正常工作。 - Flexo
2个回答

20

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。

其中,ciaddrgiaddr 是:

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地址)和消息发送者(是否为中继代理或仅为客户端)选择广播与否。

Unicast DHCPOFFER

在这种情况下,我的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节)。

你的问题表述不够清晰。请在Superuser上发布一个新问题,详细描述涉及设备的行为、它们的角色以及可能的IP地址和捕获日志。 - Avio
我有一个类似的问题,但是我的设备发送了一个目标地址为255.255.255.255的DHCP Discover数据包,服务器收到了这个消息(因为我使用数据包记录器来查看所有节点的活动),并回复了一个广播帧作为DHCP服务器的响应。但是设备不接受IP配置。对于这种异常情况有任何解释吗? - Abhinav
好的回答。解释了事情的运作方式,以及是否可能拥有非广播的DHCPOFFER。但我也想知道为什么要有广播的DHCPOFFER。有什么想法吗? - limitcracker

0

来自RFC 2131,第24页:

通常,DHCP服务器和BOOTP中继代理会尝试直接向客户端发送DHCPOFFER、DHCPACK和DHCPNAK消息,使用单播传递。IP目标地址(在IP头中)设置为DHCP“yiaddr”地址,链路层目标地址设置为DHCP“chaddr”地址。不幸的是,一些客户端实现无法接收这样的单播IP数据报,直到该实现已配置了有效的IP地址(导致死锁,在此期间无法传递客户端的IP地址,直到客户端已配置了IP地址)。

一个不能在其协议软件被配置为IP地址之前接收单播IP数据报的客户端应在其发送的任何DHCPDISCOVER或DHCPREQUEST消息的“flags”字段中将BROADCAST位设置为1。广播位将向DHCP服务器和BOOTP中继代理提供提示,以在客户端的子网上向客户端广播任何消息。

在其协议软件被配置之前可以接收单播IP数据报的客户端应将BROADCAST位清除为0。BOOTP澄清文件讨论了使用BROADCAST位的影响。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接