跳到主要内容

DHCP

DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)让主机从服务器取得 IP 地址及相关网络参数。它不仅解决「分配哪个地址」,还规定动态地址能用多久、怎样延长使用时间,以及服务器不在本链路时如何通过中继取得配置。

本文讲 DHCPv4。面试中需要沿着客户端状态解释报文:首次取得新地址通常经历 Discover、Offer、Request、ACK;已有有效租约时,客户端可以直接请求续期,不必每次重新寻找服务器。取得地址、默认网关和 DNS 参数,也只代表配置完成,还不能证明后续网络和应用可用。

1. 面试核心​

先记住这几条,再读正文
  • 动态分配通常建立有期限的地址租约。客户端还可以取得子网掩码、路由器和 DNS 服务器等参数,各自承担不同职责。卡 · 地址租约与配置参数
  • 首次分配通常按 Discover → Offer → Request → ACK 推进。Offer 提供候选配置,客户端选择后用 Request 表明选择,ACK 才确认本次分配;收到 ACK 后还要检查并应用配置。卡 · 首次取得新地址
  • DHCPv4 使用 UDP:客户端端口 68、服务器端口 67。未配置地址的客户端可以从 0.0.0.0 向 255.255.255.255 广播;丢包后的重传由 DHCP 处理,网络上不保证恰好出现四个报文。卡 · 没有 IP 地址,为什么也能通信?
  • 到 T1 通常向原服务器单播续租;到 T2 仍未成功则广播重绑定。租约尚有效时仍可使用地址,到期未获确认必须停止使用,不能一直沿用旧配置。卡 · 续租、重绑定与到期
  • DHCP 中继接收本链路请求,再转交远端服务器;giaddr 帮助服务器识别客户端网络和返回路径。中继地址、服务器标识和默认网关不是同一个字段。卡 · DHCP 中继
  • DHCPREQUEST 不只出现在首次选择,也用于重启确认、续租和重绑定;要结合客户端状态与字段理解报文,不能看到 Request 就断定之前一定有 Discover。卡 · 同样是 Request,字段为什么不同

2. 地址租约与配置参数​

租约是服务器允许某个客户端使用某个地址及其使用期限的约定。对于有限租期,服务器维护地址与客户端的绑定,客户端记录有效期,并在期限内尝试延长。租约到期并不等于客户端会立刻得到另一个 IP,后续结果还取决于服务器、地址池和网络是否可用。

DHCPv4 也允许无限租期,使用时间值 0xffffffff 表示。下文的续租、重绑定和到期过程讨论有限租期。

DHCPv4 沿用 BOOTP 的基本报文布局,地址和配置分散在不同字段与选项中:

字段或选项含义对客户端的作用
yiaddr服务器提供或确认给客户端的地址首次分配时取得自己的 IPv4 地址
子网掩码,选项 1客户端所在网络的掩码配合地址形成网络前缀,参与直连路由配置
Router,选项 3客户端子网内的路由器地址列表用于配置路由;普通网络中常用来设置默认网关
DNS Server,选项 6DNS 服务器地址列表告诉解析器向哪里查询域名
Lease Time,选项 51租约时长,单位为秒确定有效期
Server Identifier,选项 54DHCP 服务器标识,使用服务器可达的 IP表明选择了哪台服务器,并用于后续单播请求
T1、T2,选项 58、59续租与重绑定的相对时间决定何时切换请求方式

例如,客户端取得 192.0.2.100、掩码 255.255.255.0、路由器 192.0.2.1、DNS 192.0.2.53。前三项让系统能够配置本地地址及相应路由,DNS 参数则用于名称解析。DNS 地址不是业务请求必经的下一跳,默认网关也不一定提供 DNS 服务。路由如何选择见 IP 的子网与路由选择,域名查询见 DNS。

服务器可以按策略从地址池选择地址,也可以为特定客户端保留固定地址。DHCP 保留地址仍然通过 DHCP 取得配置,与在操作系统里手工填写静态地址不同。识别客户端可以使用客户端标识或硬件地址等信息,不能把「只按 MAC 永久绑定」当作协议的全部规则。

3. 首次取得新地址​

3.1 四类报文如何衔接​

DORA 是 Discover、Offer、Request、ACK 四个名称的缩写,描述客户端首次取得新地址的典型流程。它们的职责不同,不能把 Offer 当成已经完成的分配。

阶段客户端或服务器做什么需要关注的字段
DHCPDISCOVER客户端寻找可用 DHCP 服务事务 ID xid、客户端标识;尚未配置地址时 ciaddr 为零
DHCPOFFER服务器提供候选地址与配置yiaddr、服务器标识、租约及配置选项
DHCPREQUEST客户端选择一个 Offer 并请求确认所选服务器标识、请求地址选项 50;此时 ciaddr 仍为零
DHCPACK所选服务器确认绑定并返回最终参数确认的地址、租约和配置选项

