第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)

七、思考

  1. DHCP 的 DORA 四步分别是什么?哪两步是广播?
  2. 为什么 DHCP Discover 必须是广播而不是单播?
  3. DHCP 租期设为 1 天,PC 在 12 小时后做了什么操作?
  4. 如果 DHCP 服务器回复了 Offer,但客户端没有发 Request,会怎样?
  5. PC 获取到 169.254.x.x 的 IP 说明了什么问题?怎么排查?
  6. 华为路由器上 DHCP 地址池中 excluded-ip-address 的作用是什么?

下篇预告:第47篇《DHCP中继_跨网段分配IP地址》——学习DHCP中继的配置,实现跨网段IP地址分配。