← 懂一点

第13天:DHCP协议详解

2026-09-11

今日目标


1. 什么是DHCP?

1.1 DHCP的定义

DHCP(Dynamic Host Configuration Protocol,动态主机配置协议) 是一种网络管理协议,用于自动分配IP地址和网络配置。

生活类比:

1.2 为什么需要DHCP?

没有DHCP的痛苦:

场景1:公司有100台电脑
❌ 手动配置每台电脑的IP地址
❌ 记录哪些IP已被使用
❌ 避免IP地址冲突
❌ 新员工入职需要IT手动配置
❌ 员工离职需要手动回收IP

时间成本:每台约10分钟 × 100台 = 1000分钟

使用DHCP的好处:

场景2:配置DHCP服务器
✅ 电脑开机自动获取IP
✅ 无需人工干预
✅ 自动避免IP冲突
✅ 新设备即插即用
✅ 离线设备自动回收IP

时间成本:配置一次DHCP服务器 ≈ 30分钟

1.3 DHCP能配置什么?

DHCP不仅分配IP地址,还会配置:

1. IP地址           192.168.1.100
2. 子网掩码         255.255.255.0
3. 默认网关         192.168.1.1
4. DNS服务器        8.8.8.8, 114.114.114.114
5. 租约时间         24小时
6. WINS服务器       (可选)
7. 域名             example.com
8. NTP时间服务器    (可选)

2. DHCP工作原理

2.1 DHCP四次握手(DORA过程)

DHCP获取IP地址需要四个步骤,称为DORA过程:

  1. Discover - 发现服务器
  2. Offer - 提供地址
  3. Request - 请求地址
  4. Ack - 确认分配

完整流程图:

客户端                                    DHCP服务器
  |                                           |
  |  1. DHCP Discover (广播)                 |
  |  "有DHCP服务器吗?我需要IP地址"           |
  |------------------------------------------>|
  |     源IP: 0.0.0.0                         |
  |     目标IP: 255.255.255.255               |
  |                                           |
  |                                           | 检查可用IP
  |                                           | 找到: 192.168.1.100
  |                                           |
  |  2. DHCP Offer (单播/广播)                |
  |  "我这里有个IP:192.168.1.100"            |
  |<------------------------------------------|
  |     源IP: 192.168.1.1                     |
  |     提供IP: 192.168.1.100                 |
  |                                           |
  | 决定接受这个IP                             |
  |                                           |
  |  3. DHCP Request (广播)                   |
  |  "我要192.168.1.100这个IP"                |
  |------------------------------------------>|
  |     请求IP: 192.168.1.100                 |
  |                                           |
  |                                           | 确认IP可用
  |                                           | 标记为已分配
  |                                           |
  |  4. DHCP Ack (单播)                       |
  |  "好的,192.168.1.100归你了,租期24小时"   |
  |<------------------------------------------|
  |     确认IP: 192.168.1.100                 |
  |     租期: 86400秒                          |
  |                                           |
  | ✅ 配置IP地址                              |
  | ✅ 可以上网了                              |
  |                                           |

2.2 详细步骤解析

步骤1:DHCP Discover(发现)

客户端刚开机,还没有IP地址

广播消息:
┌────────────────────────────────┐
│ 源MAC:  aa:bb:cc:dd:ee:ff    │
│ 目标MAC:ff:ff:ff:ff:ff:ff    │ (广播)
│ 源IP:   0.0.0.0               │ (还没有IP)
│ 目标IP: 255.255.255.255       │ (广播)
│ 消息:   我需要IP地址!         │
│ 事务ID: 0x12345678            │ (用于匹配响应)
└────────────────────────────────┘

特点:
- 使用广播,因为不知道DHCP服务器在哪
- 源IP是0.0.0.0,因为还没有IP地址
- 包含客户端的MAC地址(用于识别)

步骤2:DHCP Offer(提供)

服务器收到Discover后,从地址池中选择一个可用IP

单播/广播响应:
┌────────────────────────────────┐
│ 源IP:   192.168.1.1 (DHCP服务器) │
│ 目标IP: 192.168.1.100 或 广播   │
│ 提供IP: 192.168.1.100          │
│ 子网掩码:255.255.255.0         │
│ 默认网关:192.168.1.1           │
│ DNS:    8.8.8.8                │
│ 租期:   86400秒 (24小时)       │
│ 事务ID: 0x12345678 (匹配请求)  │
└────────────────────────────────┘

