DHCP:加入网络
加入网络
当一台计算机首次加入网络时,它需要哪些信息才能连接到互联网?
我们总是知道自己的 MAC 地址,因为它是固化在硬件中的。
我们需要被分配一个 IP 地址,这样才能发送和接收数据包。要知道,IP 地址是按地域分配的,所以当我们连接到一个新网络时,需要有人给我们一个可用的 IP 地址。
我们需要了解子网掩码,以便知道本地 IP 地址的范围。有了子网掩码(固定位全为 1,非固定位全为 0),我们可以将掩码与自己的 IP 地址进行按位与运算,从而得到本地 IP 前缀。
我们需要知道本地网络中的路由器是谁,这样才能将所有非本地数据包发送给路由器。有时我们把这个路由器称为默认网关。
我们可能还需要知道这个网络的 DNS 递归解析器的位置。
用户在首次加入网络时可以手动配置这些值。但这很耗时,尤其是每次加入不同网络时都要重新配置。而且,普通互联网用户可能根本不知道如何手动配置这些值。不过,对于路由器这类不常移动的设备,手动配置有时是可行的。
我们需要一种协议,让新主机能够自动获取这些值(以及其他可能有用的信息)。
DHCP:动态主机配置协议
DHCP 有四个步骤:
- 新客户端广播一条发现(Discover) 消息,请求配置信息。

- 任何能够提供帮助的DHCP 服务器都会向客户端单播一条提供(Offer) 消息,其中包含客户端可使用的配置(例如 IP 地址、网关地址、DNS 地址)。

- 客户端会广播一条请求(Request) 消息,表明它接受了哪个提供。这条消息之所以广播,是因为客户端可能会收到多个提供。通过告知所有服务器自己接受了哪个提供,客户端可以让被拒绝的提供释放出来,供未来的客户端使用。

- 服务器发送一条确认消息,确认请求已被批准。

DHCP 服务器
在步骤 2 中,谁能提供配置呢?DHCP 服务器被添加到网络中,它们的作用就是向新主机提供这些信息。在家庭网络等小型网络中,家庭路由器本身通常就充当 DHCP 服务器。在大型网络中,可能会有专门的机器作为 DHCP 服务器。
DHCP 服务器需要与客户端位于同一个本地网络中,因为该协议在本地网络内部运行。在大型网络中,我们可能不希望在每个路由器中都运行 DHCP 服务器代码,因此本地路由器可以将请求中继到运行该协议的中央远程 DHCP 服务器。
DHCP 服务器监听固定端口(UDP 端口 67),以接收新机器的请求。服务器配置了所有必要的信息:它们知道网关和 DNS 服务器的信息,并且拥有一个可分配给新用户的可用 IP 地址池。

需要注意的是,IP 地址仅暂时租借给主机。租约只有有限的有效期(例如几小时或几天)。如果主机想继续使用该地址,必须续租。如果一个 IP 地址当前已租借给某台主机,DHCP 服务器不能将该地址提供给其他客户端。
DHCP 的实现
需要注意的是,DHCP 是一种第七层应用协议,它运行在 UDP 之上,而 UDP 又运行在 IP 之上。
在步骤 1 中,客户端如何通过 IP 广播消息?它发送一个目的 IP 为 255.255.255.255(全为 1)的数据包,这是 IPv4 的广播地址。当这个数据包被传递到第二层时,不会通过 ARP 转换这个 IP 地址,而是将 IPv4 广播地址映射到以太网广播地址 FF:FF:FF:FF:FF:FF(全为 1)。这样,数据包就可以在第二层在网络中广播。
那么源 IP 呢?在协议开始时,客户端还没有 IP 地址,所以它将源 IP 设置为 0.0.0.0。
有了固定的源 IP(0.0.0.0)和目的 IP(255.255.255.255),客户端在开始运行该协议时不需要知道任何关于本地网络的信息。
如果没有源 IP,DHCP 服务器如何知道如何单播提供消息呢?DHCP 服务器可以广播提供消息,或者使用客户端的 MAC 地址来单播提供消息。
IPv6 中的自动配置
DHCP 也存在于 IPv6 网络中。然而,由于 IPv6 地址更长,实际上我们可以为自己分配一个保证唯一的 IPv6 地址,而无需其他设备管理地址池并进行租赁。这种协议称为无状态地址自动配置(SLAAC)。
其原理是使用我们已知的、每台机器唯一的 MAC 地址。和之前一样,我们请求本地网络信息,包括网关地址、DNS 地址,特别是本地网络的前缀。这个前缀通常是 64 位长。然后,我们将自己的 MAC 地址位复制到 IPv6 地址的主机位中。我们可以确信没有其他设备会使用这个 IPv6 地址:其他网络中的用户会有不同的前缀,而网络中(或其他任何地方)没有其他设备会有相同的 MAC 地址位。

为了获取本地网络信息,我们可以扩展邻居发现协议(ARP 的 IPv6 版本)。路由器请求消息让用户广播对本地网络信息的请求,而路由器通告消息让路由器回复这些信息。
SLAAC 还有额外的机制来检测重复地址,以防万一。
(注:文档部分内容可能由 AI 生成)