客户端可能收到多个 Offer,按自身策略选择其中一个。首次选择阶段的 Request 使用广播,并带上选中的服务器标识,让其他服务器也能知道客户端没有接受自己的 Offer。不能把所有实现的策略都写成「永远选择第一个响应」。

收到有效 ACK 后,客户端核对参数并完成本地配置。RFC 2131 建议在使用前再检查地址是否已被占用;发现冲突时发送 DHCPDECLINE 并重新开始。IPv4 地址冲突探测的字段和边界见 ARP 的地址探测与公告。本地网络管理程序如何安装地址、路由和解析器配置,属于客户端实现,报文不会直接修改操作系统设置。

3.2 没有 IP 地址,为什么也能通信?​

客户端在首次配置前不需要先有一个可路由的单播地址。DHCPv4 允许它使用源 IP 0.0.0.0、目标 IP 255.255.255.255 广播请求,在以太网上对应广播帧。服务器知道这是一条请求配置的消息,可以根据事务 ID、客户端标识或报文里的硬件地址匹配会话。

普通客户端与服务器之间使用 UDP 的 68 和 67 端口。UDP 没有 TCP 那样的建连握手,也支持这种广播通信;DHCP 自己维护状态、超时和重传,见 TCP 与 UDP 的传输控制开销。

**Offer 和 ACK 不一定都是广播。**没有中继时,服务器会结合 ciaddr、客户端的广播标志和可接收条件选择发送方式:已有地址的客户端可以接收单播;尚未配置 IP 的客户端,如果声明能在这个阶段接收单播,服务器也可以向它的候选地址和硬件地址发送。需要广播接收时,客户端设置相应标志。经过中继时,服务器首先把响应交还中继。

3.3 一次实际交互能说明什么​

下面是隔离 Linux veth 链路上,ISC DHCP 4.4.3-P1 客户端与 dnsmasq 2.90 服务器的实际报文摘要。服务器位于 192.0.2.1,地址池只提供 192.0.2.100。表格按消息作用归纳,省略了重传和重复 Offer:

报文关键内容
Discover0.0.0.0:68 → 255.255.255.255:67
Offer提供 192.0.2.100,服务器标识为 192.0.2.1
Request广播选择 192.0.2.1,请求地址 192.0.2.100,ciaddr=0.0.0.0
ACK确认 192.0.2.100;掩码 /24、路由器 192.0.2.1、DNS 192.0.2.53、租约 120 秒

抓包中出现过 Discover 重传以及重复 Offer。检查时要用 xid 和选择的地址、服务器等字段还原一次交互,不能仅按连续四个包的位置判断成功。这个现象也说明:DORA 是状态与职责的顺序,不是网络上的固定包数。

实验客户端使用显式回调在自己的命名空间内应用地址和默认路由,DNS 只记录收到的参数,没有进行外部解析。这样可以验证协议交付了什么,同时把「参数已收到」与「目标服务实际可用」分开。

4. 续租、重绑定与到期​

4.1 T1 与 T2 控制不同的恢复阶段​

续租是在已有租约仍有效时,向原服务器申请延长使用期限。重绑定是在原服务器尚未确认续租时,转而寻找任何能够确认这份租约的服务器。两者都使用 DHCPREQUEST,区别主要在发送范围和客户端状态。

客户端阶段请求方式地址使用情况
BOUND已有有效租约,等待续期时机可以正常使用当前地址
RENEWING到 T1,通常向原服务器单播 Request租约未过期时继续使用
REBINDING到 T2 仍未成功,广播 Request租约未过期时继续使用
租约到期停止使用旧地址,重新进入初始化不能仅因「以前能用」继续保留旧地址通信

T1、T2 是相对于租约计时起点的时间,必须满足 T1 < T2 < 租约到期时间。服务器可以通过选项配置它们;未另行指定时,默认 T1 为租约时长的 50%,T2 为 87.5%。例如,8 小时租约对应的默认时间是第 4 小时开始续租、第 7 小时开始重绑定,第 8 小时到期。

这些比例是默认值,不是所有抓包都必须精确符合的固定时刻。服务器可以另配时间,客户端也允许提前续租,并可能引入随机偏移,避免大量设备同时发送请求。

4.2 同样是 Request,字段为什么不同​

续租和重绑定时,客户端已经有可用地址,所以把当前地址填入 ciaddr。与首次选择不同,这两种 Request 不携带服务器标识选项,也不携带请求地址选项 50:

  • 续租直接把 IP 数据报单播到原服务器,目标 IP 已表明这次向谁请求。
  • 重绑定用广播寻找能确认租约的服务器,不能用首次选择的服务器标识把请求限定给原服务器。

