为什么需要DHCP

在DHCP出现之前,网络管理员必须手动静态配置每一台主机的IP地址(Static IP)。这种方式带来了巨大的挑战:

  1. 管理效率极低:成百上千台设备需要逐一手工配置,工作量大且繁琐。

  2. 极易出错:手动分配容易导致IP地址重复(冲突),造成网络中断。

  3. 灵活性差:设备移动(如笔记本从办公室到会议室)需要重新配置IP。

  4. 资源浪费:为临时接入的设备预留静态IP,会造成地址池浪费。

DHCP的价值恰恰解决了这些问题:

  • “即插即用”:用户无需任何网络知识,接入网线或Wi-Fi即可上网。

  • 高效管理:管理员只需维护好DHCP服务器和地址池策略。

  • 避免冲突:服务器集中分配,确保地址唯一。

  • 地址复用:地址租期到期可回收,分配给新设备,提高地址利用率。

  • 策略统一:确保所有客户端获得一致、正确的网络参数(如正确的网关和DNS)。



DHCP服务的角色


DHCP为什么使用UDP协议

DHCP选择UDP而非TCP,是基于其工作场景、设计目标和协议特性的必然选择。

一、核心答案先知道

DHCP使用UDP,最主要的原因是:在客户端还没有IP地址的情况下,TCP这种需要建立可靠连接、面向会话的协议根本无法工作,而UDP这种无连接的协议却可以。

具体分解为以下五个关键原因:

二、五个关键原因详解

1. 初始无IP地址的困境:TCP无法启动

  • TCP的工作前提:TCP是面向连接的协议,通信双方必须拥有有效的IP地址才能建立三次握手(SYN, SYN-ACK, ACK)。

  • DHCP客户端的状态:在初始获取IP时,客户端没有IP地址(或地址无效),源IP通常是 0.0.0.0。一个源地址为 0.0.0.0 的TCP SYN包是无法建立任何有效连接的。

  • UDP的优势:UDP是无连接的,它允许客户端以 0.0.0.0 为源IP,255.255.255.255 为目标IP,直接发送一个广播包,无需事先建立任何连接

2. 必须使用广播:TCP不支持广播

  • 发现阶段的需求:客户端刚接入网络时,不知道DHCP服务器的位置,必须通过广播255.255.255.255)来寻找服务器。

  • TCP的局限:TCP协议不支持广播或多播,它只能是两台主机之间点对点的连接。

  • UDP的优势:UDP天然支持广播和多播。DHCP Discovery 和 Request 报文都通过广播发送,确保同一网段内所有服务器都能收到。

3. 简单请求-响应模型:无需复杂可靠性

  • DHCP交互本质:DHCP是一个简单的四步请求-响应模型(DORA:Discover, Offer, Request, Acknowledge)。每次交互都很短暂,属于事务型通信,而非需要长期维持的会话流。

  • TCP的“重”:TCP的序列号、确认、重传、流量控制、拥塞控制等复杂机制,对于这种“一发一收”的简单事务来说是过度的开销

  • UDP的“轻”:UDP头部只有8字节,无连接状态,发送即完事,开销极小,非常适合这种简单的交易式通信。

4. 应用层已有完备的重传机制

  • 虽然UDP本身不可靠,但DHCP在应用层实现了自己的可靠性机制

    • 客户端有超时重传计时器:如果发送Discover后没收到Offer,客户端会等待一个随机时间后重试(通常为4, 8, 16秒等指数回退)。

    • 状态机管理:DHCP客户端有完整的状态机(初始化、选择、请求、绑定等),能够处理各种异常情况。

    • 这种应用层的轻量级重传,比TCP内核级的复杂重传更适合DHCP的场景,因为DHCP的重试逻辑需要结合业务状态(如是否进入重新绑定状态)。

5. 网络引导阶段的性能与效率

  • 网络初始化阶段:设备启动时,多个服务可能同时在获取配置(如ARP、DNS等)。DHCP需要快速完成,以便上层应用能尽快开始工作。

  • TCP的三次握手延迟:TCP建立连接需要至少1.5个RTT的延迟,这对于DHCP的初始四步交互来说,会使总延迟增加50%以上

  • UDP的零握手:UDP直接发送数据,没有连接建立延迟,使得整个IP获取过程更快。