特点:
- 可能有多个DHCP服务器响应
- 提供IP但还没有分配
- 客户端可以选择接受哪个offer

步骤3:DHCP Request(请求)

客户端选择一个offer,正式请求该IP

广播消息:
┌────────────────────────────────┐
│ 源IP:   0.0.0.0               │ (仍然没有IP)
│ 目标IP: 255.255.255.255       │ (广播)
│ 请求IP: 192.168.1.100         │
│ 服务器: 192.168.1.1           │
│ 消息:   我要这个IP!           │
│ 事务ID: 0x12345678            │
└────────────────────────────────┘

为什么广播?
- 告诉所有DHCP服务器:"我选择了192.168.1.1的offer"
- 其他服务器可以回收它们提供的IP

步骤4:DHCP Ack(确认)

服务器确认分配,客户端可以使用IP了

单播响应:
┌────────────────────────────────┐
│ 源IP:   192.168.1.1           │
│ 目标IP: 192.168.1.100         │
│ 确认IP: 192.168.1.100         │
│ 租期:   86400秒               │
│ 开始时间:2024-01-15 10:00:00  │
│ 更新时间:2024-01-15 22:00:00  │ (50%租期)
│ 重绑时间:2024-01-16 04:30:00  │ (87.5%租期)
│ 消息:   分配成功!             │
└────────────────────────────────┘

客户端收到Ack后:
✅ 配置IP地址:192.168.1.100
✅ 配置子网掩码:255.255.255.0
✅ 配置默认网关:192.168.1.1
✅ 配置DNS服务器:8.8.8.8
✅ 启动租约计时器

2.3 特殊情况

情况1:服务器拒绝(DHCP Nak)

原因:
- 请求的IP已被其他设备占用
- IP地址不在分配范围内
- 租约已过期且IP被重新分配

流程:
客户端 → DHCP Request
服务器 → DHCP Nak (拒绝)
客户端 → 重新开始,发送 DHCP Discover

情况2:租约续期

时间线(假设租期24小时):

t=0h        获得IP地址
t=12h (50%) 尝试续期(直接向原服务器请求)
t=21h (87.5%) 如果续期失败,广播续期请求
t=24h       租约到期,释放IP,重新DORA

续期过程(简化的DORA):
客户端 → DHCP Request (续期请求)
服务器 → DHCP Ack (同意续期) 或 Nak (拒绝,重新DORA)

情况3:客户端重启

场景:客户端记得上次使用的IP

快速重连:
客户端 → DHCP Request (直接请求上次的IP)
        源IP: 0.0.0.0
        请求IP: 192.168.1.100 (上次的)

服务器 → DHCP Ack (如果IP仍然可用)
     或 DHCP Nak (IP已被占用,重新DORA)

优点:
- 跳过Discover和Offer
- 更快获得网络连接
- 减少网络流量

3. DHCP报文格式

3.1 DHCP报文结构

DHCP基于BOOTP协议,使用UDP传输:

UDP端口:
- 客户端端口:68
- 服务器端口:67

报文格式(最小236字节):
┌─────────────────────────────────────┐
│ Op (1字节)         操作码            │ 1=请求, 2=响应
│ HType (1字节)      硬件类型          │ 1=以太网
│ HLen (1字节)       硬件地址长度      │ 6=MAC地址
│ Hops (1字节)       跳数              │ 中继计数
├─────────────────────────────────────┤
│ Transaction ID (4字节) 事务ID        │ 随机数,匹配请求和响应
├─────────────────────────────────────┤
│ Seconds (2字节)    开机秒数          │ 客户端开机后的秒数
│ Flags (2字节)      标志位            │ 广播标志等
├─────────────────────────────────────┤
│ Client IP (4字节)  客户端IP          │ 续期时使用
│ Your IP (4字节)    你的IP            │ 服务器分配的IP
│ Server IP (4字节)  服务器IP          │ DHCP服务器地址
│ Gateway IP (4字节) 网关IP            │ 中继代理地址
├─────────────────────────────────────┤
│ Client MAC (16字节) 客户端硬件地址   │ 前6字节是MAC
├─────────────────────────────────────┤
│ Server Name (64字节) 服务器名称      │ 可选
│ Boot File (128字节)  启动文件名      │ 可选
├─────────────────────────────────────┤
│ Magic Cookie (4字节) 魔术字          │ 0x63825363
├─────────────────────────────────────┤
│ Options (可变)     选项字段          │ DHCP消息类型、参数等
└─────────────────────────────────────┘

