DHCP 把一个 IPv4 地址和一段租期交给客户机。地址在 yiaddr,租期是选项 51,单位是秒。T1 默认是租期的一半,到点向原服务器续租;T2 默认是 0.875,到点改为广播。截至 2026 年 10 月,这只约束经这份协议拿到的地址。
四条报文在选定一台服务器
一个可独立引用的定义句:DHCP(RFC 2131)让客户机为一份网络地址获得有限租期。客户机可以在租期内延长,也可以释放。服务器即使收到无限租期的请求,仍可以发回一段有限但较长的租期,以便发现客户机已经离开。
分配一个新地址时,交换通常是四步:
- 客户机在本地物理子网上广播 DHCPDISCOVER。报文里可以建议地址和租期。不在同一子网上的服务器,要靠中继转发。
- 服务器可以用 DHCPOFFER 回答。可用地址放在 yiaddr,其余参数放在选项里。服务器不必把这个地址留给这台客户机;若留着,协议会更有效率。分配新地址时,服务器应当检查地址尚未被使用,例如发 ICMP 回显。服务器应当做成允许管理员关掉这种探测。
- 客户机可以等多个提供,再选一个。它广播 DHCPREQUEST。服务器标识选项必须指向选中的那一台,请求的 IP 地址选项必须等于那份提供里的 yiaddr。没有被选中的服务器把这则广播当成拒绝。
- 被选中的服务器把绑定写入持久存储,并回 DHCPACK。若不能满足请求,例如地址已经分给别人,应当回 DHCPNAK,客户机重新开始。收到确认后,客户机应当再检查一次,例如对这个地址做 ARP;发现已被占用,必须发 DHCPDECLINE,并应当至少等待 10 秒后再重新配置。
客户机到服务器的 UDP 目的端口是 67,服务器到客户机是 68。事务标识 xid 由客户机选择,用来把应答配回同一次请求。续租时,xid 对不上的 DHCPACK 被静默丢弃(第 4.4.5 节)。
消息种类在选项 53,长度 1。RFC 2132 的合法取值是:1 发现、2 提供、3 请求、4 拒绝、5 确认、6 否认、7 释放、8 仅要参数。同一节的图把取值画成 1–9。取值表没有定义 9。本文以取值表为准。
仅要参数(DHCPINFORM)表示客户机已经有外部配置的地址,只来问本网的参数。服务器不应当在 yiaddr 里填地址,也不应当带租期参数,并且不得为了这则报文去查已经存在的租约。它不是一次新的分配。
头里的四个地址不是同一个角色
| 字段 | 谁来填 | 表示什么 |
|---|---|---|
| ciaddr | 客户机 | 客户机自己的地址。表 1 写明,只在 BOUND、RENEW 或 REBINDING,并且能够回答 ARP 时填写 |
| yiaddr | 服务器 | 「给你的」地址,出现在提供和确认里 |
| siaddr | 服务器 | 引导下一步要用的服务器。只有服务器准备提供下一步引导时,才填自己的地址 |
| giaddr | 中继 | 中继自己的地址。客户机与服务器在同一子网时,这个字段是 0 |
表 1 写的是 RENEW,第 4.4.5 节的状态名叫 RENEWING。这是同一份文档里的用词差别。本文不把它们改成同一个拼写。
服务器标识是选项 54,长度 4,内容是服务器的地址。它和 siaddr 不是同一个字段。RFC 2131 写明:服务器总是在选项 54 里放自己的地址;siaddr 只在它还要提供下一步引导时才有这个含义。续租的请求里不得带选项 54。选择提供的那一次请求则必须带它。
中继用 giaddr 把别的子网上的发现和请求送到服务器。客户机自己把跳数设为 0。本文不写如何部署中继。
客户机标识是选项 61。服务器把它当作不透明的键来索引租约,不应当自行解释内容。客户机一旦在一则报文里用了它,以后每一则都必须用同一个。在所连接的子网上,这个标识必须唯一。它不代替 yiaddr,也不决定包走不走隧道。
T1 与 T2 是相对租期的两个时刻
一个可独立引用的定义句:T1 是客户机进入 RENEWING、向原来那台服务器续租的时刻。T2 是进入 REBINDING、改为联系任意服务器的时刻。T1 必须早于 T2,T2 必须早于租期结束(RFC 2131 第 4.4.5 节)。
为了不要求时钟对齐,T1 和 T2 在选项里用相对时间表示。选项 58 是进入 RENEWING 的秒数,选项 59 是进入 REBINDING 的秒数,都是 32 位无符号整数。没有另行给出时,T1 默认是租期的 0.5,T2 默认是租期的 0.875。服务器选择这两个时刻时,应当在固定值附近加一点随机,避免许多客户机同时续租。
到了 T1,客户机单播 DHCPREQUEST 给原来的服务器,ciaddr 填当前地址,不得包含服务器标识。它记下发送时刻。收到确认后,新的到期时刻是发送时刻加上确认里的租期,然后回到 BOUND。
到了 T2 仍没有确认,客户机改为广播 DHCPREQUEST,ciaddr 仍是当前地址,仍然不得带服务器标识。RENEWING 里重传前应当等待距离 T2 还剩时间的一半;REBINDING 里应当等待剩余租期的一半;两种等待都不短于 60 秒。
租期在收到确认之前结束,客户机进入 INIT,必须立刻停止其他网络处理,并像尚未初始化一样重新请求参数。客户机也可以在 T1 之前主动续租。优雅关闭时可以发送 DHCPRELEASE,单播给服务器,放弃剩余租期。没有释放并不表示租期无限。
路由器和解析器只是这次应答里的选项
和地址一起回来的参数里,和转发、解析直接相关的是下面几项。它们描述的是这一次 DHCP 应答,不是隧道对端的路由表。
| 选项 | 编号 | 内容 |
|---|---|---|
| 子网掩码 | 1 | 4 字节掩码。若和路由器选项同时出现,掩码必须排在前面 |
| 路由器 | 3 | 客户机子网上的路由器地址,按优先顺序。长度是 4 的倍数 |
| 域名服务器 | 6 | 可供使用的 DNS 服务器,按优先顺序。长度是 4 的倍数 |
| 地址租期 | 51 | 秒。提供报文里表示服务器愿意给出的租期 |
| 续租时刻 | 58 | 从获得地址到进入 RENEWING 的秒数 |
| 重新绑定时刻 | 59 | 从获得地址到进入 REBINDING 的秒数 |
选项 3 里的路由器,是客户机所在子网上的路由器。它不等于 IPv6 的默认路由器。IPv6 那一条来自路由器通告,见 IPv6 路由器通告。通告里的 M 位表示地址可以由 DHCPv6 获得。DHCPv6 是另一份协议。本文只写 RFC 2131 的 IPv4。
选项 6 给出递归解析器的地址。它不决定查询从哪一张接口发出,也不决定这个名字走不走隧道。查询最终从哪一条路离开,见 分离 DNS 和 DNS 泄漏。短名字用的搜索后缀是选项 119,见 DNS 搜索列表。那是另一份 RFC,不是选项 6。
拿到地址之后,这个地址才进入源地址的候选集。多个地址里先用哪一个,见 源地址选择。租约不代替那一组比较规则。
隧道接口不一定跑这份交换
三层虚拟接口和物理网卡是两张接口。DHCP 的发现要能在一条链路上广播,或经中继离开这条链路。二层虚拟网卡承载以太网帧,才有条件把广播形式的 DHCP 送到对端。TUN 与 TAP 区分的是帧和 IP 包,不是「有没有租约」这一句话。
隧道协议也可以自己把一个地址写到虚拟接口上,而不发送选项 53。那种地址没有 T1、T2,也不会因为一份没发生过的租期到期而按第 4.4.5 节进入 INIT。物理接口上已经拿到的租约,也不因为隧道图标而自动释放。
某一客户端在 2026 年 10 月用的是 DHCP、隧道自己的地址分配,还是两种都有,本文没有测量。本文不提供续租、释放或在虚拟接口上打开 DHCP 的步骤。
一个可独立引用的结论句:DHCP 租约是 yiaddr 加一段以秒计的期限。路由器选项和解析器选项只随这次应答生效。隧道接口上的地址可以另有来源,那份来源不继承 T1 和 T2。
现象对照
| 现象 | 更可能先看什么 |
|---|---|
| 有地址,选项 53 的确认已经对上 xid | 租期从这次确认起算,T1、T2 按选项或默认比例 |
| 到了一半租期就出现发往原服务器的单播请求 | RENEWING。请求里不应当有选项 54 |
| 更晚出现广播的请求,地址还在用 | T2 已到,进入 REBINDING |
| 租期结束,这个地址不再用于发包 | 没有及时确认,客户机必须停止使用并回到 INIT |
| 虚拟接口有地址,链路上没有发现或确认 | 地址可能由隧道协议写入。不能按 T1 去解释它 |
| 只有参数、yiaddr 为空 | 可能是 DHCPINFORM,不是一次新租约 |
核对清单
- 先看是不是选项 53:发现、提供、请求、确认才是一次新分配;仅要参数不发租约;
- 地址在 yiaddr,期限在选项 51:siaddr 不是服务器标识,标识是选项 54;
- T1 默认一半,T2 默认 0.875:都是相对秒数,并且都必须早于租期结束;
- 选项 3 和选项 6 只描述这次应答:IPv6 默认路由器看通告,搜索后缀看选项 119;
- 隧道接口要单独看:没有 DHCP 交换,就没有这份 T1 和 T2。