第 1 章 - Azure RTOS NetX Duo DHCPv6 服务器简介

在 IPv6 网络中,DHCPv6 是客户端获取 IPv6 地址的必需协议。 此协议不能替换限用于 IPv4in IPv6 的 DHCP,它不能提供 IPv4 地址。 DHCPv6 具有与 DHCP 类似的功能,以及许多增强功能。 如果客户端不使用或不能使用 IPv6 无状态地址自动配置,则可使用 DHCPv6 获取 DHCPv6 服务器分配的全局唯一 IPv6 地址。

NetX Duo 可支持基于 IPv6 网络的应用程序和网络协议,如 DHCPv6。 本文档将详细介绍 NetX Duo DHCPv6 服务器如何将 IPv6 地址分配给 DHCPv6 客户端。

DHCPv6 通信

DHCPv6 消息结构

消息内容基本都是消息标头后跟一个或多个(通常是多个)选项块。 下面是基本结构,其中每块表示一个字节:

显示 DHCPv6 消息和选项块结构的关系图。

图 1. DHCPv6 消息和选项块结构

1 字节的“消息类型”字段表示 DHCPv6 消息的类型。 3 字节的“事务 ID”字段由客户端设置。 在发送给服务器的每个客户端消息中,此字段可按任何字符序列确定,但必须是唯一的(在客户端发送的重复消息中可保留相同代码)。 服务器会在发送给客户端的每个响应中使用该事务 ID,便于客户端匹配服务器消息,以防数据包在网络中延迟或丢弃。 “事务 ID”字段后跟一个或多个 DHCPv6 选项,用于表示客户端所请求的内容。

DHCPv6 选项结构由选项代码、“选项长度”字段和选项数据本身构成,其中“选项长度”字段不包含长度或代码字段,最后选项数据是一个或多个 2 字节的选项代码字段,用于表示客户端所请求的数据。

某些选项块具有嵌套选项。 例如,非临时地址的标识关联 (IANA) 选项包含一个或多个用于请求 IPv6 地址的标识关联 (IA) 选项。 服务器回复消息中返回的 IANA 选项包含与服务器所授予 IPv6 地址和租用时间相同的 IA 选项,以及“状态”选项,后者用于指示客户端地址请求是否出现错误。

附录 A 中提供了所有选项块及其说明的列表。

DHCPv6 消息类型

DHCPv6 显著增强了 DHCP 的功能,但其使用的消息数量与 DHCP 相同,并且其支持的供应商选项也与 DHCP 相同。 DHCPv6 消息列表如下所示:

  • SOLICT (1)(由客户端发送)
  • ADVERTISE (2)(由服务器发送)
  • REQUEST (3)(由客户端发送)
  • REPLY (7)(由服务器发送)
  • CONFIRM (4)(由客户端发送)
  • RENEW (5)(由客户端发送)
  • REBIND (6)(由客户端发送)
  • RELEASE (8)(由客户端发送)
  • DECLINE (9)(由客户端发送)
  • INFORM_REQUEST (11)(由客户端发送)
  • RECONFIGURE* (10)(由服务器发送)

*NetX Duo DHCPv6 服务器不支持 RECONFIGURE。

基本 DHCPv6 请求序列(括号中提供了等效的 DHCPv4 消息类型)如下所示:

客户端 Solicit (Discovery) 服务器 Advertisement (Offer) 客户端 Request (Request) 服务器 Reply (DHCPAck)

客户端 Renew (Renew) 服务器 Reply (DHCPAck)

DHCPv6 消息验证

事务 ID:客户端必须为其发送给服务器的每个消息生成事务 ID。 DHCPv6 服务器将拒绝客户端发送的与此事务 ID 不一致的所有消息。 服务器必须在其发送回客户端的响应中使用相同的事务 ID。

DHCPv6 唯一标识符 (DUID)

所有服务器消息的每一个消息中还必须包含 DHCPv6 唯一标识符 (DUID),否则 DHCPv6 客户端不能接受消息。 链路层 (LL) DUID 是一个控制块,其中包含客户端 MAC 地址、硬件类型和 DUID 类型。 链路层时间 (LLT) DUID 还包含一个时间字段,可降低 DUID 在主机网络上不是唯一标识符的几率。 因此,RFC 3315 建议使用 LLT DUID 而不是 LL DUID。 如果主机应用程序未创建自己的唯一时间值,NetX Duo DHCPv6 会提供一个默认值。 第三种类型的 DUID 是企业(供应商分配)DUID,其中包含注册的企业 ID(在 IANA 中注册的)和专用数据,后者是基于内存大小、其他硬件配置操作系统类型的类型和长度变量。 请参阅本文档其他位置的配置选项列表,了解如何设置服务器供应商分配的值和专用 ID 值。

