据我所知,DHCP 允许从 DHCP 服务器向网络上的客户端机器动态分配 IP 地址。客户端传输一个 DHCPDISCOVER 数据包,然后是一个 DHCPOFFER 从服务器返回到客户端,然后可以跟一个 DHCPREQUEST 等等。
因此,如果服务器收到客户端的 DHCPREQUEST 数据包后就正式“分配”了 IP 地址,那么在此之前是否有一些通用的 IP 分配规则?由路由器、交换机或网卡制成?
我很好奇,因为我知道我对网络的工作方式有很多误解,但也因为我试图使用 wireshark 查看一些 DHCPOFFER 和 DHCPREQUEST 数据包,wireshark 当然列出了源和目标 IP 地址,但我有不知道在整个过程完成之前会是什么。我只知道客户端的 MAC 地址,因为/var/log/messages字面意思是:DHCPDISCOVER from [MAC ADDRESS]
有一个基本点应该非常清楚,以正确弄清楚 DHCP 发生了什么:您在以太网网络上......在此之上,IP 数据包正在流动,在其中,UDP 数据包被封装,在内部其中发送/接收 DHCP 消息。简而言之,您必须考虑整个协议栈,而不是将自己局限于 DHCP。
您说:“客户端传输一个 DHCPDISCOVER 数据包,然后是从服务器返回给客户端的 DHCPOFFER,然后可以是 DHCPREQUEST 等等”
至于“客户端传输”部分,您应该考虑在以太网上,两台主机只能通过MAC 地址相互“交谈” 。这些是由硬件制造商在物理网络适配器内以唯一方式销毁的地址。例如,我现在使用的 PC 的网络适配器具有以下 MAC:“a4:ba:db:98:fc:a4”。
如果您认为,不能在“随机”基础上定义/分配 MAC 地址。实际上,每个供应商都被分配了一组固定的“地址集”,因此,完全有可能知道我的网络适配器是由 DELL 构建的
因此,现在我们知道以太网上的寻址基于 MAC 地址(而不是 IP 地址)。这意味着为了在以太网网络中有效地路由 IP 数据包,我们需要一些东西来获取目标主机的 MAC 地址。类似于:“我想向 IP 地址为 abcd 的主机发送一条消息;我需要它的 MAC 地址;一旦我获得这样的 MAC 地址,我将正确封装我的 IP 数据包并将其发送到该 MAC 地址”。
你可能想知道:
或者,更高级的协议栈:
这里的关键概念是BROADCAST。以太网和 IP 都提供了特殊的地址,当我们需要联系某个地址对我们来说是未知的人时,可以准确地使用这些地址。
在以太网中,特殊的 MAC 地址:ff:ff:ff:ff:ff:ff(48 位,全为 1),是广播。以太网协议规定,如果您是以太网适配器,则必须获取并读取:
这意味着:
然后
通过做这个:
回到您的问题,您想知道 IP 地址。
现在我们知道 DHCP-discover 消息被发送到以太网广播 MAC 地址,我们需要提醒的是,在以太网帧内封装了一个 IPv4 数据包。这样的 IPv4 数据包必须包含一个 SOURCE_IP 地址和一个 DESTINATION_IP 地址。在这种非常特殊的情况下(DHCP-discover 消息),发送主机不知道两者中的任何一个:
它不知道自己的 IPv4 地址,因为它正是开始要求的。因此,源地址字段将设置为 0.0.0.0;
它不知道 DHCP 服务器的 IPv4 地址。因此,目标地址字段将设置为 255.255.255.255(猜猜是什么?32 位,设置为 1。您注意到相似之处了吗?)
请注意,在这种非常特殊的情况下(DHCP 发现),这两个地址...大多无用:MAC 地址才是最重要的(再次:在此 DHCP 发现帧中)。
让我补充一点。您写道:“我正在尝试使用 wireshark 查看一些 DHCPOFFER 和 DHCPREQUEST 数据包,wireshark 当然会列出源 IP 地址和目标 IP 地址”。作为在以太网网络上运行的每个数据包嗅探器,Wireshark 会向您报告很多事情,包括源 mac 地址和目标 mac 地址。
实际上,Wireshark 将真正帮助您理解封装过程,因为您将准确地看到使用 MAC 寻址的以太网层(第 2 层),其中包含包含 IP 数据包的第 3 层(IPv4)。此外,在 IP 中,您将看到 DHCP 消息中包含的 UDP 数据包。
我期待你在没有任何过滤器的情况下启动了wireshark 捕获。这是因为如果您使用过滤器,您将面临无法捕获所有您需要的风险(提醒广播和无地址帧/数据包)。
PS:请原谅所有阅读此消息的技术人员:我知道我一直_极端_笼统和大量不严谨和正式的概念。我知道。我认为需要帮助@krb686 进入我非常喜欢的网络世界:-)
在拥有IP之前它没有IP。
一个示例 DHCP Discover 数据包将源 IP 设置为 0.0.0.0,目的地是 255.255.255.255,以向本地网络上的每个主机广播。
来自服务器的回复发送到客户端的 MAC 地址。当您说All I know about is the client's MAC address- 这就是 DHCP 服务器所知道的全部信息,这就足够了。
但是,主机为自己分配 IP 有一个标准,这通常在 DHCP 请求失败时发生。这些 IP 位于 169.254.0.0/16 范围内。
http://packetlife.net/blog/2008/sep/24/169-254-0-0-addresses-explained/
当主机无法动态获取地址时,它可以根据RFC 3927有选择地为自己分配链路本地 IPv4 地址。Microsoft 对此的术语是自动专用 Internet 协议寻址 (APIPA)。
因此,如果主机之前尝试过 DHCP 并且未能获得地址,并且现在再次尝试 DHCP,则它可能具有自分配的本地链路地址。
(这与DNS无关)