3.2 重要选项(Options)

DHCP的核心功能在Options字段:

格式:[选项代码][长度][数据]

常用选项:

Option 53 (DHCP消息类型) - 1字节
├── 1: DHCP Discover
├── 2: DHCP Offer
├── 3: DHCP Request
├── 4: DHCP Decline (拒绝)
├── 5: DHCP Ack
├── 6: DHCP Nak (否认)
├── 7: DHCP Release (释放)
└── 8: DHCP Inform (通知)

Option 1 (子网掩码) - 4字节
└── 255.255.255.0

Option 3 (默认网关) - 4字节×n
└── 192.168.1.1

Option 6 (DNS服务器) - 4字节×n
├── 8.8.8.8
└── 8.8.4.4

Option 51 (租约时间) - 4字节
└── 86400 (秒)

Option 54 (DHCP服务器标识) - 4字节
└── 192.168.1.1

Option 58 (T1续约时间) - 4字节
└── 43200 (50%租期)

Option 59 (T2重绑时间) - 4字节
└── 75600 (87.5%租期)

Option 255 (结束标记)
└── 选项结束

3.3 报文示例

DHCP Discover报文:

┌─────────────────────────────────────┐
│ Op: 1 (请求)                         │
│ HType: 1 (以太网)                    │
│ HLen: 6                              │
│ Hops: 0                              │
│ Transaction ID: 0x3d1d6b                │
│ Seconds: 0                           │
│ Flags: 0x0000                        │
│ Client IP: 0.0.0.0                   │
│ Your IP: 0.0.0.0                     │
│ Server IP: 0.0.0.0                   │
│ Gateway IP: 0.0.0.0                  │
│ Client MAC: aa:bb:cc:dd:ee:ff        │
│ Magic Cookie: 0x63825363             │
│ Options:                             │
│   - Option 53: 1 (Discover)          │
│   - Option 55: 请求参数列表           │
│     (1,3,6,15,51,54,58,59)          │
│   - Option 255: End                  │
└─────────────────────────────────────┘

4. IP地址租约管理

4.1 租约生命周期

租约状态机:

    [无IP]
      ↓
   DHCP DORA
      ↓
   [已绑定] ←──────┐
      ↓ (50%租期)  │
   [续约中] ────────┘ (续约成功)
      ↓ (失败)
   [重绑中] ←──────┐
      ↓ (87.5%租期)│
   [广播续约] ──────┘ (续约成功)
      ↓ (失败)
   [租约过期]
      ↓
    释放IP
      ↓
   重新DORA

4.2 租约时间计算

示例:租期24小时

时间点计算:

租约开始:2024-01-15 10:00:00
租约时长:86400秒 (24小时)

┌──────────────────────────────────────────┐
│ 0%        50%       87.5%       100%      │
│ │          │          │           │       │
│ ├──────────┼──────────┼───────────┤       │
│ │          │          │           │       │
│ 10:00    22:00    04:30       10:00      │
│ 开始      T1续约    T2重绑      过期      │
└──────────────────────────────────────────┘

T1 (Renewing Time):
= 开始时间 + 租期 × 50%
= 10:00 + 12小时
= 22:00

T2 (Rebinding Time):
= 开始时间 + 租期 × 87.5%
= 10:00 + 21小时
= 04:30 (次日)

到期时间:
= 开始时间 + 租期
= 10:00 + 24小时
= 10:00 (次日)

4.3 租约管理策略

服务器端地址池管理:

地址池配置:
├── 网络:192.168.1.0/24
├── 可用范围:192.168.1.100 - 192.168.1.200
├── 保留地址:
│   ├── 192.168.1.1 (网关)
│   ├── 192.168.1.2 (DNS)
│   └── 192.168.1.10-50 (静态IP)
└── DHCP池:192.168.1.100-200 (101个地址)

分配策略:
1. 优先分配客户端上次使用的IP
2. 选择租约最早到期的IP
3. 避免刚释放的IP(等待2分钟)
4. 记录每个IP的租约信息

客户端租约状态:

租约数据库(示例):

