如何单播 DHCP OFFER 消息?
虽然0.0.0.0可以将 的地址用作 DHCP 的源地址,但不应将其用作网络上的目标地址。服务器可以发送单播消息,因为它知道主机的 MAC 地址。请记住,传送到主机的所有流量都在第 2 层,因此重要的地址是 MAC 地址。
这很重要,因为 DHCP 服务器可能与请求主机不在同一个 LAN 上。DHCP Offer 可能需要通过第 3 层路由回请求主机所连接的网络。
编辑:
感谢 Richarb 提供了 Bootstrap 协议的澄清和扩展链接:
3.1.1 广播标志
通常,BOOTP 服务器和中继代理尝试使用单播传送将 BOOTREPLY 消息直接传送到客户端。IP 目标地址(在 IP 标头中)设置为 BOOTP 'yiaddr' 地址,链路层目标地址设置为 BOOTP 'chaddr' 地址。不幸的是,一些客户端实现无法接收这样的单播 IP 数据报,直到它们知道自己的 IP 地址(因此我们有一个“鸡与蛋”的问题)。然而,它们通常可以接收广播 IP 数据报(那些将有效的 IP 广播地址作为 IP 目的地,将链路层广播地址作为链路层目的地的数据报)。
如果客户端属于这一类,它应该在它生成的 BOOTREPLY 消息的“标志”字段中设置(为 1)新定义的 BROADCAST 标志。这将向 BOOTP 服务器和中继代理提供一个提示,提示他们应该尝试向客户端广播他们的 BOOTREPLY 消息。
如果客户端没有这个限制(即它完全能够接收单播 BOOTREPLY 消息),它不应该设置 BROADCAST 标志(即它应该将 BROADCAST 标志清除为 0)。
DISCUSSION: This addition to the protocol is a workaround for old host implementations. Such implementations SHOULD be modified so that they may receive unicast BOOTREPLY messages, thus making use of this workaround unnecessary. In general, the use of this mechanism is discouraged.
客户端开始于 INIT 状态并形成 DHCPDISCOVER 消息。
客户端应该等待 1 到 10 秒之间的随机时间
在启动时不同步 DHCP 的使用。客户端将“ciaddr”(客户端 IP 地址)设置为 0x00000000。客户端可以通过包含“参数请求列表”选项来请求特定参数。客户端可以通过包含“请求的 IP 地址”和“IP 地址租用时间”选项来建议网络地址和/或租用时间。客户端必须在“chaddr”(客户端硬件地址)字段中包含其硬件地址,以用于传递 DHCP 回复消息。客户端可以在“客户端标识符”选项中包含不同的唯一标识符。如果客户端不包括“客户端标识符”选项,服务器将使用“chaddr”字段的内容来标识客户端的租用。客户端生成并记录一个随机事务标识符并将该标识符插入到“xid”字段中。客户端记录自己的本地时间,以备日后计算租约到期时使用。 然后客户端将本地硬件广播地址上的 DHCPDISCOVER 广播到 0xffffffff IP 广播地址和“DHCP 服务器”UDP 端口。
如果到达的 DHCPOFFER 消息的“xid”(事务 ID)与最近的 DHCPDISCOVER 消息的“xid”不匹配,则必须静默丢弃 DHCPOFFER 消息。任何到达的 DHCPACK 消息都必须以静默方式丢弃。
客户端在一段时间内收集 DHCPOFFER 消息,从(可能很多)传入的 DHCPOFFER 消息(例如,第一个 DHCPOFFER 消息或来自先前使用的服务器的 DHCPOFFER 消息)中选择一个 DHCPOFFER 消息,并从“服务器”中提取服务器地址DHCPOFFER 消息中的标识符选项。客户端收集消息的时间和用于选择一个 DHCPOFFER 的机制取决于实现。客户端可以对建议的地址执行检查以确保该地址未被使用。例如,如果客户端位于支持 ARP 的网络上,则客户端可能会针对建议的请求发出 ARP 请求。在广播对建议地址的 ARP 请求时,客户端必须填写自己的硬件地址作为发送方的硬件地址,0作为发送方的IP地址,以免混淆同一子网其他主机的ARP缓存。如果网络地址似乎在使用中,客户端会向服务器发送一条 DHCPDECLINE 消息并等待另一个 DHCPOFFER。由于客户端没有有效的网络地址,客户端必须广播 DHCPDECLINE 消息。

