跳到主要内容

9. DHCP 唯一标识符 (DUID)

  1. DHCP 唯一标识符 (DUID)

    每个 DHCP 客户端和服务器都有一个 DUID. DHCP 服务器使用 DUID 来标识客户端, 以便选择配置参数, 并将 IA 与客户端相关联. DHCP 客户端使用 DUID 来标识需要被 识别的服务器所在的消息. 关于 DUID 在 DHCP 消息中的表示形式, 见 22.2 节和 22.3 节.

    客户端和服务器必须 (MUST) 将 DUID 视为不透明取值, 并且只能 (MUST) 对 DUID 进行 相等性比较. 客户端和服务器不得以 (MUST NOT) 任何其他方式解释 DUID. 客户端和 服务器不得 (MUST NOT) 将 DUID 限制于本文档定义的类型, 因为将来可能会定义额外 的 DUID 类型.

    DUID 在一个选项中携带, 因为它可能是变长的, 并且并非所有 DHCP 消息中都需要它. DUID 被设计为在所有 DHCP 客户端和服务器之间唯一, 并且对任何特定客户端或服务器 保持稳定 —— 也就是说, 客户端或服务器使用的 DUID 应当 (SHOULD) 尽可能不随时间改 变; 例如, 设备的 DUID 不应由于设备网络硬件的改变而改变.

    拥有多种类型 DUID 的动机在于: DUID 必须全局唯一, 同时又必须易于生成. 对于任何 给定设备都易于生成的那种全局唯一标识符, 可能差别很大. 此外, 某些设备可能不含有 任何持久存储. 在这类设备中保留已生成的 DUID 是不可能的, 因此 DUID 方案必须能够 容纳这类设备.

9.1. DUID 内容

DUID 由一个以网络字节序表示的两字节类型码, 加上构成实际标识符的若干字节组成. 一个 DUID 的长度不得超过 128 字节 (不含类型码). 目前定义了以下类型:

  1        基于链路层地址加时间
2 基于企业号的供应商分配唯一 ID
3 链路层地址

上述每种类型的 DUID 的变长字段格式如下图所示.

9.2. 基于链路层地址加时间的 DUID [DUID-LLT]

这种类型的 DUID 由两字节类型字段 (取值为 1)、两字节硬件类型码、四字节时间取值 组成, 后面紧跟生成 DUID 时连接到该 DHCP 设备的任一网络接口的链路层地址. 时间取 值是 DUID 生成时的时间, 以自 2000 年 1 月 1 日 (UTC) 午夜起经过的秒数, 对 2^32 取模表示. 硬件类型必须 (MUST) 是 IANA 按 RFC 826 [14] 所述分配的合法硬件类型. 时间和硬件类型均以网络字节序存储. 链路层地址以规范形式存储, 如 RFC 2464 [2] 所 述.

下图说明了 DUID-LLT 的格式:

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 1 | hardware type (16 bits) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| time (32 bits) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
. .
. link-layer address (variable length) .
. .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

网络接口的选择可以完全任意, 只要该接口为该链路类型提供了全局唯一的链路层地址, 并且相同的 DUID-LLT 应当 (SHOULD) 被用于配置连接到该设备的所有网络接口, 而不论 生成 DUID-LLT 时使用的是哪个接口的链路层地址.

使用这种类型 DUID 的客户端和服务器必须 (MUST) 将 DUID-LLT 存储在稳定存储中, 并且 即使用于生成 DUID-LLT 的网络接口被移除, 也必须 (MUST) 继续使用这个 DUID-LLT. 任何 没有稳定存储的客户端和服务器不得 (MUST NOT) 使用这种类型的 DUID.

使用此 DUID 的客户端和服务器应当 (SHOULD) 在生成 DUID 之前尽可能先配置时间, 并且 必须 (MUST) 在生成 DUID 时使用某种时间源 (例如实时时钟), 即便该时间源在生成 DUID 之前未能配置. 使用时间源使得以下情况不太可能发生: 如果网络接口从客户端移除, 而 另一个客户端随后使用同一网络接口来生成 DUID-LLT, 则两个相同的 DUID-LLT 会被生成. 即使时钟在生成 DUID 之前未配置, 两个 DUID-LLT 之间发生碰撞的可能性也极小.

该方法推荐用于所有通用计算设备, 例如台式机和笔记本电脑, 也适用于打印机、路由器 等包含某种可写非易失性存储的设备.

尽管我们尽了最大努力, 这种生成 DUID 的算法仍可能导致客户端标识符冲突. 使用此机 制生成 DUID-LLT 的 DHCP 客户端必须 (MUST) 提供一个管理接口, 用以将现有 DUID 替换 为新生成的 DUID-LLT.

9.3. 由供应商基于企业号分配的 DUID [DUID-EN]

这种形式的 DUID 由供应商分配给设备. 它由供应商注册的、由 IANA [6] 维护的私有企 业号 (Private Enterprise Number), 加上供应商分配的唯一标识符组成. 下图概括了 DUID-EN 的结构:

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 2 | enterprise-number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| enterprise-number (contd) | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
. identifier .
. (variable length) .
. .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

标识符的来源由定义它的供应商自行决定, 但每个 DUID-EN 的标识符部分必须 (MUST) 对 使用该 DUID-EN 的设备唯一, 并且必须 (MUST) 在设备制造时分配给该设备, 并存储在某 种形式的非易失性存储中. 生成的 DUID 应当 (SHOULD) 记录在不可擦除的存储中. enterprise-number 是供应商注册的、由 IANA [6] 维护的私有企业号. enterprise-number 作为一个无符号 32 位数存储.

此类 DUID 的一个示例可能如下所示:

+---+---+---+---+---+---+---+---+
| 0 | 2 | 0 | 0 | 0 | 9| 12|192|
+---+---+---+---+---+---+---+---+
|132|221| 3 | 0 | 9 | 18|
+---+---+---+---+---+---+

此示例包含类型为 2 的两字节类型、企业号 (9), 以及 8 字节的标识符数据 (0x0CC084D303000912).

9.4. 基于链路层地址的 DUID [DUID-LL]

这种类型的 DUID 由两个包含 DUID 类型 3 的字节、一个两字节网络硬件类型码, 加上 永久连接到客户端或服务器设备的任一网络接口的链路层地址组成. 例如, 一台主机如果 拥有一个实现在不太可能被移除、且不会在其他地方使用的芯片中的网络接口, 则可以使 用 DUID-LL. 硬件类型必须 (MUST) 是 IANA 分配的合法硬件类型, 如 RFC 826 [14] 所述. 硬件类型以网络字节序存储. 链路层地址以规范形式存储, 如 RFC 2464 [2] 所述. 下图 说明了 DUID-LL 的格式:

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 3 | hardware type (16 bits) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
. .
. link-layer address (variable length) .
. .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

网络接口的选择可以完全任意, 只要该接口提供唯一的链路层地址, 并且永久连接到生成 该 DUID-LL 的设备上. 相同的 DUID-LL 应当 (SHOULD) 被用于配置连接到该设备的所有网 络接口, 而不论生成该 DUID 时使用的是哪个接口的链路层地址.

DUID-LL 推荐用于拥有永久连接的、带链路层地址的网络接口, 并且没有可写非易失性 稳定存储的设备. 无法判断网络接口是否永久连接到运行该 DHCP 客户端的设备上的 DHCP 客户端或服务器, 不得 (MUST NOT) 使用 DUID-LL.