除了 INFORM_REQUEST 以外,客户端还必须在发送给服务器的消息中加入其 DUID,否则服务器将拒绝接收。

DHCPv6 客户端服务器会话

DHCPv6 客户端和服务器通过 UDP 交换消息。 客户端使用端口 546 发送和接收 DHCPv6 消息,而服务器使用端口 547。 客户端最初使用其链路本地地址传输和接收 DHCPv6 消息。 它使用保留的链路范围内的多播地址(称为 All_DHCP_Relay_Agents_and_Servers 多播地址)(FF02::01:02) 向 DHCPv6 服务器发送所有消息。

对于 IPv6 地址分配请求,DHCPv6 服务器会侦听发送到 All_DHCP_Relay_Agents_and_Servers 地址的征求消息。 在征求请求中,客户端可请求分配特定 IPv6 地址,也可让服务器选择一个地址。 它还可请求服务器分配其他网络配置信息。

如果 DHCPv6 服务器提取有效征求消息,并可以为客户端分配特定 IPv6 地址,则会通过播发消息响应,其中包含将授予客户端的 IPv6 地址、IPv6 地址租用时间和客户端请求的所有其他信息。 如果客户端接受服务器提供的服务,则会通过请求消息响应,以通知服务器它将接受此 IPv6 地址。 服务器使用回复消息确认客户端绑定 IPv6 地址。

如果客户端 DHCPv6 消息无效,服务器会在不提示的情况下放弃该消息。 如果服务器无法授予请求内容,则会发送回复消息,并在 IP 地址 IANA 选项的“状态”字段中指示问题。 如果收到重复的客户端请求,服务器会在客户端未收到数据包的情况下重新发送以前的 DHCPv6 响应。

客户端可使用各种 IPv6 协议(如重复地址检测),验证服务器分配的 IPv6 地址是否未分配给系统中的其他主机。 如果该地址不是唯一的,客户端会向服务器发送拒绝消息。 服务器将使用此信息更新其 IP 租用表,并记录该地址已分配。 同时,客户端必须再一次发送征求消息,重新开始 DHCPv6 请求过程。

除了 IPv6 地址以外,客户端可能还需要知道 DNS 服务器和其他网络信息,如网络域名。 DHCPv6 提供了请求这类信息的方法,用户只需在征求和请求消息中使用选项请求,或在信息请求消息中单独使用选项请求即可。 本章稍后介绍 DHCPv6 选项。

IPv6 租用期限

当服务器向客户端授予 IPv6 地址时,还会在 IANA 选项中分配租用期限(生存期),以便在此时建议客户端使用续订和重新绑定消息开始续订 (T1) 或重新绑定 (T2) 其 IPv6 地址。 这两者之间的区别是,客户端通过在续订请求中加入服务器 DUID 将续订消息定向到服务器。 但客户端不会在发送到 All_DHCP_Relay_Agents_and_Servers 地址的重新绑定消息中指定任何服务器,因此不会在其中加入特定服务器 DUID。 IA 选项中包含服务器授予客户端的实际 IPv6 地址,同时还包含 IPv6 租用地址被弃用或过时(无效)时的首选生存期和有效生存期。

NetX Duo DHCPv6 服务器会为每个客户端维护会话超时,以跟踪客户端消息之间的时间。 这是必需配置,以防客户端主机丢失连接或网络中断。 如果会话超时到期,则假定客户端不再感兴趣,或无法向服务器发送 DHCPv6 请求。 服务器会删除客户端记录,并将所有临时分配的 IPv6 地址返回到可用池。 会话超时等待是用户可配置选项。

如果客户端想要释放其 IPv6 地址,或发现 DHCPv6 服务器分配给它的 IPv6 地址已在使用中,则可分别发送释放或拒绝消息。 对于释放消息,服务器会将该 IPv6 地址状态返回到可用池。 对于拒绝消息,服务器会更新其 IP 租用表,以指示此 IPv6 地址不可用(属于网络上其他位置的其他实体)。

IPv6 租用和客户端记录数据

当 DHCPv6 服务器开始接受客户端请求时,会维护正在请求或已分配到 IPv6 地址的活动客户端的列表。 服务器通过定期更新客户端租用期限的租用计时器,检查 IP 租用到期时间。 当到期时间超出有效生存期时,服务器会清除客户端记录,并将其 IPv6 地址返回到可用池。 客户端可在此之前开始续订/重新绑定过程!

