动态主机配置协议 (DHCPv4)介绍,详细DHCP协议学习笔记

定义

动态主机配置协议 (DHCP) 是一种用于集中对用户 IPv4 地址进行动态管理和配置的技术。为与 IPv6 动态主机配置协议 (DHCPv6) 进行区分,本文统一将动态主机配置协议称为 DHCPv4。

DHCPv4 协议由 RFC 2131 定义,采用客户端/服务器通信模式,由 DHCPv4 客户端 (DHCP Client) 向 DHCPv4 服务器 (DHCP Server) 提出配置申请,服务器返回为客户端分配的配置信息。

地址分配机制

DHCPv4 提供两种地址分配机制,网络管理员可以根据网络需求为不同的主机选择不同的分配策略:

动态分配机制

通过 DHCPv4 为主机分配一个有使用期限(租期)的 IPv4 地址。适用于主机需要临时接入网络或空闲地址数小于网络主机总数且主机不需要永久连接网络的场景。

静态分配机制

网络管理员通过 DHCPv4 为指定的主机分配固定的 IPv4 地址。相比手工静态配置 IPv4 地址,通过 DHCPv4 方式静态分配机制避免人工配置发生错误,方便管理员统一维护管理。

目的

随着网络规模的扩大和网络复杂度的提高,网络配置变得越来越复杂,再加上计算机数量剧增且位置不固定,引发了 IPv4 地址变化频繁以及 IPv4 地址不足的问题。为了实现网络可以动态合理地分配 IPv4 地址给主机使用,动态主机配置协议 DHCPv4 应运而生。

受益

DHCPv4 的主要受益有以下两点:

降低客户端的配置和维护成本

DHCPv4 易配置部署,对于非技术用户,DHCPv4 能够将客户端与配置相关的操作降至最低,并能够降低远程部署和维护成本。

集中管理

DHCPv4 服务器可以管理多个网段的配置信息,当某个网段的配置发生变化时,管理员只需要更新 DHCPv4 服务器上的相关配置即可。

DHCPv4 典型组网

DHCPv4 组网中包括以下三种角色:

DHCPv4 客户端

发送 DHCPv4 请求报文,通过 BOOTP 或 DHCPv4 协议请求获取 IPv4 地址等网络参数的设备。例如,IP 电话、PC、手机、无盘工作站等。

DHCPv4 中继

负责转发 DHCPv4 服务器和 DHCPv4 客户端之间的 DHCPv4 报文,协助 DHCPv4 服务器向 DHCPv4 客户端动态分配网络参数的设备。

DHCPv4 服务器

负责从地址池中选择 IPv4 地址分配至 DHCPv4 客户端,还可以为 DHCPv4 客户端提供其他网络参数,如默认网关地址、DNS 服务器地址和 WINS 服务器地址。

DHCPv4 报文类型

DHCPv4 报文是基于 UDP 协议传输的。DHCPv4 客户端向 DHCPv4 服务器发送报文时采用 68 端口号,DHCPv4 服务器向 DHCPv4 客户端发送报文时采用 67 端口号。目前 DHCPv4 定义了如下八种类型的报文:

|---------------|--------------------------------------------------------|
| 报文名称 | 说明 |
| DHCP DISCOVER | DHCPv4 客户端首次登录网络时进行 DHCP 交互过程发送的第一个报文,用来寻找 DHCPv4 服务器。 |
| DHCP OFFER | DHCPv4 服务器用来响应 DHCP DISCOVER 报文,此报文携带了各种配置信息。 |
| DHCP REQUEST | 用于客户端初始化后、重启后或更新 IPv4 地址租约时发送的报文。 |
| DHCP ACK | 服务器对客户端的 DHCP REQUEST 报文的确认响应报文。 |
| DHCP NAK | 服务器对客户端的 DHCP REQUEST 报文的拒绝响应报文。 |
| DHCP DECLINE | 当客户端发现服务器分配给它的 IPv4 地址发生冲突时发送的报文。 |
| DHCP RELEASE | 客户端主动释放服务器分配给它的 IPv4 地址时发送的报文。 |
| DHCP INFORM | 客户端获取 IPv4 地址后,向服务器请求更为详细的配置信息时发送的报文。 |

DHCPv4 报文格式

DHCPv4 报文格式是在 BOOTP 报文格式的基础上发展而来,因此 DHCPv4 服务器也支持与 BOOTP 客户端之间进行交互。