三、一个生动的类比

想象你搬到一个新的大学宿舍,想找到管理员领取钥匙和手册:

  • TCP方式:你得先知道管理员的名字和房间号(IP地址),然后打电话给他(建立连接),确认身份后再去领取。但问题是你刚来,根本不知道管理员是谁、在哪

  • UDP方式:你直接在宿舍楼里大喊一声:“谁是管理员?我需要领钥匙!”(广播)。某个管理员听到后回应你:“我是!来我这领。”(Offer)。这种方式虽然有点“吵”,但在你一无所有的情况下,是唯一可行的方法

四、技术细节:端口号的使用

DHCP对UDP端口的使用也很精妙:

  • 服务器端口UDP 67 - 服务器监听客户端发来的Discover/Request报文。

  • 客户端端口UDP 68 - 客户端监听服务器发回的Offer/ACK报文。

为什么客户端也用固定端口68,而不是随机端口?

  1. 服务器响应广播时:当服务器广播Offer/ACK时,目标地址是 255.255.255.255:68。如果客户端使用随机端口,服务器将无法知道广播到哪个端口。

  2. 一致性:所有DHCP客户端都使用68端口,服务器只需固定广播到68端口,所有客户端都能收到。


DHCP服务器给首次接入网络的客户端分配网络参数的工作原理

整个过程就像一位新员工(客户端)第一天到公司,行政部(DHCP服务器)为他办理全套入职手续。其核心流程被称为 DORA,即四个关键报文:Discover(发现)、Offer(提供)、Request(请求)、Ack(确认)


实验拓扑1

AR1上配置

sys
sysname R1

# 开启DHCP服务功能
dhcp enable

# 配置地址池
ip pool tedu
# 定义地址池IP地址
network 192.168.1.0 mask 24
# 配置网关地址
gateway-list 192.168.1.254
# DNS服务器地址
dns-list 8.8.8.8

# 配置租期
lease day 1

quit



# 配置接口地址(网关地址)
interface GigabitEthernet 0/0/0
ip address 192.168.1.254 24
dhcp select global # 基于全局的dhcp

dhcp select global 在做什么?

简单说:这行命令告诉路由器/交换机:"请在这个接口上启用DHCP服务器功能,并且使用我之前定义的全局地址池来给客户端分配IP地址。"