NetX Duo DHCPv6 服务器的客户端记录表包含用于标识客户端的信息,以及用于验证 DHCPv6 客户端请求和分配或重新分配 IPv6 地址的“状态”信息。 此类信息包括:

  • 客户端 DHCPv6 唯一标识符 (DUID),用于唯一定义网络上的各客户端主机。 客户端必须始终在其所有 DHCPv6 消息中使用此相同的 DUID。

  • 客户端非临时地址的标识关联 (IANA) 和标识关联 IPv6 地址 (IA),用于定义客户端 IPv6 地址分配参数。

  • 客户端选项请求(DNS 服务器、域名等)。

  • 客户端最新 DHCPv6 请求的 IPv6 源地址(如果已设置)和目标地址(如果不是多播)。

  • 客户端的最新消息类型和 DHCPv6“状态”。

NetX Duo DHCPv6 服务器要求和约束

NetX Duo DHCPv6 服务器 API 需要 ThreadX 5.1 或更高版本,以及 NetX Duo 5.5 或更高版本。

要求

IP 线程任务设置

NetX Duo DHCPv6 服务器需要创建 IP 实例才能在其网络链路上发送和接收 DHCPv6 消息。 为此,可使用 nx_ip_create 服务。 用户必须创建 NetX Duo DHCPv6 服务器本身。 为此,可使用 nx_dhcpv6_server_create 服务。

DHCPv6 使用 NetX Duo、ICMPv6 和 UDP。 因此,在使用 DHCPv6 服务器之前,必须先通过调用以下 NetX Duo 服务来启用 IPv6:

  • nx_udp_enable
  • nxd_ipv6_enable
  • nxd_icmp_enable

此外,在启动 DHCPv6 服务器之前,还要执行多项设置任务:

  • 创建并验证其链路的本地和 IPv6 全局地址。 如果已启用重复地址检测,NetX Duo 会使用此协议自动执行地址验证。 有关链路本地和全局 IP 地址验证的详细信息,请参阅《NetX Duo 用户手册》。

  • 为其 DHCPv6 接口设置网络接口索引。

  • 为可分配的 IPv6 地址创建 IP 地址范围。 或者,如果数据来自以前的服务器 DHCPv6 会话,则必须将该会话中的 IPv6 租用表和客户端记录从非易失存储器上传到 DHCPv6 服务器。 本文档其他位置的小示例系统将演示这些 DHCPv6 服务器服务,以实现此要求。

  • 设置服务器 DUID。 如果服务器以前的会话中已创建其 DUID,则必须使用相同的数据为发送到客户端的消息创建相同的 DUID。 本文档其他位置的小示例系统将演示如何实现此要求。

此时,DHCPv6 服务器已准备好运行。 NetX Duo DHCPv6 服务器将在内部创建绑定到端口 547 的 UDP 套接字,并开始侦听客户端请求。

数据包池要求

NetX Duo DHCPv6 服务器需要使用数据包池才能发送 DHCPv6 消息。 数据包池的大小是用户可根据数据包有效负载和可用数据包数量配置的,并且取决于预期的 DHCPv6 消息量和主机应用程序将发送的其他传输内容量。

典型的 DHCPv6 消息大约 200-300 字节,具体取决于客户端所请求附加选项的数量和服务器可提供的信息。

设置 DHCPv6 服务器接口

DHCPv6 服务器默认使用主网络接口作为接受客户端请求的接口。 但是,主机应用程序仍必须设置全局地址索引,用于创建服务器全局地址。 DHCPv6 接口索引和全局地址索引可使用 nx_dhcpv6_server_interface_set 服务进行设置。 本文档的“小示例”也会演示此操作。

在服务器重新启动时保存 DHCPv6 DUID

DHCPv6 协议要求服务器在多次重新启动时使用相同的 DUID。 因此,为满足此要求,用户必须在非易失存储器中存储和检索用于创建 DUID 的所有数据。 使用链路层和时间 DUID 的主机需要访问实时时钟。 NetX Duo DHCPv6 主机应用程序应具备实时数据访问权,以为创建初始服务器 DUID 生成时间值,而且应存储该数据,以在后续服务器会话中重复使用。 nx_dhcpv6_set_server_duid 随后可根据 DUID 类型将 DUID 数据用作其参数或配置选项,以生成(或重现)其自己的 DUID。

创建可分配的 IPv6 地址列表

在创建 DHCPv6 服务器后,如果没有以前存储的 IP 地址列表数据,服务器主机应用程序必须创建一系列可分配的 IPv6 全局地址。 为此,可使用 nx_dhcpv6_create_ip_address_range 服务将输入用作起始和结束 IPv6 地址。

保存 DHCPv6 可分配地址和客户端数据

DHCPv6 协议要求 DHCPv6 服务器在重新启动时将其客户端和 IPv6 地址数据保存在非易失存储器中。 NetX Duo DHCPv6 服务器有多个 API,分别用于将客户端和 IPv6 地址数据上传到 DHCPv6 服务器,以及从其中下载这些数据:

nx_dhcpv6_add_client_record

