2. 协议摘要 (Protocol Summary)
从客户端的角度来看, DHCP是BOOTP机制的扩展。这种行为允许现有的BOOTP客户端与DHCP服务器互操作, 而无需对客户端的初始化软件进行任何更改。RFC 1542 [2] 详细说明了BOOTP和DHCP客户端与服务器之间的交互 [9]。第3节和第4节描述了一些优化DHCP客户端和服务器之间交互的新的可选事务。
图1给出了DHCP消息的格式, 表1描述了DHCP消息中的每个字段。括号中的数字表示每个字段的大小 (以八位字节为单位)。图中给出的字段名称将在本文档中用于指代DHCP消息中的字段。
DHCP与BOOTP之间有两个主要区别。首先, DHCP定义了通过这些机制可以为客户端分配有限租期的网络地址, 允许将网络地址串行重新分配给不同的客户端。其次, DHCP提供了客户端获取其运行所需的所有IP配置参数的机制。
DHCP引入了一个小的术语变化, 旨在澄清其中一个字段的含义。BOOTP中的"供应商扩展 (Vendor Extensions)" 字段在DHCP中已重命名为"选项 (Options)" 字段。同样, 在BOOTP "供应商扩展"字段内使用的标记数据项 (以前称为"供应商扩展") 现在简称为"选项"。
DHCP消息格式 (Format of a DHCP message)
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| op (1) | htype (1) | hlen (1) | hops (1) |
+---------------+---------------+---------------+---------------+
| xid (4) |
+-------------------------------+-------------------------------+
| secs (2) | flags (2) |
+-------------------------------+-------------------------------+
| ciaddr (4) |
+---------------------------------------------------------------+
| yiaddr (4) |
+---------------------------------------------------------------+
| siaddr (4) |
+---------------------------------------------------------------+
| giaddr (4) |
+---------------------------------------------------------------+
| |
| chaddr (16) |
| |
| |
+---------------------------------------------------------------+
| |
| sname (64) |
+---------------------------------------------------------------+
| |
| file (128) |
+---------------------------------------------------------------+
| |
| options (variable) |
+---------------------------------------------------------------+
图1: DHCP消息格式
DHCP定义了一个新的'客户端标识符 (Client Identifier)' 选项, 用于向DHCP服务器传递显式客户端标识符。此更改消除了BOOTP消息中'chaddr'字段的过载使用, 其中'chaddr'既用作传输BOOTP回复消息的硬件地址, 又用作客户端标识符。'客户端标识符'是一个不透明的密钥, 不由服务器解释; 例如, '客户端标识符'可能包含硬件地址 (与'chaddr'字段的内容相同), 或者它可能包含另一种类型的标识符, 例如DNS名称。DHCP客户端选择的'客户端标识符'在客户端所连接的子网内必须是该客户端唯一的。如果客户端在一条消息中使用'客户端标识符', 则必须在所有后续消息中使用相同的标识符, 以确保所有服务器正确识别客户端。
DHCP澄清了'siaddr'字段的解释, 将其作为在客户端引导过程的下一步中使用的服务器地址。如果服务器准备提供下一个引导服务 (例如, 传递操作系统可执行映像), DHCP服务器可以在'siaddr'字段中返回自己的地址。DHCP服务器始终在'服务器标识符 (Server Identifier)' 选项中返回自己的地址。
DHCP消息字段描述 (Description of fields in a DHCP message)
| 字段 | 八位字节 | 描述 |
|---|---|---|
| op | 1 | 消息操作代码 / 消息类型。 1 = BOOTREQUEST, 2 = BOOTREPLY |
| htype | 1 | 硬件地址类型, 参见"分配号码 (Assigned Numbers)" RFC中的ARP部分; 例如, '1' = 10mb以太网。 |
| hlen | 1 | 硬件地址长度 (例如, 10mb以太网为'6')。 |
| hops | 1 | 客户端设置为零, 通过中继代理引导时由中继代理可选使用。 |
| xid | 4 | 事务ID, 由客户端选择的随机数, 由客户端和服务器用于关联客户端和服务器之间的消息和响应。 |
| secs | 2 | 由客户端填充, 自客户端开始地址获取或更新过程以来经过的秒数。 |
| flags | 2 | 标志 (见图2)。 |
| ciaddr | 4 | 客户端IP地址; 仅当客户端处于BOUND, RENEW或REBINDING状态并且可以响应ARP请求时才填充。 |
| yiaddr | 4 | '你的' (客户端) IP地址。 |
| siaddr | 4 | 引导中下一步要使用的服务器的IP地址; 由服务器在DHCPOFFER, DHCPACK中返回。 |
| giaddr | 4 | 中继代理IP地址, 通过中继代理引导时使用。 |
| chaddr | 16 | 客户端硬件地址。 |
| sname | 64 | 可选服务器主机名, 以null结尾的字符串。 |
| file | 128 | 引导文件名, 以null结尾的字符串; 在DHCPDISCOVER中为"通用"名称或null, 在DHCPOFFER中为完全限定的目录路径名。 |
| options | var | 可选参数字段。有关定义选项的列表, 请参见选项文档。 |
表1: DHCP消息中字段的描述
'options'字段现在是可变长度。DHCP客户端必须准备接收'options'字段长度至少为312个八位字节的DHCP消息。此要求意味着DHCP客户端必须准备接收最多576个八位字节的消息, 这是IP主机必须准备接受的最小IP数据报大小 [3]。DHCP客户端可以通过'最大DHCP消息大小 (Maximum DHCP Message Size)' 选项协商使用更大的DHCP消息。options字段可以进一步扩展到'file'和'sname'字段中。
在客户端使用DHCP进行初始配置的情况下 (在客户端的TCP/IP软件完全配置之前), DHCP要求创造性地使用客户端的TCP/IP软件并对RFC 1122进行宽松解释。TCP/IP软件应该接受并转发到IP层在配置IP地址之前传送到客户端硬件地址的任何IP数据包; DHCP服务器和BOOTP中继代理可能无法将DHCP消息传递给在TCP/IP软件配置之前无法接受硬件单播数据报的客户端。
为了解决一些在TCP/IP软件配置之前无法接受IP单播数据报的客户端 (如前一段所述), DHCP使用'flags'字段 [21]。最左边的位定义为BROADCAST (B) 标志。本文档第4.1节讨论了此标志的语义。flags字段的其余位保留供将来使用。客户端必须将它们设置为零, 服务器和中继代理必须忽略它们。图2给出了'flags'字段的格式。
1 1 1 1 1 1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|B| MBZ |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
B: BROADCAST 标志
MBZ: 必须为零 (MUST BE ZERO) (保留供将来使用)
图2: 'flags'字段的格式
2.1 配置参数存储库 (Configuration parameters repository)
DHCP提供的第一个服务是为网络客户端提供网络参数的持久存储。DHCP持久存储的模型是DHCP服务为每个客户端存储一个键值条目, 其中键是某个唯一标识符 (例如, IP子网号和子网内的唯一标识符), 值包含客户端的配置参数。
例如, 键可能是对 (IP-subnet-number, hardware-address) (注意"硬件地址"应按硬件类型进行类型化, 以适应混合媒体桥接网络中由于位顺序问题导致的硬件地址可能重复的情况), 允许在不同子网上串行或并发重用硬件地址, 以及可能不是全局唯一的硬件地址。或者, 键可能是对 (IP-subnet-number, hostname), 允许服务器智能地为已移动到不同子网或已更改硬件地址的DHCP客户端分配参数 (可能是因为网络接口故障并被更换)。协议定义键将是 (IP-subnet-number, hardware-address), 除非客户端使用'客户端标识符'选项显式提供标识符。客户端可以查询DHCP服务以检索其配置参数。客户端到配置参数存储库的接口包括请求配置参数的协议消息和来自服务器的携带配置参数的响应。
2.2 网络地址的动态分配 (Dynamic allocation of network addresses)
DHCP提供的第二个服务是向客户端分配临时或永久网络 (IP) 地址。网络地址动态分配的基本机制很简单: 客户端请求在一段时间内使用地址。分配机制 (DHCP服务器的集合) 保证在请求的时间内不会重新分配该地址, 并尝试在客户端每次请求地址时返回相同的网络地址。在本文档中, 将网络地址分配给客户端的期间称为"租期 (Lease)" [11]。客户端可以通过后续请求延长其租期。当客户端不再需要地址时, 可以发出消息将地址释放回服务器。客户端可以通过请求无限租期来请求永久分配。即使在分配"永久"地址时, 服务器也可以选择给出冗长但非无限的租期, 以允许检测客户端已退役的事实。
在某些环境中, 由于可用地址耗尽, 有必要重新分配网络地址。在这种环境中, 分配机制将重用租期已过期的地址。服务器应使用配置信息存储库中可用的任何信息来选择要重用的地址。例如, 服务器可以选择最近分配的地址。作为一致性检查, 分配服务器应该在分配地址之前探测要重用的地址, 例如, 使用ICMP回显请求, 客户端应该探测新接收的地址, 例如, 使用ARP。