第 1 章 - Azure RTOS NetX DHCP 客户端简介

在 NetX 中,应用程序的 IP 地址是其中一个提供给 nx_ip_create 服务调用的参数。 如果应用程序可以静态方式或通过用户配置知晓其 IP 地址,则提供该 IP 地址不会造成任何问题。 但是,在某些情况下,应用程序不知道或不关心其 IP 地址。 在这种情况下,应该提供零 IP 地址给 nx_ip_create 函数,并且应使用 Azure RTOS DHCP 客户端协议动态获取 IP 地址。

动态 IP 地址分配

用于从网络获取动态 IP 地址的基本服务是反向地址解析协议 (RARP)。 此协议类似于 ARP,只不过它专门用于获取自身的 IP 地址,而不是查找其他网络节点的 MAC 地址。 低级别的 RARP 消息在本地网络上广播,网络上的服务器负责作出 RARP 响应,该响应中包含动态分配的 IP 地址。

尽管 RARP 提供了动态分配 IP 地址的服务,但有几个缺点。 最明显的缺陷是,RARP 仅提供 IP 地址动态分配。 在大多数情况下,要让设备正确加入网络,需要更多的信息。 除 IP 地址之外,大部分设备还需要网络掩码和网关 IP 地址。 此外,可能还需要 DNS 服务器 IP 地址和其他网络信息。 RARP 无法提供这些信息。

RARP 替代项

为克服 RARP 的缺陷,研究人员已开发出一种更为全面的 IP 地址分配机制,称为 Bootstrap 协议 (BOOTP)。 此协议能够动态分配 IP 地址,还可以提供其他重要的网络信息。 然而,BOOTP 有一个缺点,即专用于静态网络配置, 不支持快速或自动化的地址分配,

而这正是动态主机配置协议 (DHCP) 的优势所在。 DHCP 旨在扩展 BOOTP 的基本功能,实现完全自动的 IP 服务器分配和完全动态的 IP 地址分配,其中,IP 地址分配是通过将 IP 地址“租借”给客户端一段指定时间来实现。 此外,还可将 DHCP 配置成以静态方式分配 IP 地址,就像 BOOTP 一样。

DHCP 消息

尽管 DHCP 极大地增强 BOOTP 的功能,但 DHCP 使用与 BOOTP 相同的消息格式,并支持与 BOOTP 相同的供应商选项。 为执行其功能,DHCP 引入了 7 个新的 DHCP 专用选项,如下所示:

  • DISCOVER (1)(由 DHCP 客户端发送)

  • OFFER (2)(由 DHCP 服务器发送)

  • REQUEST (3)(由 DHCP 客户端发送)

  • DECLINE (4)(由 DHCP 客户端发送)

  • ACK (5)(由 DHCP 服务器发送)

  • NACK (6)(由 DHCP 服务器发送)

  • RELEASE (7)(由 DHCP 客户端发送)

  • INFORM (8)(由 DHCP 客户端发送)

  • FORCERENEW (9)(由 DHCP 客户端发送)

DHCP 通信

DHCP 利用 UDP 协议发送请求和字段响应。 在知晓 IP 地址之前,使用 IP 广播地址 255.255.255.255 来发送和接收包含 DHCP 信息的 UDP 消息。

DHCP 客户端状态机

DHCP 客户端是以状态机的形式实现, 该状态机由 nx_dhcp_create 处理期间创建的内部 DHCP 线程处理。 DHCP 客户端的主要状态如下所示:

  • NX_DHCP_STATE_BOOT:正在使用先前的 IP 地址启动

  • NX_DHCP_STATE_INIT:正在没有先前 IP 地址值的情况下启动

  • NX_DHCP_STATE_SELECTING:正在等待来自任何 DHCP 服务器的响应

  • NX_DHCP_STATE_REQUESTING:已识别到 DHCP 服务器,已发送 IP 地址请求

  • NX_DHCP_STATE_BOUND:已建立 DHCP IP 地址租约

  • NX_DHCP_STATE_RENEWING:DHCP IP 地址租约续订时间已过,已请求续订

  • NX_DHCP_STATE_REBINDING:DHCP IP 地址租约重新绑定时间已过,已请求续订

  • NX_DHCP_STATE_FORCERENEW:已建立 DHCP IP 地址租约,由服务器强制续订(当前不支持),或者由调用 nx_dhcp_force_renew 的应用程序强制续订

  • NX_DHCP_STATE_ADDRESS_PROBING:正在进行 DHCP IP 地址探测,发送 ARP 探测以检测 IP 地址冲突。

DHCP 客户端多接口支持

以前,实现的 DHCP 客户端仅在单个网络接口上运行。 DHCP 客户端的默认行为是在主接口上运行,现在仍是如此。 通过调用 nx_dhcp_set_interface_index,应用程序可以在辅助网络接口而非主接口上运行 DHCP,现在仍是如此。

现在,支持在多个接口上并行运行的 DHCP。 有关如何同时在多个物理接口上运行 DHCP 客户端的具体详细信息,请参阅第二章中的“同时在多个接口上运行的 DHCP 客户端”。

DHCP 用户请求

一旦 DHCP 服务器授予 IP 地址,DHCP 客户端处理就可以使用 nx_dhcp_user_option_request 服务来请求其他参数(一次一个)。

DHCP 客户端套接字队列

DHCP 客户端会在等待服务器响应自身的同时,从其套接字接收队列中,自动清除来自 DHCP 服务器的发往其他 DHCP 客户端的广播数据包。 在繁忙的网络中,如果不这样做,可能会导致丢弃要发往该客户端的数据包。

DHCP RFC

NetX DHCP 符合 RFC2132、RFC2131 以及相关 RFC。