网络协议之DHCP

概述

DHCP(Dynamic Host Configuration Protocol,动态主机配置协议) 是一种用于自动分配IP地址及其他网络配置参数的网络协议,它是现代 TCP/IP 网络不可或缺的协议。它大大简化了网络管理,特别是在大型网络环境中,避免了手动为每台设备配置IP地址的繁琐工作,极大提升了网络部署与管理的效率。

📦 小贴士:在家庭网络中,你的无线路由器通常就内置了一个 DHCP 服务器,负责为手机、电脑等设备分配 IP 地址。

DHCP 的作用

DHCP 主要用于自动为客户端设备分配以下网络参数:

  • IP 地址(IPv4 或 IPv6)
  • 子网掩码(Subnet Mask)
  • 默认网关(Default Gateway)
  • DNS 服务器地址
  • 其他可选参数(如 NTP 服务器、WINS 服务器、域名、租期等)

DHCP 的工作原理(以 IPv4 为例)

DHCP 使用 客户端-服务器(C/S)模型,通信基于 UDP 协议

  • 客户端 → 服务器:使用 UDP 端口 68
  • 服务器 → 客户端:使用 UDP 端口 67

DHCP 的四个阶段(DORA 过程)

sequenceDiagram
    participant Client
    participant Server

    Client->>Server: DHCPDISCOVER (广播)
    Server-->>Client: DHCPOFFER (含IP建议)
    Client->>Server: DHCPREQUEST (广播,确认)
    Server-->>Client: DHCPACK (确认分配)

    Note over Client,Server: 客户端配置IP并开始通信
客户端 (Client)                     DHCP 服务器 (Server)
      |                                     |
      |---------- DHCPDISCOVER ------------>|   (1) Discover
      |        (广播, src:0.0.0.0)          |
      |                                     |
      |<--------- DHCPOFFER ----------------|   (2) Offer
      |        (单播/广播, 含IP建议)        |
      |                                     |
      |---------- DHCPREQUEST ------------->|   (3) Request
      |        (广播, 确认接受某Offer)      |
      |                                     |
      |<--------- DHCPACK ------------------|   (4) Acknowledge
      |        (确认IP分配,含配置参数)     |
      |                                     |
      +-------------------------------------+
                客户端开始使用IP通信
  1. Discover(发现)

    • 客户端启动后,不知道自己的 IP 地址,也不知道 DHCP 服务器的位置。
    • 它广播一个 DHCPDISCOVER 报文(源 IP 为 0.0.0.0,目标 IP 为 255.255.255.255)。
    • 此报文包含客户端的 MAC 地址。
  2. Offer(提供)

    • 网络中的一个或多个 DHCP 服务器收到 Discover 报文后,各自从地址池中选择一个可用的 IP 地址。
    • 每个服务器向客户端单播或广播一个 DHCPOFFER 报文,包含:
      • 提供的 IP 地址
      • 子网掩码
      • 租期(Lease Time)
      • 服务器标识等
  3. Request(请求)

    • 客户端通常选择第一个收到的 Offer(也可根据策略选择)。
    • 客户端广播一个 DHCPREQUEST 报文,声明它接受了某个服务器的 Offer。
    • 此广播也让其他 DHCP 服务器知道该客户端已做出选择,它们会收回之前提供的 IP。
  4. Acknowledge(确认)

    • 被选中的 DHCP 服务器收到 Request 后,发送 DHCPACK 报文,正式确认分配。
    • 客户端收到 ACK 后,即可使用该 IP 地址进行通信。
    • 如果服务器无法分配(如地址冲突),则发送 DHCPNAK(否定应答)。

⚠️ 注意:上述过程中的“广播”在某些网络环境下(如跨子网)可能无法到达服务器,此时需使用 DHCP 中继代理(Relay Agent)

IP 地址租期与续租

DHCP 分配的 IP 地址是 临时的,具有 租期(Lease Time)

  • 租期过半时(T1):客户端尝试向原 DHCP 服务器 单播续租(发送 DHCPREQUEST)。
  • 租期达 87.5% 时(T2):若 T1 续租失败,客户端 广播 DHCPREQUEST,尝试从任何可用 DHCP 服务器续租。
  • 租期到期:若仍未续租成功,客户端必须停止使用该 IP,并重新发起 Discover 流程。

租期续租流程(简化)

客户端                          DHCP 服务器
  |                                 |
  |---(T1: 租期50%) DHCPREQUEST --->|  (单播续租)
  |<---------- DHCPACK -------------|
  |                                 |
  |---(T2: 租期87.5%) DHCPREQUEST ->|  (广播续租,若T1失败)
  |<---------- DHCPACK -------------|
  |                                 |

✅ 若续租成功 → 继续使用 IP
❌ 若续租失败且租期到期 → 释放 IP,重新发起 Discover

DHCP 的部署方式

  1. 本地 DHCP 服务器

    • 通常部署在路由器、专用服务器(如 Windows Server、Linux 上的 isc-dhcp-server)。
    • 适用于单一子网。
  2. DHCP 中继代理(Relay Agent)

    • 当客户端与 DHCP 服务器不在同一子网时,需要中继代理(通常由三层交换机或路由器充当)。
    • 中继代理将客户端的广播请求转换为单播,转发给远程 DHCP 服务器。
    • 使用 Option 82 可携带客户端所在子网信息,帮助服务器正确分配地址。

跨子网场景(含 DHCP 中继代理)

客户端        路由器/交换机        DHCP 服务器
  |               |                    |
  |---Discover--->| (广播)             |
  |               |---Relay转发------->| (单播,带Option 82)
  |               |<--Offer------------|
  |<--Offer-------|                    |
  |---Request---->|                    |
  |               |---Relay转发------->|
  |               |<--ACK--------------|
  |<--ACK---------|                    |

中继代理(Relay Agent)将广播转为单播,并插入 Option 82(含客户端所在子网信息)

DHCP 与 IPv6

IPv6 中也支持 DHCP,称为 DHCPv6,但 IPv6 还支持 无状态地址自动配置(SLAAC),因此 DHCPv6 并非必需。

  • 有状态 DHCPv6:分配完整 IP 地址和其他参数。
  • 无状态 DHCPv6:仅提供 DNS 等额外信息,IP 由 SLAAC 生成。

常用工具及命令(以 Windows 和 Linux 为例)

Windows

ipconfig /release    # 释放当前 IP
ipconfig /renew      # 重新获取 IP
ipconfig /all        # 查看 DHCP 服务器、租期等信息

Linux

使用 dhclient(常用的dhcp客户端):

sudo dhclient -r eth0   # 释放 eth0 的 IP
sudo dhclient eth0      # 重新获取 IP
cat /var/lib/dhcp/dhclient.leases  # 查看租约信息

使用udhcpc(嵌入式常用的轻量dhcp客户端):

udhcpc -i wlan0