跳到主要内容

9. DHCP 唯一标识符 (DUID)

  1. DHCP 唯一标识符 (DUID)

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

客户端和服务器 MUST 将 DUID 视为不透明值 (opaque values), 并且 MUST 只比较 DUID 是否相等. 客户端和服务器 MUST NOT 以任何其他方式解释 DUID. 客户端和服务器 MUST NOT 将 DUID 限制为本文档定义的类型, 因为将来可能定义其他 DUID 类型.

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

存在多种 DUID 类型的动机是, DUID 必须全局唯一, 同时也必须易于生成. 对任何给定设备而言, 易于生成的全局唯一标识符 (globally-unique identifier) 可能差异很大. 此外, 一些设备可能不包含任何持久性存储 (persistent storage). 在这类设备中保留生成的 DUID 是不可能的, 因此 DUID 方案必须适应这类设备.

9.1. DUID 内容

DUID 由一个以网络字节序表示的两个八位字节类型代码 (type code) 组成, 后面跟随可变数量的八位字节, 这些八位字节构成实际标识符. DUID 的长度不得超过 128 个八位字节 (不包括类型代码). 当前定义了以下类型:

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

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

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

这种 DUID 由以下部分组成: 一个包含值 1 的两个八位字节类型字段, 一个两个八位字节硬件类型代码, 四个包含时间值的八位字节, 后接生成 DUID 时连接到 DHCP 设备的任一网络接口的链路层地址 (link-layer address). 时间值表示 DUID 生成时间, 以自 2000 年 1 月 1 日午夜 (UTC) 起经过的秒数表示, 按 2^32 取模. 硬件类型 MUST 是 IANA 分配的有效硬件类型, 如 RFC 826 [14] 中所述. 时间和硬件类型都以网络字节序存储. 链路层地址以规范形式 (canonical form) 存储, 如 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 存储在稳定存储 (stable storage) 中, 并且即使用于生成 DUID-LLT 的网络接口被移除, 也 MUST 继续使用此 DUID-LLT. 没有任何稳定存储的客户端和服务器 MUST NOT 使用这种 DUID.

使用这种 DUID 的客户端和服务器在生成 DUID 之前 SHOULD 尝试配置时间, 如果这可行的话, 并且在生成 DUID 时 MUST 使用某种时间源 (time source), 例如实时时钟, 即使该时间源在生成 DUID 之前无法配置. 使用时间源会降低生成两个相同 DUID-LLT 的可能性, 这种情况可能发生在网络接口从一个客户端移除后, 另一个客户端又使用同一网络接口生成 DUID-LLT 时. 即使时钟在生成 DUID 之前尚未配置, 两个 DUID-LLT 之间发生冲突 (collision) 的可能性也非常低.

这种 DUID 生成方法推荐用于所有通用计算设备, 例如台式计算机和笔记本计算机, 也推荐用于打印机, 路由器等包含某种可写非易失性存储 (non-volatile storage) 的设备.

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

9.3. 基于 Enterprise Number 的供应商分配 DUID [DUID-EN]

这种形式的 DUID 由供应商分配给设备. 它由供应商注册的 Private Enterprise Number, 即 IANA [6] 维护的编号, 后接供应商分配的唯一标识符组成. 下图概述 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 对使用它的设备唯一, 并且 MUST 在设备制造时分配给该设备, 并存储在某种非易失性存储中. 生成的 DUID SHOULD 记录在不可擦除存储 (non-erasable storage) 中. enterprise-number 是供应商注册的 Private Enterprise Number, 由 IANA [6] 维护. enterprise-number 以无符号 32 位数字存储.

这种类型的 DUID 示例可能如下所示:

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

此示例包括两个八位字节类型 2, Enterprise Number (9), 后接八个八位字节的标识符数据 (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, 在配置连接到该设备的所有网络接口时, 都 SHOULD 使用同一个 DUID-LL.

DUID-LL 推荐用于具有永久连接的网络接口及链路层地址, 且没有非易失性可写稳定存储的设备. 如果 DHCP 客户端或服务器无法判断某个网络接口是否永久连接到运行该 DHCP 客户端的设备, 则 MUST NOT 使用 DUID-LL.