详细解释:

  1. 开启接口的DHCP服务器角色

    • 默认情况下,即使你配置了 dhcp enable 和 ip pool,但具体每个接口并不知道自己要不要提供DHCP服务

    • dhcp select global 就是给特定接口"授权":"你就是这个网段的DHCP服务员,客户端找你申请IP。"

  2. 绑定地址池

    • 它把接口(GigabitEthernet 0/0/0)和你创建的全局地址池(ip pool tedu关联起来

    • 路由器收到来自这个接口的DHCP请求时,就会去 tedu 地址池里取IP分配给客户端。


为什么是在接口上配置 dhcp select global呢?

dhcp select global 必须在接口上配置,而不是全局配置,这背后有着清晰的逻辑层次和网络设计哲学。

一、核心原因:网络是"接口为中心"的世界

在路由器/交换机上,网络服务总是绑定到具体的接口或VLAN,因为:

  1. 每个接口连接不同的网络

    • G0/0/0 可能连接 192.168.1.0/24(办公网)

    • G0/0/1 可能连接 192.168.2.0/24(服务器网)

    • G0/0/2 可能连接 10.1.1.0/24(管理网)

  2. DHCP服务必须知道"我在哪个网段提供服务"
    当一个DHCP请求从特定接口进来时,设备必须知道:

    • 这个接口要不要提供DHCP服务?

    • 如果提供,用哪个地址池

二、华为配置的层次化设计

华为设备的配置遵循 "全局定义,局部应用" 的架构:

# 第一层:全局能力开关(整个设备的能力)
dhcp enable
   ↓
# 第二层:全局资源定义(整个设备的资源池)
ip pool office_pool
 network 192.168.1.0 mask 24
 gateway-list 192.168.1.254

ip pool server_pool  
 network 192.168.2.0 mask 24
 gateway-list 192.168.2.254
   ↓
# 第三层:接口应用决策(每个接口独立决定)
interface GigabitEthernet 0/0/0
 ip address 192.168.1.254 24
 dhcp select global   # ← 决策点:我要用全局池
   ↓
interface GigabitEthernet 0/0/1
 ip address 192.168.2.254 24  
 dhcp select global   # ← 决策点:我也要用全局池
   ↓
interface GigabitEthernet 0/0/2
 ip address 10.1.1.254 24
 # 没有dhcp select命令 → 这个接口不提供DHCP服务!

三、为什么不能全局配置 dhcp select global

假设有个不存在的命令 dhcp select global(全局配置),想象一下:

场景:误操作灾难

# 错误的全局配置(假设存在)
dhcp select global  # 所有接口都变成DHCP服务器!

# 结果:
# 1. 连接互联网的出口接口(G0/0/3)也成了DHCP服务器
# 2. 外部网络的主机可能错误获取到内部IP
# 3. 安全灾难:整个网络边界崩溃

对比:正确设计的优势

# 正确配置:接口级控制
interface GigabitEthernet 0/0/0  # 内部办公接口
 ip address 192.168.1.254 24
 dhcp select global  # ✅ 这里提供DHCP

interface GigabitEthernet 0/0/3  # 连接互联网的接口  
 ip address 203.0.113.1 24
 # 没有dhcp select命令 → ❌ 不提供DHCP,安全!

四、实际网络场景说明

场景1:企业多VLAN网络

# 全局开启DHCP能力
dhcp enable

# 创建多个地址池
ip pool vlan10
 network 192.168.10.0 mask 24
 gateway-list 192.168.10.1

ip pool vlan20
 network 192.168.20.0 mask 24  
 gateway-list 192.168.20.1

# 为每个VLAN接口独立启用DHCP
interface Vlanif10
 ip address 192.168.10.1 24
 dhcp select global  # 只在这个VLAN提供DHCP

interface Vlanif20
 ip address 192.168.20.1 24
 dhcp select global  # 只在这个VLAN提供DHCP

interface Vlanif30  # 服务器VLAN,手动配置IP
 ip address 192.168.30.1 24
 # 不配置dhcp select → 服务器需要静态IP

Vlanif10和Vlanif20能自动找到正确的地址池,这要归功于华为DHCP服务器的智能匹配机制。

华为DHCP服务器有一个智能算法根据收到DHCP请求的接口IP地址,自动匹配对应的地址池。

工作流程分解:

客户端发送DHCP Discover(广播)
       ↓
从Vlanif10接口进入设备
       ↓
DHCP服务器查看Vlanif10的IP地址:192.168.10.1
       ↓
在已配置的全局地址池中寻找:
   1. vlan10池:network 192.168.10.0/24 ✅(匹配!)
   2. vlan20池:network 192.168.20.0/24 ❌(不匹配)
       ↓
使用vlan10地址池分配IP:192.168.10.x

现在主机就能获取到IP地址

配置验证:如何查看匹配关系?

1. 查看地址池配置

<Huawei> display ip pool
  Pool-name      : vlan10
  Position       : Local           Status           : Unlocked  
  Gateway-0      : 192.168.10.1
  Mask           : 255.255.255.0
  Network        : 192.168.10.0 

  Pool-name      : vlan20
  Position       : Local           Status           : Unlocked  
  Gateway-0      : 192.168.20.1
  Mask           : 255.255.255.0
  Network        : 192.168.20.0 

2. 查看DHCP服务器接口信息

<Huawei> display dhcp server interface
Interface           DHCP Method
Vlanif10            Global
Vlanif20            Global

# 可以进一步查看接口的详细DHCP状态
<Huawei> display dhcp server interface Vlanif10
DHCP server running on Vlanif10
 Using global address pool: 
  Pool name          : vlan10      # 显示实际使用的地址池!
  Lease              : 1 days 0 hours 0 minutes
  Domain name        : -
  DNS server0        : -

3. 查看地址池使用情况

<Huawei> display ip pool name vlan10 used
  Pool-name      : vlan10
  Network        : 192.168.10.0
  Used           : 5                 # 已分配5个IP
  Idle           : 250               # 剩余250个可用IP
  Expired        : 0
  Conflict       : 0
  Total          : 256

四、手动指定地址池的方法

虽然DHCP能自动匹配,但有些场景下需要手动指定

场景1:接口IP不在地址池网段内

# 地址池网段是10.1.1.0/24
ip pool special_pool
 network 10.1.1.0 mask 24
 gateway-list 10.1.1.254

# 但接口IP是192.168.1.1(不同网段!)
interface Vlanif10
 ip address 192.168.1.1 24
 dhcp select global

❌ 问题:自动匹配失败,因为192.168.1.1不在10.1.1.0/24网段

✅ 解决方案:在接口下绑定特定地址池

interface Vlanif10
 ip address 192.168.1.1 24
 dhcp select global
 dhcp server ip-pool special_pool  # 手动指定地址池

场景2:一个接口服务多个网段

# 有两个地址池
ip pool pool_guest
 network 192.168.10.0 mask 24
 gateway-list 192.168.10.1

ip pool pool_staff
 network 192.168.20.0 mask 24
 gateway-list 192.168.20.1

# 接口只有一个IP
interface Vlanif10
 ip address 192.168.10.1 24
 dhcp select global

默认只能自动匹配到pool_guest(因为接口IP在192.168.10.0/24)。

如果需要根据其他条件(如Option 82信息)分配不同地址池,需要配合DHCP Option 82策略路由


抓包分析

交换机上把stp服务禁用  [AR1]stp disable


地址排除操作

查看地址池


基于接口的DHCP

基于接口的DHCP(dhcp select interface)是一种简化的DHCP配置方式。在这种模式下,不需要创建全局地址池,DHCP服务器直接使用接口的IP地址和掩码来构建一个隐式的地址池,为客户端分配IP地址。

核心特点:

  1. 零地址池配置:无需预先创建 ip pool

  2. 自动继承:地址范围、网关、掩码自动从接口配置继承

  3. 即配即用:配置简单快速,适合简单场景

基础配置示例

# 1. 全局启用DHCP服务(必须)
<Huawei> system-view
[Huawei] sysname Access-Switch
[Access-Switch] dhcp enable

# 2. 直接在接口上启用基于接口的DHCP
[Access-Switch] interface GigabitEthernet 0/0/1
[Access-Switch-GigabitEthernet0/0/1] ip address 192.168.10.1 24
[Access-Switch-GigabitEthernet0/0/1] dhcp select interface  # 关键命令!

# 3. 在接口下配置其他DHCP参数(可选)
[Access-Switch-GigabitEthernet0/0/1] dhcp server dns-list 8.8.8.8 114.114.114.114
[Access-Switch-GigabitEthernet0/0/1] dhcp server lease day 1
[Access-Switch-GigabitEthernet0/0/1] dhcp server excluded-ip-address 192.168.10.100 192.168.10.110
[Access-Switch-GigabitEthernet0/0/1] quit

实际工作原理

当客户端连接到此接口并请求DHCP时:

1. 接口配置:ip address 192.168.10.1 24
   → 自动生成地址池:192.168.10.0/24
   → 网关:192.168.10.1(接口IP)
   → 可分配范围:192.168.10.2 - 192.168.10.254

2. 排除配置:dhcp server excluded-ip-address 192.168.10.100 192.168.10.110
   → 实际可分配:192.168.10.2-99, 192.168.10.111-254

3. 其他参数:从接口DHCP配置中获取(DNS、租期等)

基于接口DHCP的验证命令

# 查看接口的DHCP服务器状态
[Access-Switch] display dhcp server interface GigabitEthernet 0/0/1
DHCP server running on GigabitEthernet0/0/1
 Using interface address pool:
  Network mask          : 255.255.255.0
  Gateway               : 192.168.10.1
  DNS server0           : 8.8.8.8
  DNS server1           : 114.114.114.114
  Lease                 : 1 days 0 hours 0 minutes

# 查看接口地址池的使用情况
[Access-Switch] display ip pool interface GigabitEthernet 0/0/1
  Pool-name      : ---  # 没有名称,因为是隐式池
  Interface      : GigabitEthernet0/0/1
  Network        : 192.168.10.0
  Mask           : 255.255.255.0
  Gateway-0      : 192.168.10.1
  DNS server0    : 8.8.8.8
  DNS server1    : 114.114.114.114
  Lease          : 1 days 0 hours 0 minutes
  Used           : 5    # 已分配5个IP
  Idle           : 245  # 空闲245个IP
  Expired        : 0
  Conflict       : 0
  Total          : 253  # 总数254-1(网关)=253,再减去排除的11个=242?注意显示可能有点差异

# 查看DHCP租约信息
[Access-Switch] display dhcp server ip-in-use
IP address       Client identifier/    Lease expiration      Type
                 Hardware address
192.168.10.5     3030-3030-302e-312d-  2024-05-10 09:30:25   Auto(C)
                 Dec-00-01-00-01


实验拓扑2--DHCP中继

AR2上配置

sys
sysname R2

dhcp enable
ip pool ntd
network 192.168.10.0 mask 24
gateway-list 192.168.10.254
dns-list 8.8.8.8
exculed-ip-address 192.168.10.253    # 排除服务器静态配置的ip地址
quit

interface g0/0/0
ip address 192.168.20.20 24    # 注意这个ip地址,不是内部PC的网关地址的(不同网段)
dhcp select global

R1上配置

u t m
sys
sysname R1-ZJ
dhcp enable

int g0/0/0
ip address 192.168.20.10 24
q

int g0/0/1
ip address 192.168.10.254 24   # 这个是做网关地址的,要跟DCHP服务器分配的地址一样
dhcp select global

现在客户端是没法获取到IP地址的

AR1是DHCP中继,现在他还不知道谁是房东

AR1上还需配置

int g0/0/1


dhcp select relay    # 启用DHCP中继的功能
dhcp relay server-ip 192.168.20.20 # 指定DHCP服务器地址

现在主机还是获取不到IP地址

在R2上还得添加路由

ip route-static 192.168.10.0 24 192.168.20.10

现在主机上就可以自动获取到ip地址了


实验拓扑3

三层交换如何实现DHCP

释放自动获取的IP的命令

查看地址池信息



相关的查看命令

释放所有的IP地址


重要:本节课的实验操作文档

通过网盘分享的文件:day04
链接: https://pan.baidu.com/s/1gpbPLafZ2wnuOPPE-wLQzg?pwd=7g8x 提取码: 7g8x 
--来自百度网盘超级会员v6的分享


配置报错处理


路由器部署DHCP跟交换机部署DHCP的区别

交换机部署DHCP主要服务于内部网络,负责为同一个局域网内的设备分配IP地址。
路由器部署DHCP主要服务于网络边界,负责为直接连接的客户端小规模网络分配IP地址。


租期

租期开始 (0%)
     ↓
     ├── T1 = 50%: 单播续租尝试(向原服务器)
     │       │
     │       ├── 成功 → 重置租期
     │       └── 失败 → 继续使用,等待T2
     │
     └── T2 = 87.5%: 广播续租尝试(向任何服务器)
             │
             ├── 成功 → 重置租期
             └── 失败 → 继续使用至100%
                     └── 租期到期,释放IP,重新开始DORA过程

DHCP续租50%用单播是为了效率,87.5%用广播是为了可靠性。这种设计体现了网络协议的精妙——在最常见的情况下用最高效的方式,在异常情况下用最可靠的方式,同时在整条路径上都为用户体验和网络健康着想。

这也是为什么DHCP协议30多年来一直稳定运行的原因:它用简单的规则,解决了复杂环境下的地址分配问题。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