MAC地址            IP地址         租约开始            租约结束            状态
aa:bb:cc:dd:ee:ff  192.168.1.100  2024-01-15 10:00   2024-01-16 10:00   已分配
11:22:33:44:55:66  192.168.1.101  2024-01-15 08:30   2024-01-16 08:30   已分配
aa:aa:aa:aa:aa:aa  192.168.1.102  2024-01-14 20:00   2024-01-15 20:00   已过期

5. DHCP中继代理

5.1 为什么需要中继?

问题:DHCP使用广播,但广播不能跨越路由器

场景:公司有多个子网

[子网1: 192.168.1.0/24]
     ↓
  [路由器] ← 广播在这里被阻挡
     ↓
[子网2: 192.168.2.0/24]  ← DHCP服务器在这里
     ↓
[子网3: 192.168.3.0/24]

问题:
- 子网1和子网3的客户端无法联系到子网2的DHCP服务器
- 需要每个子网都部署DHCP服务器?❌ 太麻烦

解决方案:DHCP Relay(中继代理)

[子网1客户端]
     ↓ 广播 DHCP Discover
[路由器/中继代理]
     ↓ 单播转发到DHCP服务器
[子网2 DHCP服务器]
     ↓ 单播响应到中继代理
[路由器/中继代理]
     ↓ 转发给客户端
[子网1客户端] ✅ 获得IP

5.2 中继工作流程

1. 客户端广播 Discover:
   源IP: 0.0.0.0
   目标IP: 255.255.255.255 (广播)

2. 中继代理收到,修改报文:
   源IP: 192.168.1.1 (中继代理地址)
   目标IP: 192.168.2.100 (DHCP服务器,单播)
   Gateway IP: 192.168.1.1 (填入中继地址)
   Hops: 增加1

3. DHCP服务器处理:
   - 看到Gateway IP,知道客户端在子网1
   - 从子网1的地址池分配IP
   - 单播响应给中继代理

4. 中继代理转发:
   - 将响应转发给客户端(广播或单播)

6. 实战项目:DHCP分析工具

6.1 项目功能

我们将实现:

  1. DHCP报文构建器
  2. DHCP报文解析器
  3. 模拟DHCP客户端
  4. 地址租约信息查看

6.2 工具演示

# 查看本机DHCP租约信息
python day13_dhcp_tool.py --show-lease

# 解析DHCP报文(从pcap文件)
python day13_dhcp_tool.py --parse capture.pcap

# 模拟DHCP Discover
python day13_dhcp_tool.py --discover

# 释放当前IP
python day13_dhcp_tool.py --release

7. 知识拓展

7.1 查看DHCP信息的命令

Windows:

# 查看DHCP租约信息
ipconfig /all

输出示例:
以太网适配器 以太网:
   DHCP 已启用: 是
   IPv4 地址: 192.168.1.100
   子网掩码: 255.255.255.0
   默认网关: 192.168.1.1
   DHCP 服务器: 192.168.1.1
   获得租约的时间: 2024年1月15日 10:00:00
   租约过期的时间: 2024年1月16日 10:00:00
   DNS 服务器: 8.8.8.8

# 释放IP地址
ipconfig /release

# 重新获取IP
ipconfig /renew

Linux:

# 查看网卡配置
ip addr show
ifconfig

# 查看DHCP租约(不同发行版路径不同)
cat /var/lib/dhcp/dhclient.leases       # Debian/Ubuntu
cat /var/lib/dhclient/dhclient.leases   # CentOS/RHEL

# 释放和重新获取(使用dhclient)
sudo dhclient -r eth0  # 释放
sudo dhclient eth0     # 重新获取

# 查看DHCP客户端日志
journalctl -u NetworkManager | grep -i dhcp

Mac:

# 查看网络配置
ifconfig

# 释放DHCP租约
sudo ipconfig set en0 DHCP

# 查看DHCP详细信息
ipconfig getpacket en0

7.2 DHCP安全问题

1. DHCP欺骗攻击:

攻击场景:
┌──────────────────────────────────────┐
│ 1. 攻击者部署假DHCP服务器             │
│ 2. 客户端发送 Discover                │
│ 3. 假服务器快速响应 Offer              │
│    - 分配正常IP                       │
│    - 但网关指向攻击者                  │
│    - DNS指向攻击者                     │
│ 4. 客户端流量被劫持                   │
└──────────────────────────────────────┘

防护措施:
- DHCP Snooping(交换机特性)
- 端口安全(只允许特定端口接收DHCP响应)
- 802.1X认证

2. DHCP饿死攻击:

