DHCP
DHCP
DHCP 用于让主机自动获取网络配置参数,使主机接入网络后可以自动得到 IP 地址、子网掩码、默认网关、DNS 服务器、地址租期等信息。
DHCP 使用客户/服务器方式。DHCP 服务器运行服务器进程,维护地址池和配置信息;主机运行 DHCP 客户进程,向服务器申请租约。
报文封装
DHCP 属于应用层协议,使用 UDP:
| 角色 | UDP 端口 |
|---|---|
| DHCP 服务器 | 67 |
| DHCP 客户 | 68 |
DHCP 报文在运输层封装成 UDP 用户数据报,在网络层封装成 IP 数据报,再按具体链路封装成帧发送。主机刚启动时还没有 IP 地址,因此初始 DHCP 报文经常使用特殊地址:
| 阶段 | 源 IP | 目的 IP | 原因 |
|---|---|---|---|
| Discover | 0.0.0.0 |
255.255.255.255 |
客户还没有地址,也不知道服务器是谁 |
| 初次 Request | 0.0.0.0 |
255.255.255.255 |
客户还未正式获得租约,需要广播说明选择 |
基本过程
DHCP 第一次获取地址时,核心过程是 Discover、Offer、Request、ACK。
| 步骤 | 报文 | 发送方 | 目的 |
|---|---|---|---|
| 1 | DHCP Discover | 客户 | 广播寻找 DHCP 服务器 |
| 2 | DHCP Offer | 服务器 | 提供可租用地址和网络配置 |
| 3 | DHCP Request | 客户 | 选择某个服务器提供的租约 |
| 4 | DHCP ACK | 服务器 | 确认租约,客户可以使用 |
Discover 由客户广播发送。报文中包含事务 ID 和客户 MAC 地址。网络中的设备都会收到广播,但只有 DHCP 服务器进程监听 UDP 67 端口并处理该报文。
Offer 由服务器发出。服务器根据客户 MAC 地址查找数据库;若有专门配置,就按该配置提供;否则从地址池中选择地址。Offer 中包含可租用 IP 地址、子网掩码、租期、默认网关、DNS 服务器等信息。服务器选择地址前,可以使用 ARP 检测该地址是否已被占用。
Request 由客户广播发送。客户可能收到多个 Offer,通常选择先到的一个。Request 广播的意义是:通知被选中的服务器“我接受你的租约”,也通知其他服务器“我没有选择你们,可以释放预留地址”。
ACK 由被选中的服务器发送。客户收到 ACK 后,才正式使用租用到的 IP 地址。使用前,客户还可以用 ARP 检测该地址是否已被占用;若发现冲突,可发送 DHCP Decline 拒绝该租约并重新申请。
租约更新与释放
DHCP 分配的是“租约”,不是永久地址。租期到期前,客户需要续租。
当租期过半时,客户通常向原 DHCP 服务器发送 DHCP Request 请求更新租期。此时客户已经有 IP 地址,因此该报文的源 IP 是客户租到的地址,目的 IP 是 DHCP 服务器地址。
服务器处理续租时有三种情况:
- 同意续租:返回 DHCP ACK,客户获得新的租期。
- 不同意续租:返回 DHCP NACK,客户必须停止使用旧地址,重新发送 Discover。
- 没有响应:客户继续等待;租期到 87.5% 时再次请求。若租期到期仍未续租成功,客户必须停止使用旧地址并重新申请。
客户也可以提前释放租约,向服务器发送 DHCP Release。释放后,服务器可以把该地址重新放回地址池。
广播与单播
DHCP 的 Offer 和 ACK 可以广播,也可以单播,取决于客户初始化阶段是否能接收单播 IP 数据报。
如果客户在 Discover 或 Request 中声明自己不能接收单播,服务器就用广播发送后续响应。若客户声明可以接收单播,并在报文中提供自己的 MAC 地址,服务器可以单播给客户;链路层封装时,目的 MAC 就写客户的 MAC 地址。
ARP 冲突检测
DHCP 与 ARP 的配合有两个位置:
- 服务器从地址池挑选地址时,可以用 ARP 确认该地址未被其他主机占用。
- 客户收到 ACK、正式使用租约前,也可以用 ARP 检测地址冲突。
若客户发现地址已被占用,应发送 DHCP Decline 拒绝该租约,并重新开始 Discover。
DHCP 中继代理
DHCP Discover 是广播报文,默认不会被路由器转发。因此,若 DHCP 服务器不在客户所在网络中,客户的 Discover 无法直接到达服务器。
DHCP 中继代理通常配置在连接客户网络的路由器上。它收到客户广播的 Discover 后,把该请求单播转发给指定 DHCP 服务器;服务器的响应再经中继代理返回客户网络。这样不必在每个子网都部署一台 DHCP 服务器。