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,选项 6 | DNS 服务器地址列表 | 告诉解析器向哪里查询域名 |
| Lease Time,选项 51 | 租约时长,单位为秒 | 确定有效期 |
| Server Identifier,选项 54 | DHCP 服务器标识,使用服务器可达的 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:
| 报文 | 关键内容 |
|---|---|
| Discover | 0.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 中继过程是:
- 客户端在本链路广播 Discover。
- 中继接收请求,在
giaddr中填写客户端侧的中继地址,并转发给配置的服务器。 - 服务器结合
giaddr和自身配置选择相应网络的地址池,把响应发回中继的 UDP 67 端口。 - 中继按客户端接收条件,在客户端链路交付响应。首次 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 Identifier | 198.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. 参考资料
- RFC 2131 §3、§4:DHCPv4 分配、状态、续期和中继处理
- RFC 2132:地址配置、租期和服务器标识等选项
- RFC 1542 §4:BOOTP 中继行为
- dnsmasq 2.90 官方源码与手册
- ISC DHCP 4.4.3:客户端配置回调
来源:Coding 101 原文 · 免费阅读,引用请保留出处。内容使用说明