DHCPv4 报文中的 Options 字段

Options 字段用来存放分配给 DHCPv4 客户端的控制信息和参数,位于 DHCPv4 报文末尾。Options 字段由 Type、Length 和 Value 三部分组成。

|-----------|----------------------|
| Options 号 | Options 作用 |
| 1 | 设置子网掩码选项。 |
| 3 | 设置网关地址选项。 |
| 6 | 设置 DNS 服务器地址选项。 |
| 12 | 设置 DHCPv4 客户端的主机名选项。 |
| 50 | 设置请求 IPv4 地址选项。 |
| 51 | 设置 IPv4 地址租约时间选项。 |
| 53 | 设置 DHCPv4 消息类型。 |
| 54 | 设置服务器标识。 |
| 55 | 设置请求选项列表。 |
| 58 | 设置续约 T1 时间。 |
| 59 | 设置续约 T2 时间。 |

DHCP 选项 82

Option 82 记录了 DHCP 客户端的位置信息,可以配置在 DHCP 中继或 DHCP 监听设备上。对于从 DHCP 客户端收到的 DHCP 报文,该报文中携带的 Option 82 将按照 Option 82 策略进行处理后再发送给 DHCP 服务器。

DHCP服务器根据DHCP报文中携带的Option82信息为客户端分配IP地址和其他参数,提供更加灵活的地址分配方案。

Option 82包含两个常用的子选项:Circuit ID和Remote ID。Circuit ID主要用于标识客户端所属的VLAN和接口,Remote ID标识客户端从哪个设备接入,一般为设备的MAC地址。

数据包格式

电路 ID 子选项

Circuit ID 包含三种类型:Type 0(值为端口索引)、Type 1(值为端口名称+VLAN ID)、Type 2(值为端口描述+VLAN ID),下面按照类型列出其格式。

  • 类型 0(端口索引)

Circuit ID 类型为 0,其中 Circuit ID 子选项使用物理接口或者 LAG 接口。

  • 类型 1(端口名称)

Circuit ID类型为1,其中端口名称和VLAN ID组成Circuit ID子选项值。

  • 类型 2(端口描述)

Circuit ID类型为1,其中端口名称和VLAN ID组成Circuit ID子选项值。

远程 ID 子选项

Remote ID包含两种类型:Type 0(值为系统MAC)和Type 1(值为主机名),下面按类型列出格式。

  • 类型 0(系统 MAC)

远程 ID 类型为 0,其中系统 MAC 用于远程 ID 子选项。

如何处理选项 82?

系统对收到的DHCP报文中的Option82进行如下处理:

  • 当收到不带 giaddr带有选项 82 的DHCP Discover/Request/Release/Decline/Inform 消息时,

    • 如果选项 82 trust-all被禁用,则丢弃该消息。

    • 如果启用了Option 82 trust-all 选项 ,则该类消息将按照用户配置的 Option 82 策略进行处理。Option 82 策略可以设置四种操作:KeepDropInsertReplace 。默认操作为Keep,即从 DHCP 客户端收到的 DHCP 消息中的 Option 82 保持不变并进行转发。

  • 当出现除上述类型以外的任何其他类型的 DHCP 发现/请求/释放/拒绝/通知消息时,将允许接收该消息,并根据选项 82 策略进行处理。

  • 当收到不带选项 82 的DHCP Offer/Ack/Nak 消息时,将转发该消息而不带选项 82。

  • 当收到带有选项 82 的DHCP Offer/Ack/Nak 消息时,选项 82 会在转发消息之前被删除。

选项 82 信任全部

交换机收到的不带 giaddr 但包含 Option 82 的 DHCP Discover/Request/Release/Decline/Inform 数据包默认会被丢弃,但如果开启了 Option 82 trust all 功能,则此类数据包会被允许并处理。

因此,在配置选项 82 策略时,需要同时考虑网络拓扑和信任配置,特别是如果客户端和中继代理/启用 DHCP 侦听的设备之间存在可能插入选项 82 的交换机。在此设备上启用 DHCP 选项 82 信任所有,以确保这些数据包不会被丢弃。

DHCPv4 客户端首次接入网络的报文交互过程

首次接入网络的 DHCPv4 客户端与 DHCPv4 服务器的报文交互过程称为 DHCPv4 报文四步交互:

第一步:发现阶段