收到匹配本次事务的 ACK 后,客户端重新计算租约时间并返回 BOUND。RFC 2131 按发送相关 Request 的本地时间加上 ACK 中的租约时长计算到期时刻,不能因为 ACK 在网络中延迟到达,就把这段延迟额外当成可用租期。

4.3 服务器离线会立即断网吗?​

不会仅因为 DHCP 服务器离线就立即丢失当前地址,前提是租约仍有效,实际转发路径和其他服务仍可用。DHCP 服务负责配置与租期确认,数据流量不必经过 DHCP 服务进程。

隔离实验先等待客户端成功续租,再停止服务器进程,保持虚拟链路和路由器接口运行。抓包随后观察到向原服务器的单播请求与重绑定广播;在租约有效期内,客户端仍保留 192.0.2.100。最终没有收到 ACK,真实客户端产生到期事件,实验回调移除了该命名空间内的旧地址和路由,客户端重新从 0.0.0.0 广播 Discover。

这里验证的是协议状态和客户端回调的配置行为,没有把「仍保留地址」推断为任何外部业务必然可用。服务器、网关和 DNS 即使运行在同一设备上,也仍要分清哪个功能故障。

5. DHCP 中继​

5.1 中继怎样跨过广播边界​

DHCP 中继是在客户端链路接收 DHCP 消息、再转交远端服务器的代理。普通路由转发不会把 255.255.255.255 的有限广播直接送到另一个子网,所以服务器不在本链路时,需要这类明确配置的转交机制。

典型的 DHCPv4 中继过程是:

  1. 客户端在本链路广播 Discover。
  2. 中继接收请求,在 giaddr 中填写客户端侧的中继地址,并转发给配置的服务器。
  3. 服务器结合 giaddr 和自身配置选择相应网络的地址池,把响应发回中继的 UDP 67 端口。
  4. 中继按客户端接收条件,在客户端链路交付响应。首次 Request 和 ACK 也可沿同一路径传递。

giaddr 既帮助服务器判断客户端来自哪个网络,也提供返回中继的地址;服务器不应只根据收到请求的自身接口,给远端客户端分配服务器所在子网的地址。客户端续租时已经有地址和路由,向服务器的单播请求可以直接经过普通 IP 路由,不必再由中继处理 DHCP 广播。

5.2 三种地址分别指向谁​

隔离实验的客户端位于 192.0.2.0/24,中继的客户端侧地址为 192.0.2.1,远端 DHCP 服务器为 198.51.100.2。两条链路的抓包确认了:

地址或报文位置实际值与用途
客户端最初的 Discover广播到本链路,giaddr=0.0.0.0
中继发往服务器的请求单播给 198.51.100.2,giaddr=192.0.2.1,中继跳数增加
服务器的响应发往 192.0.2.1:67,分配客户端网络中的 192.0.2.100
Server Identifier198.51.100.2,标识 DHCP 服务器
Router 选项192.0.2.1,供客户端配置网关
DNS 选项192.0.2.53,供客户端配置名称解析

中继与服务器之间本例使用 UDP 67 到 67,客户端侧仍使用 68 与 67。客户端广播没有被原样跨网段路由,而是由中继收到后生成转交报文;事务 ID 保持对应关系。

本例中中继地址恰好也是默认网关,但协议没有要求两者必须相同。默认网关来自 Router 等路由配置,DHCP 服务器标识来自选项 54,giaddr 属于中继转交信息,不能因为字段里都存 IP 就混为一谈。

6. 其他状态与故障判断​

6.1 重启后是否必须重新走 DORA?​

不一定。客户端如果记得之前取得的地址,可以进入 INIT-REBOOT 状态,广播 Request 请求确认原配置。此时 ciaddr 为零,请求地址选项填旧地址,但不带服务器标识;它不是首次 Offer 选择,也不是持有已配置地址时的单播续租。

服务器依据地址、网络与已有绑定判断是否确认。客户端收到 ACK 后继续配置,收到 NAK 则重新开始;未收到回复也要按状态机超时处理,不能把沉默解释成永久许可。

6.2 除四类报文外,还需要区分什么?​

以下报文处理不同的情况,不能统称为「分配失败」:

报文主要含义
DHCPNAK服务器否定客户端请求的配置,客户端需要回到初始化处理
DHCPDECLINE客户端发现提供的地址冲突,告知服务器不能使用
DHCPRELEASE客户端主动放弃租约,服务器可据此回收绑定
DHCPINFORM客户端已有外部配置的地址,向服务器请求其他配置参数,不通过这次交互分配新租约

客户端可能突然断电,Release 不一定能发出,因此正常回收不能依赖每个客户端都主动释放。租约到期机制解决了这类状态无法及时通知的问题。

6.3 有地址但不能访问服务,应当怎样判断?​

