![对 DHCP/DNS 的误解 - DHCPOFFER/DHCPREQUEST 之前机器的 IP 是什么](https://linux22.com/image/659151/%E5%AF%B9%20DHCP%2FDNS%20%E7%9A%84%E8%AF%AF%E8%A7%A3%20-%20DHCPOFFER%2FDHCPREQUEST%20%E4%B9%8B%E5%89%8D%E6%9C%BA%E5%99%A8%E7%9A%84%20IP%20%E6%98%AF%E4%BB%80%E4%B9%88.png)
据我所知,DHCP 允许从 DHCP 服务器动态分配网络上的客户端计算机的 IP 地址。客户端传输一个 DHCPDISCOVER 数据包,然后从服务器向客户端发送一个 DHCPOFFER,然后可以发送一个 DHCPREQUEST,依此类推。
因此,如果服务器收到客户端的 DHCPREQUEST 数据包后正式“分配”了 IP 地址,那么在此之前是否存在一些通用的 IP 分配规则?由路由器、交换机或网卡制定?
我很好奇,因为我知道我对网络的工作原理有很多误解,而且因为我正在尝试使用 wireshark 查看一些 DHCPOFFER 和 DHCPREQUEST 数据包,wireshark 当然会列出源和目标 IP 地址,但我不知道在整个过程完成之前会是什么。我所知道的只是客户端的 MAC 地址,因为/var/log/messages
实际上只是说:DHCPDISCOVER from [MAC ADDRESS]
答案1
在有 IP 之前没有 IP。
一个DHCP 发现数据包示例将源 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/
当主机无法动态获取地址时,它可以选择性地为自己分配一个链路本地 IPv4 地址,具体如下:RFC 3927微软对此的术语是自动私有互联网协议寻址(APIPA)。
因此,如果主机之前尝试过 DHCP 但未能获取地址,并且现在再次尝试 DHCP,则它可能具有自分配的链路本地地址。
(这与 DNS 无关)
答案2
为了正确弄清楚 DHCP 发生的情况,必须明确一个基本点:你位于以太网网络上... IP 数据包在 IP 之上流动,UDP 数据包封装在 IP 数据包中,DHCP 消息在 IP 数据包中发送/接收。简而言之,您必须考虑整个协议栈,而不能局限于 DHCP。
你说: ”客户端发送一个 DHCPDISCOVER 数据包,然后服务器向客户端发送一个 DHCPOFFER 数据包,最后可以发送一个 DHCPREQUEST 数据包,依此类推“
至于“客户端传输”部分,你应该考虑到在以太网上,两台主机可以“交谈”彼此,这要归功于MAC 地址。这些地址是由硬件制造商在物理网络适配器中唯一刻录的。例如,我现在使用的 PC 的网络适配器有这个 MAC:“a4:ba:db:98:fc:a4”。
如果您认为 MAC 地址不能“随机”定义/分配。实际上,每个供应商都被分配了一组固定的地址,因此,完全有可能知道我的网络适配器由戴尔制造
因此,现在我们知道以太网上的寻址是基于 MAC 地址(而不是 IP 地址)。这意味着,为了在以太网内有效地路由 IP 数据包,我们需要一些东西来获取目标主机的 MAC 地址。例如:“我想向 IP 地址为 abcd 的主机发送一条消息;我需要它的 MAC 地址;一旦我获得这样的 MAC 地址,我将正确封装我的 IP 数据包并将其发送到该 MAC 地址“。
你可能会想:
- 如果我不知道目标主机的MAC地址怎么办?
或者,在协议栈上更高层次的描述:
- 如果我不知道目标主机的 IP 地址怎么办?
这里的关键概念是播送以太网和 IP 都提供了特殊地址,当我们需要联系某个我们不知道地址的人时就可以使用。
在以太网中,特殊的 MAC 地址:呂:呂:呂:呂:呂(48 位,全部为 1)是广播。以太网协议规定,如果您是以太网适配器,则必须获取并读取:
- 发往您自己的 MAC 地址的数据包(在我的笔记本电脑中,是 a4:ba:db:98:fc:a4);
- 发往广播地址 (ff:ff:ff:ff:ff:ff) 的数据包。
这意味着:
- 如果我是主持人还没有配置了 IP 地址和...
- 我配置为基于 DHCP 协议请求 IP 地址并且...
- 我通常不知道 DHCP 服务器的 MAC 地址,因此无法询问
然后
- 我可以在以太网帧内发送一个到以太网广播地址 (ff:ff:ff:ff:ff:ff) 的 DHCP 请求。
通过做这个:
- 我的局域网上的每个以太网主机都将接收我的请求;
- 所有未运行 DHCP 服务器的主机将会忽略它;
- DHCP 服务器将会理解这是一个 DHCP 消息并且会进行相应的处理。
- DHCP 服务器将使用自己的 MAC 地址作为“源 MAC”,使用自己的 IP 地址作为“源 IP”进行回复(使用以太网帧)(因此,对我来说,直接向它发送下一帧,而不再通过广播发送),并使用我的 MAC 地址作为目标 MAC(我的 MAC 在我的原始帧的 source_MAC 字段中报告)。
回到你的问题,你想知道的是 IP 地址。
现在我们知道 DHCP 发现消息被发送到以太网广播 MAC 地址,我们需要提醒的是,以太网帧内封装了一个 IPv4 数据包。此类 IPv4 数据包必须包含 SOURCE_IP 地址和 DESTINATION_IP 地址。在这个非常特殊的情况下(DHCP 发现消息),发送主机不知道以下两个地址:
它不知道自己的 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 捕获没有任何过滤器。这是因为如果你使用过滤器,你就有风险不是捕获您需要的所有内容(提醒广播和无地址的帧/数据包)。
附言:我请求所有阅读此消息的技术人员的原谅:我知道我一直_极其_通用且大量非批判性且正式的概念。我知道。我认为这有助于@krb686 进入我非常喜欢的网络世界 :-)
答案3
在 DHCP 握手成功完成之前,客户端没有 IP 地址。
它之所以有效并且您不会遇到“先有鸡还是先有蛋”的问题,是因为两个主机在同一子网内进行通信不需要 IP 地址 - 只需使用 MAC 地址即可完成。
答案4
DHCP 是通过 UDP 完成的,也就是说,它确实使用 IP 地址。目的地是广播,源是 0.0.0.0(对于客户端)或服务器回复的 IP(对于服务器)。