攻击原理:
1. 攻击者伪造大量不同MAC地址
2. 快速请求IP地址
3. 耗尽DHCP地址池
4. 正常用户无法获得IP

防护:
- 限制端口的MAC地址数量
- DHCP地址池足够大
- 启用端口安全

3. 非法DHCP服务器:

场景:
- 员工私自接入路由器(启用DHCP)
- 导致网络混乱

检测方法:
- 监控网络中的DHCP响应
- 使用DHCP Snooping
- 定期扫描DHCP服务器

7.3 DHCP vs 静态IP

对比表:

特性 DHCP(动态) 静态IP
配置方式 自动获取 手动配置
易用性 ✅ 简单,即插即用 ❌ 需要手动配置
管理成本 ✅ 低,集中管理 ❌ 高,逐台配置
IP冲突 ✅ 自动避免 ❌ 可能冲突
稳定性 ⚠️ 依赖DHCP服务器 ✅ 不依赖服务器
IP固定 ❌ 可能变化 ✅ 永久不变
适用场景 普通客户端、移动设备 服务器、网络设备

推荐策略:

使用静态IP:
- 服务器(Web、DNS、DHCP等)
- 网络设备(路由器、交换机)
- 打印机、网络摄像头
- 需要端口映射的设备

使用DHCP:
- 普通办公电脑
- 笔记本电脑
- 移动设备(手机、平板)
- 访客设备

混合方案:
- DHCP + 保留地址(根据MAC分配固定IP)
  优点:既自动配置,又IP固定

8. 今日练习

练习1:查看本机DHCP信息

在你的电脑上查看:

1. 当前IP地址
2. DHCP服务器地址
3. 租约开始时间
4. 租约结束时间
5. DNS服务器地址
6. 默认网关地址

练习2:释放和重新获取IP

步骤:
1. 记录当前IP地址
2. 释放IP地址(ipconfig /release)
3. 观察网络状态(无法上网)
4. 重新获取IP(ipconfig /renew)
5. 对比前后IP是否相同
6. 分析为什么相同/不同

练习3:计算租约时间

已知:
- 租约开始:2024-01-15 14:00:00
- 租约时长:48小时

计算:
1. T1(续约时间)
2. T2(重绑时间)
3. 租约到期时间
4. 从开始到T1的间隔(秒)

练习4:DHCP抓包分析

使用Wireshark抓包:
1. 释放当前IP
2. 启动Wireshark,过滤 "dhcp"
3. 重新获取IP
4. 观察DORA四个报文
5. 分析每个报文的内容

9. 常见问题

Q1:为什么DHCP Request要广播而不是单播?

A:两个原因:

  1. 告诉所有DHCP服务器"我选择了哪个offer",其他服务器可以回收IP
  2. 此时客户端还没有正式的IP,使用单播可能有问题

Q2:如果有多个DHCP服务器,会发生什么?

A:

Q3:DHCP能跨网段工作吗?

A:

Q4:租约到期后没有续约会怎样?

A:

Q5:为什么有时候IP地址会变化?

A:可能原因:


10. 总结

今天我们学习了:

核心知识点

  1. DHCP基础:

    • 动态主机配置协议
    • 自动分配IP和网络参数
    • 简化网络管理
  2. DORA过程:

    • Discover:寻找DHCP服务器
    • Offer:服务器提供IP
    • Request:客户端请求IP
    • Ack:服务器确认分配
  3. 租约管理:

    • 租约生命周期
    • T1续约(50%)、T2重绑(87.5%)
    • 租约到期处理
  4. DHCP报文:

    • 基于BOOTP协议
    • UDP端口67/68
    • 丰富的Options字段
  5. 高级特性:

    • DHCP中继(跨网段)
    • 安全问题(欺骗、饿死攻击)
    • 地址保留

重点回顾

DHCP = 自动网络配置
过程 = DORA(4次握手)
管理 = 租约机制
安全 = DHCP Snooping

好处:
✅ 自动化配置
✅ 避免IP冲突
✅ 集中管理
✅ 提高效率

明天预告

第14天:第二周总结与实战

内容预览:


继续加油!🚀

今天我们深入学习了DHCP协议,理解了网络设备如何自动获取IP地址和配置。DHCP极大地简化了网络管理,是现代网络不可或缺的基础服务。掌握DHCP不仅能帮你理解网络自动化配置,还能在排查网络问题时快速定位。