02 — DHCP 深度解析
02 — DHCP 深度解析
这是 DHCP 问答专题。完整联网启动流程见 DHCP、DNS 与联网启动。
DHCP 是什么?
DHCP 是应用层协议。服务端可由路由器上的 dnsmasq/Kea 等进程、独立服务器或设备软件实现,并不限定必须是 Linux 守护进程。
在一个典型 Linux 家用网关上,服务可能绑定 LAN bridge 并使用服务端 UDP 67;客户端使用 UDP 68。接口名与绑定方式取决于系统实现。
鸡生蛋还是蛋生鸡?—— 没有 IP 怎么通信?
新手机连上 WiFi 时没有 IP,它怎么和 192.168.1.1 上的 DHCP 服务对话?
答案:二层 MAC 广播 + 终极广播 IP
手机不知道路由器的 IP,它会捏造一个特殊的网络包:
| 字段 | 值 | 含义 |
|---|---|---|
| 源 IP | 0.0.0.0 |
我是一个没有身份的人 |
| 目标 IP | 255.255.255.255 |
这个子网里所有人听着! |
| 目标 MAC | FF:FF:FF:FF:FF:FF |
全频段广播 |
内容:"谁是 DHCP 服务器?求赏赐一个 IP!"(DHCP Discover)
路由器的网卡收到广播包后,操作系统看到目标是 UDP 67 端口,就顺理成章地把它交给了后台监听的 dnsmasq 进程。
DHCP 怎么保证分配正确的网段?
核心原理:地址池选择来自服务端配置与请求上下文。 直连服务常参考入接口/本地地址;经过 relay 时主要依据 giaddr、relay option 与策略,不能概括成“完全依赖入接口”。
家用场景(单网段)
在路由器底层,dhcpd 的配置文件(如 dnsmasq.conf)写着:
# 针对 br0 接口,使用 192.168.1.100 ~ 192.168.1.200 这个地址池
interface=br0
dhcp-range=192.168.1.100,192.168.1.200,255.255.255.0,12h
当手机发出 DHCP 广播包,Linux 内核会给包打上系统级标签(Metadata):"这个包是从 br0 接口进来的"。
dhcpd 进程读到这个标签,核对自己的配置:"既然是从 br0 来的,我就从 br0 绑定的池子里挑一个 IP 给你。"
企业场景(多网段 / DHCP Relay)
假设一家公司有 10 个部门(VLAN 1 到 VLAN 10),但只有一台中央 DHCP 服务器。
问题: 广播包默认无法穿透路由器去到另一个网段。
解决方案 —— DHCP Relay(中继代理):
在每个部门的网关路由器上开启 DHCP 中继功能。当网关收到部门内的广播求救包后,做一件偷梁换柱的事:
- 把广播包包装成单播包(Unicast)
- 在 DHCP 协议的隐藏字段
giaddr(Gateway IP Address) 中填入自己的网关 IP(如10.0.5.1) - 直接发给中央 DHCP 服务器
中央服务器拆开包一看:"虽然你远在天边,但你的 giaddr 是 10.0.5.1,那我就从 10.0.5.x 的地址池里挑 IP 给你,并让网关转交给你。"
目标 MAC 每次都变吗?—— DORA 四步曲
结论:在最初的 Discover 阶段,目标 MAC 永远、严格固定为 FF:FF:FF:FF:FF:FF。
FF:FF:FF:FF:FF:FF 的物理意义
这是 Ethernet 广播地址,不代表 QoS“最高优先级”。交换机读到广播目标后:
- 在所属 VLAN 的转发范围内泛洪到除入端口外的合适端口
- 每个出端口重新发送帧,不是把同一个模拟电信号直接复制、放大
这就是为什么手机连 IP 都没有,也能被 DHCP 服务器听到——交换机帮你"大喇叭全厂广播"。
完整 DORA 四步握手
| 阶段 | 方向 | 源 MAC | 目标 MAC | 含义 |
|---|---|---|---|---|
| Discover | 手机→路由 | 手机MAC | FF:FF:FF:FF:FF:FF |
全厂广播:"谁是 DHCP?" |
| Offer | 路由→手机 | 路由MAC | 手机MAC | 精准单播:"我是,192.168.1.100 你要吗?" |
| Request | 手机→路由 | 手机MAC | FF:FF:FF:FF:FF:FF |
再次广播:"我决定要 192.168.1.100,其他人别给了!" |
| Ack | 路由→手机 | 路由MAC | 手机MAC | 精准单播:"成交,已登记。" |
注:Offer/ACK 是单播还是广播取决于客户端状态、broadcast flag、服务器与 relay 行为,表格只表示一种常见情况,不能作为固定规则。
Request 为什么要再次广播? 因为可能存在多台 DHCP 服务器同时响应。手机通过广播告知所有服务器自己的选择,没被选中的服务器就会收回它们预留的 IP。
这种在"无差别广播"与"精准单播"之间丝滑切换的机制,正是计算机网络在极度受限的启动环境中建立秩序的智慧结晶。