第46篇:DHCP 原理——Discover→Offer→Request→ACK
一、写在前面
第 3 篇文章我们简单介绍过 DHCP 的 DORA 四步交互。这篇深入 DHCP 协议的完整工作流程,包括报文格式、IP 地址冲突检测、续租机制等细节。
DHCP(Dynamic Host Configuration Protocol)是网络中最重要的基础服务之一——没有 DHCP,每台 PC 都要手动配 IP,几百台设备配置量巨大。
二、DHCP 四步交互详解(DORA)
2.1 场景
PC-A(刚开机,没有 IP) DHCP Server(192.168.1.1)
│ │
│ 1. DHCP Discover (广播) │
│ "谁可以给我一个IP地址?" │
│ 源 IP: 0.0.0.0 │
│ 目的 IP: 255.255.255.255 │
│ 源 MAC: PC-A 的 MAC │
│ 目的 MAC: FF:FF:FF:FF:FF:FF │
│──────────────────────────────────────>│
│ │
│ 2. DHCP Offer (单播/广播) │
│ "给你 192.168.1.100 用" │
│ IP: 192.168.1.100 │
│ 子网掩码: 255.255.255.0 │
│ 网关: 192.168.1.1 │
│ DNS: 114.114.114.114 │
│ 租期: 1 天 │
│<──────────────────────────────────────│
│ │
│ 3. DHCP Request (广播) │
│ "我接受 192.168.1.100" │
│ 确认想要服务器提供的 IP │
│──────────────────────────────────────>│
│ │
│ 4. DHCP ACK (单播/广播) │
│ "好,确认给你,可以用了" │
│<──────────────────────────────────────│
│ │
PC-A 配置 IP=192.168.1.100/24
2.2 为什么 Discover 和 Request 是广播?
| 报文 | 为什么是广播 |
|---|---|
| Discover | 客户端不知道 DHCP 服务器的 IP,只能广播"谁在" |
| Request | 如果网络中有多台 DHCP 服务器,广播"我选定了,其他服务器可以释放你的 Offer" |
2.3 为什么 Offer 和 ACK 可能是单播或广播?
| 情况 | 方式 |
|---|---|
| 客户端已有 IP(续租) | 单播直接发给客户端 |
| 客户端刚开机无 IP | 广播(因为客户端还没配 IP,单播发不到) |
三、DHCP 报文格式
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
├─────────────────────────────────────────────────────────────────┤
│ OP (1B) │ HTYPE (1B) │ HLEN (1B) │ HOPS (1B) │
├─────────────────────────────────────────────────────────────────┤
│ XID (4B) │
├────────────────────┬────────────────────────────────────────────┤
│ SECS (2B) │ FLAGS (2B) │
├─────────────────────────────────────────────────────────────────┤
│ CIADDR (4B) │
│ (客户端当前 IP,没有则为 0) │
├─────────────────────────────────────────────────────────────────┤
│ YIADDR (4B) │
│ (服务器分配的 IP) │
├─────────────────────────────────────────────────────────────────┤
│ SIADDR (4B) │
│ (DHCP 服务器 IP) │
├─────────────────────────────────────────────────────────────────┤
│ GIADDR (4B) │
│ (DHCP 中继代理 IP) │
├─────────────────────────────────────────────────────────────────┤
│ CHADDR (16B) │
│ (客户端 MAC 地址) │
├─────────────────────────────────────────────────────────────────┤
│ SNAME (64B) │
│ (服务器主机名,可选) │
├─────────────────────────────────────────────────────────────────┤
│ FILE (128B) │
│ (启动文件,可选) │
├─────────────────────────────────────────────────────────────────┤
│ Options (可变) │
│ (子网掩码、网关、DNS、租期等) │
└─────────────────────────────────────────────────────────────────┘
关键字段:
| 字段 | 说明 |
|---|---|
| XID | 事务 ID,客户端用来匹配 Request/Reply |
| CIADDR | 客户端当前 IP(续租时使用) |
| YIADDR | 服务器分配给客户端的 IP |
| GIADDR | DHCP 中继代理的 IP(跨网段时使用) |
| CHADDR | 客户端 MAC 地址 |
| Options | 子网掩码、网关、DNS、租期等配置信息 |
四、DHCP 租期与续租
4.1 租期(Lease Time)
DHCP 分配的 IP 不是永久的,有一个租期(Lease)。
| 场景 | 默认租期 |
|---|---|
| 家庭路由器 | 通常 1 天(86400 秒) |
| 企业网络 | 通常 1~7 天 |
| 访客网络 | 通常 1~8 小时 |
4.2 续租过程
租期使用 50%:客户端直接续租(单播)
→ DHCP Request (单播)
→ DHCP ACK (单播)
→ 续租成功
租期使用 87.5%:如果 50% 续租失败
→ 客户端广播 DHCP Request
→ 任意 DHCP 服务器可回复
→ 续租成功
租期到期:如果仍未续租成功
→ 客户端释放 IP
→ 回到初始状态(0.0.0.0)
→ 重新走 DORA 流程
# Windows 手动续租
C:\> ipconfig /renew
五、华为设备 DHCP 服务配置
5.1 作为 DHCP 服务器
[Router] dhcp enable ← 全局开启 DHCP
[Router] ip pool vlan10 ← 创建地址池
[Router-ip-pool-vlan10] network 10.0.10.0 mask 255.255.255.0
[Router-ip-pool-vlan10] gateway-list 10.0.10.254
[Router-ip-pool-vlan10] dns-list 114.114.114.114 8.8.8.8
[Router-ip-pool-vlan10] lease day 3 ← 租期 3 天
[Router-ip-pool-vlan10] excluded-ip-address 10.0.10.1 10.0.10.10 ← 保留地址
[Router-ip-pool-vlan10] quit
# 在 VLANIF 接口上应用(全局地址池)
[Router] interface vlanif 10
[Router-Vlanif10] dhcp select global
5.2 查看 DHCP 分配情况
[Router] display ip pool name vlan10 used
Pool name : vlan10
Network : 10.0.10.0
Position : Local
Status : Unlocked
Gateway : 10.0.10.254
Lease : 3 Days 0 Hours 0 Minutes
Domain : -
DNS server0 : 114.114.114.114
DNS server1 : 8.8.8.8
IP address MAC Lease expiration Type
10.0.10.11 aa-bb-cc-dd-ee-ff Jul 30 14:00:00 2025 Auto
10.0.10.12 11-22-33-44-55-66 Jul 30 14:05:00 2025 Auto
六、常见故障
6.1 PC 获取到 169.254.x.x(APIPA)
PC 开机 → DHCP Discover 发出 → 没有 DHCP 服务器回复
→ 等待超时 → 自动配置为 169.254.x.x
原因:
- DHCP 服务没有运行
- DHCP 地址池已耗尽
- DHCP 中继没有配置(跨网段)
- 交换机端口开启了 DHCP Snooping 但未配置信任口
6.2 获取的 IP 不对应预期的网段
原因:
- 地址池配错了网段
- 接口应用了错误的地址池
- 有多个 DHCP 服务器冲突
6.3 IP 冲突
DHCP 显示分配了某 IP,但 ping 该 IP 发现有应答
→ 原因:该 IP 被某台设备静态配置了
→ 解决:排除该 IP(excluded-ip-address)
七、思考
- DHCP 的 DORA 四步分别是什么?哪两步是广播?
- 为什么 DHCP Discover 必须是广播而不是单播?
- DHCP 租期设为 1 天,PC 在 12 小时后做了什么操作?
- 如果 DHCP 服务器回复了 Offer,但客户端没有发 Request,会怎样?
- PC 获取到 169.254.x.x 的 IP 说明了什么问题?怎么排查?
- 华为路由器上 DHCP 地址池中
excluded-ip-address的作用是什么?
下篇预告:第47篇《DHCP中继_跨网段分配IP地址》——学习DHCP中继的配置,实现跨网段IP地址分配。