首次接入网络的DHCPv4客户端不知道DHCPv4服务器的IPv4地址,为了学习到DHCPv4服务器的IPv4地址,DHCPv4客户端以广播方式发送DHCP DISCOVER报文(目的IPv4地址为255.255.255.255)给同一网段内的所有设备(包括DHCPv4服务器或中继)。DHCP DISCOVER报文中携带了客户端的MAC地址(chaddr字段)、需要请求的参数列表选项(Option55)、广播标志位(flags字段)等信息。

第二步:提供阶段

与DHCPv4客户端位于同一网段的DHCPv4服务器都会接收到DHCP DISCOVER报文,DHCPv4服务器选择跟接收DHCP DISCOVER报文接口的IPv4地址处于同一网段的地址池,并且从中选择一个可用的IPv4地址,然后通过DHCP OFFER报文发送给DHCPv4客户端。

通常,DHCPv4服务器的地址池中会指定IPv4地址的租期,如果DHCPv4客户端发送的DHCP DISCOVER报文中携带了期望租期,服务器会将客户端请求的期望租期与其指定的租期进行比较,选择其中时间较短的租期分配给客户端。

DHCPv4服务器在地址池中为客户端分配IPv4地址的顺序如下:

IPv4地址分配顺序不支持修改。

  1. DHCPv4服务器上已配置的与客户端MAC地址静态绑定的IPv4地址。

  2. 客户端发送的DHCP DISCOVER报文中Option50(请求IPv4地址选项)指定的地址。

  3. 地址池内查找"Expired"状态的IPv4地址,即曾经分配给客户端的超过租期的IPv4地址。

  4. 在地址池内随机查找一个"Idle"状态的IPv4地址。

  5. 如果未找到可供分配的IPv4地址,则地址池依次自动回收超过租期的("Expired"状态)和处于冲突状态("Conflict"状态)的IPv4地址。回收后如果找到可用的IPv4地址,则进行分配;否则,DHCPv4客户端等待应答超时后,重新发送DHCP DISCOVER报文来申请IPv4地址。

设备支持在地址池中排除某些不能通过DHCPv4机制进行分配的IPv4地址。例如,客户端所在网段已经手工配置了地址为192.168.1.100/24的DNS服务器,DHCPv4服务器上配置的网段为192.168.1.0/24的地址池中需要将192.168.1.100的IPv4地址排除,不能通过DHCPv4分配此地址,否则,会造成地址冲突。

为了防止分配出去的IPv4地址跟网络中其他客户端的IPv4地址冲突,DHCPv4服务器在发送DHCP OFFER报文前通过发送源地址为DHCPv4服务器IPv4地址、目的地址为预分配出去IPv4地址的ICMP ECHO REQUEST报文对分配的IPv4地址进行地址冲突探测。如果在指定的时间内没有收到应答报文,表示网络中没有客户端使用这个IPv4地址,可以分配给客户端;如果指定时间内收到应答报文,表示网络中已经存在使用此IPv4地址的客户端,则把此地址列为冲突地址,然后等待重新接收到DHCP DISCOVER报文后按照前面介绍的选择IPv4地址的优先顺序重新选择可用的IPv4地址。

此阶段DHCPv4服务器分配给客户端的IPv4地址不一定是最终确定使用的IPv4地址,因为DHCP OFFER报文发送给客户端等待16秒后如果没有收到客户端的响应,此地址就可以继续分配给其他客户端。通过下面的选择阶段和确认阶段后才能最终确定客户端可以使用的IPv4地址。

第三步:选择阶段

如果有多个DHCPv4服务器向DHCPv4客户端回应DHCP OFFER报文,则DHCPv4客户端一般只接收第一个收到的DHCP OFFER报文,然后以广播方式发送DHCP REQUEST报文,该报文中包含客户端想选择的DHCPv4服务器标识符(即Option54)和客户端IPv4地址(即Option50,填充了接收的DHCP OFFER报文中yiaddr字段的IPv4地址)。

DHCPv4客户端广播发送DHCP REQUEST报文通知所有的DHCPv4服务器,它将选择某个DHCPv4服务器提供的IPv4地址,其他DHCPv4服务器可以重新将曾经分配给客户端的IPv4地址分配给其他客户端。

设备作为DHCPv4客户端,如果网络中有多个DHCPv4服务器,DHCPv4客户端会根据收到DHCP OFFER报文的顺序对DHCPv4服务器进行轮询,在前一个DHCPv4服务器分配IPv4地址失败时,选择下一个DHCPv4服务器分配IPv4地址。