nx_dhcpv6_add_ip_address_lease

nx_dhcpv6_retrieve_client_record

nx_dhcpv6_retrieve_ip_address_lease

必须先将数据上传到服务器,然后再重新启动服务器。 仅在 DHCPv6 服务器停止(或暂停)后,才能下载数据。 本文档稍后将详细介绍用于执行此操作的服务。 但是,NetX Duo DHCPv6 不能定义对非易失存储器的访问权。 此操作必须由主机应用程序处理。 小示例将演示主机应用程序如何执行此操作。

服务器 DHCP 唯一标识符 (DUID)

服务器 DUID 可唯一定义网络上的 DHCPv6 服务器主机。 如果服务器以前尚未创建其 DUID,则可使用 nx_dhcpv6_server_set_duid 创建一个。 根据 RFC 3315,DHCPv6 服务器必须将此 DUID 保存到非易失存储器,以便在服务器重新启动后进行检索。 DHCPv6 服务器支持链路层、链路层时间和企业(供应商分配的)DUID 类型。 请注意,客户端必须直接发送供应商类型 DUID。 NetX Duo DHPv6 服务器不直接支持供应商类型 DUID (17) 选项。

DHCPv6 服务器主机应用程序在分配 IPv6 地址时使用默认值,包括租用超时。 请参阅本文档后文的“可配置选项”,了解如何设置这些选项。 :

IANA 控制块包含 T1 和 T2 字段。 IANA 控制块中的 IA 块包含首选生存期和有效生存期字段。 主机应用程序已定义可配置选项(本文档其他位置)来设置这些选项。 应用程序会将它们分配给所有客户端 IPv6 地址请求。

这些 DHCPv6 IP 租用参数定义如下。

T1 – 客户端必须开始续订服务器已分配给它的 IPv6 地址的时间(以秒为单位)。

T2 – 如果续订失败,客户端必须开始重新绑定其链路上服务器 IPv6 地址的时间(以秒为单位)。

首选生存期 – 在客户端未续订或重新绑定地址的情况下弃用此地址的时间(以秒为单位)。 客户端仍然可以使用此地址。

有效生存期 – 客户端 IP 地址到期且不能在其网络传输中使用此地址的时间(以秒为单位)。

RFC 建议客户端 IANA 选项中首选生存期的 T1 和 T2 时间分别为 0.5 和 0.8。 如果服务器没有首选项,则应将这些时间设置为零。 如果服务器回复中包含的 T1 和 T2 时间设置为零,则客户端可设置其自己的 T1 和 T2 时间。

约束

NetX Duo DHCPv6 服务器不支持以下 DHCPv6 选项:

  • “快速提交”选项,可将 DHCPv6 地址请求过程优化为仅含征求和回复消息交换

  • “重新配置”选项,服务器可使用此选项更改客户端的 IP 地址状态。

  • “单播”选项;所有客户端消息都必须发送到 All_DHCP_Relay_Agents_and_Servers 多播地址,而不是直接发送到 DHCPv6 服务器。

  • “临时地址的标识关联 (IA_TA)”选项,这是授予客户端的临时 IP 地址。

  • 每个客户端请求使用多个 IA(IPv6 地址)选项

  • DHCPv6 客户端和服务器之间的中继主机,例如客户端和服务器必须在同一网络上。

  • DHCPv6 消息不支持 IPSec 和身份验证。 但是,IP 实例可能已启用 IPSec,具体取决于所使用 NetX Duo 的版本。

  • NetX Duo DHCPv6 服务器仅直接支持 DNS 服务器选项请求。 以后的版本可能会更改此配置。

  • 不支持“前缀委派”选项。

  • 对 DHCPv6 消息进行身份验证时在基础 NetX Duo 环境中启用 IPSec。 NetX Duo DHCPv6 服务器不支持通过中继连接方式连接客户端。 服务器假定所有客户端请求均源自服务器网络上的主机。

NetX Duo DHCPv6 服务器回调函数

nx_dhcpv6_IP_address_declined_handler

当 DHCPv6 客户端发送拒绝消息时,NetX Duo DHCPv6 服务器会在其 IPv6 地址表中将该地址标记为不可用。 为能自定义服务器处理此消息,已提供 nx_dhcpv6_IP_address_declined_handler*。*但当前未实现此回调。

nx_dhcpv6_server_option_request_handler

当 DHCPv6 客户端消息包含选项请求数据时,NetX Duo DHCPv6 服务器会将每个选项请求的选项代码转发给此用户回调函数(如果已定义)。 这样,NetX Duo 服务器可让用户定义回调函数填充数据。 但当前未实现此功能。

支持的 DHCPv6 RFC

NetX Duo DHCPv6 符合 RFC3315、RFC3646 和相关 RFC。