先确认地址和租期是否有效,再区分路由、名称解析和目标服务。拿到了地址但缺少正确网关,可能只影响跨网段访问;网关正确但 DNS 参数不可用,可能表现为域名解析失败;这些都不能直接归因于「DHCP 没分到 IP」。

基础 DHCPv4 分配流程也不会自动建立可信服务器身份。错误或未授权服务器可能提供不正确的路由、DNS 或地址,部署时需要约束可用的 DHCP 服务和接入路径。本文没有展开网络设备的安全配置,也没有把服务器确认等同于对后续应用流量的认证。

7 · 面试题卡片​

本页题目与参考回答

7.1 DHCP 首次为客户端分配新地址的流程是什么?​

考察重点:四类报文的职责、客户端选择和最终配置条件。

相关内容:首次取得新地址。

参考回答

**典型流程是 Discover 寻找服务器、Offer 提供候选配置、Request 表明选择并请求确认、ACK 确认绑定和参数。**客户端可能收到多个 Offer,选择阶段通过广播 Request 携带所选服务器标识和请求地址,让其他服务器知道选择结果。

客户端收到有效 ACK 后检查并应用地址、租期和网络参数;发现地址冲突时发送 Decline 并重新配置。丢包可能触发重传,所以四类报文不等于线上固定只有四个包。

7.2 客户端还没有 IP,怎样发送 DHCP 请求?为什么不能说四个报文都广播?​

考察重点:引导阶段地址、UDP 端口和服务端发送条件。

相关内容:没有 IP 地址,为什么也能通信。

参考回答

**未配置地址的客户端可以从 0.0.0.0:68 向 255.255.255.255:67 发送 UDP 广播。**DHCP 使用事务 ID 和客户端相关字段识别交互,自行处理超时与重传。

服务器响应要看已有地址、广播标志、客户端接收条件及是否经过中继;Offer、ACK 可以单播,也可以广播。已有有效租约时的续租通常直接单播到原服务器,因此不能把广播作为所有 DHCP 报文的共同属性。

7.3 T1、T2 和租约到期分别发生什么?​

考察重点:续租与重绑定、配置有效期和失败处理。

相关内容:续租、重绑定与到期。

参考回答

**到 T1 通常向原服务器单播 Request 续租,到 T2 仍未确认则广播 Request 重绑定,到期未成功必须停止使用旧地址并重新初始化。**T1、T2 必须先于到期且 T1 小于 T2;默认分别为租期的 50% 和 87.5%,服务器可以配置,实际请求也可能提前或带随机偏移。

续租和重绑定时用 ciaddr 填当前地址,不带首次选择使用的服务器标识与请求地址选项。ACK 确认后重新计算租约;服务器暂时离线不会单独导致有效租约立即失效。

7.4 DHCP 服务器在另一个网段,中继怎样帮助客户端取得地址?​

考察重点:广播范围、giaddr、地址池选择和响应路径。

相关内容:DHCP 中继。

参考回答

**中继在客户端链路接收广播,再把 DHCP 消息转交远端服务器。**典型 DHCPv4 中继填写客户端侧的 giaddr,服务器据此和配置选择客户端所在网络的地址池,并把响应交回中继的 UDP 67 端口,再由中继在本链路交付。

这不是普通路由直接转发有限广播。giaddr 也不是默认网关选项;服务器标识、中继地址和客户端使用的路由器各有独立职责。

7.5 DHCP 发来的地址、掩码、网关和 DNS 各解决什么问题?​

考察重点:配置参数、路由和名称解析的分工。

相关内容:地址租约与配置参数、有地址但不能访问服务,应当怎样判断。

参考回答

**地址与掩码用于配置接口和网络前缀,路由器参数用于配置下一跳,DNS 参数用于配置名称解析。**默认网关不一定是 DNS 服务器,DHCP 服务器也不必参与后续业务数据的转发。

收到这些参数不代表路由、DNS 和远端服务已经验证可用。排查时要分别确认租约有效性、实际路由、名称解析和服务响应。

7.6 抓到 DHCPREQUEST,能否判断它之前一定收到过 Offer?​

考察重点:首次选择、重启确认、续租和重绑定的状态区分。

相关内容:同样是 Request,字段为什么不同、重启后是否必须重新走 DORA。

参考回答

**不能。Request 在多个状态中使用,必须结合字段和发送范围判断。**首次选择包含服务器标识和请求地址,ciaddr 为零;重启确认包含旧的请求地址、不含服务器标识,ciaddr 也为零。

续租和重绑定则把当前地址放在 ciaddr,不带上述两个选项:续租通常单播,重绑定广播。不能只凭报文名称重建前面的流程。

8. 参考资料​

来源:Coding 101 原文 · 免费阅读,引用请保留出处。内容使用说明