第四步:确认阶段

当DHCPv4服务器收到DHCPv4客户端发送的DHCP REQUEST报文后,DHCPv4服务器回应DHCP ACK报文,表示DHCP REQUEST报文中请求的IPv4地址(Option50填充的IPv4地址)分配给客户端使用。

DHCPv4客户端收到DHCP ACK报文,会广播发送免费ARP报文,探测本网段是否有其他终端使用服务器分配的IPv4地址,如果在指定时间内没有收到回应,表示客户端可以使用此地址。如果收到了回应,说明有其他终端使用了此地址,客户端会向服务器发送DHCP DECLINE报文,并重新向服务器请求IPv4地址,同时,服务器会将此地址列为冲突地址。当服务器没有空闲地址可分配时,再选择冲突地址进行分配,尽量减少分配出去的地址冲突。

当DHCPv4服务器收到DHCPv4客户端发送的DHCP REQUEST报文后,如果DHCPv4服务器由于某些原因(例如协商出错或者由于发送REQUEST过慢导致服务器已经把此地址分配给其他客户端)无法分配DHCP REQUEST报文中Option50填充的IPv4地址,则发送DHCP NAK报文作为应答,通知DHCPv4客户端无法分配此IPv4地址。DHCPv4客户端需要重新发送DHCP DISCOVER报文来申请新的IPv4地址。

DHCPv4客户端重用曾经使用过的地址的工作原理

DHCPv4客户端非首次接入网络时,可以重用曾经使用过的地址。DHCPv4客户端与DHCPv4服务器交互DHCPv4报文,以重新获取之前使用的IPv4地址等网络参数,该过程称为两步交互。

是否支持重用曾经使用过的IPv4地址,因不同客户端而异。下面的DHCPv4客户端以PC为例。

第一步:选择阶段

客户端广播发送包含前一次分配的IPv4地址的DHCP REQUEST报文,报文中的Option50(请求的IPv4地址选项)字段填入曾经使用过的IPv4地址。

第二步:确认阶段

DHCPv4服务器收到DHCP REQUEST报文后,根据DHCP REQUEST报文中携带的MAC地址来查找有没有相应的租约记录,如果有则返回DHCP ACK报文,通知DHCPv4客户端可以继续使用这个IPv4地址。否则,保持沉默,等待客户端重新发送DHCP DISCOVER报文请求新的IPv4地址。

DHCPv4 客户端更新租期的工作原理

DHCPv4 服务器给每个分配给客户端的 IPv4 地址定义一个使用期限(租期)。客户端在租期到期前的某个时间点更新 IPv4 地址的租期。更新租期的过程如下:

  1. 当租期达到 50%(T1)时,客户端发送 DHCP REQUEST 报文请求更新租期。

  2. 当租期达到 87.5%(T2)时,如果仍未收到应答,客户端再次发送 DHCP REQUEST 报文。

  3. 如果租期时间到时都没有收到回应,客户端停止使用此 IPv4 地址,重新发送 DHCP DISCOVER 报文请求新的 IPv4 地址。


相关推荐
IT 青年2 分钟前
计算机网络 (48)P2P应用
计算机网络
你回到了你的家10 分钟前
4 常量和C预处理器
c语言·开发语言·c++
机器视觉知识推荐、就业指导24 分钟前
Qt/C++ 基于 QGraphicsView 的绘图软件 (附源码下载链接)
开发语言·c++·qt
隼玉25 分钟前
【STM32-学习笔记-10-】BKP备份寄存器+时间戳
c语言·笔记·stm32·学习
不玩return的马可乐25 分钟前
LeeCode 1678. 设计 Goal 解析器
数据结构·c++·算法·leetcode·职场和发展
end_SJ28 分钟前
初学stm32 --- CAN
网络
深度Linux37 分钟前
C++性能优化指南:探索无锁队列设计与实现
linux·c++·性能优化·无锁队列
dog2501 小时前
TCP 重传演进:TCP RACK Timer 能替代 RTO 吗
网络·网络协议·tcp/ip
黑客老陈1 小时前
Electron的应用安全测试基础 | 安装与检测基于Electron的应用程序
开发语言·javascript·网络·安全·web安全·electron·策略模式
王旭·wangxu_a2 小时前
【例43.3】 转二进制
c语言·数据结构·c++·python·算法·蓝桥杯-算法提高·基础问题