跳到主要内容

19. 中继代理行为 (Relay Agent Behavior)

relay agent 应当 (SHOULD) 配置为使用包含单播地址的目标地址列表. 目标地址列表可以 (MAY) 包括 All_DHCP_Servers 组播地址或网络管理员选择的其他地址. 如果 relay agent 未显式配置, 它必须使用 All_DHCP_Servers 组播地址作为默认值.

如果 relay agent 将消息中继到 All_DHCP_Servers 组播地址或其他组播地址, 它会将 Hop Limit 字段设置为 8.

如果 relay agent 收到 Relay-forward 和 Relay-reply 之外的消息, 且 relay agent 不识别其消息类型, 它必须按第 19.1.1 节所述转发该消息.

19.1. 中继客户端消息或 Relay-forward 消息 (Relaying a Client Message or a Relay-forward Message)

relay agent 会中继来自客户端的消息, 也会中继来自其他 relay agent 的 Relay-forward 消息. 当 relay agent 收到 Relay-forward 消息, 某个已识别但并非以其为目标的消息类型, 或未识别的消息类型时, 它会构造新的 Relay-forward 消息. relay agent 将接收该消息的 IP 数据报头部中的源地址复制到 Relay-forward 消息的 peer-address 字段. relay agent 将收到的 DHCP 消息 (不包括任何 IP 或 UDP 头部) 复制到新消息中的 Relay Message option (见第 21.10 节). relay agent 会向 Relay-forward 消息添加其配置为包含的任何其他 option.

[RFC6221] 定义了 Lightweight DHCPv6 Relay Agent (LDRA), 它允许由执行链路层桥接 (即非路由) 功能的接入节点插入 relay agent 信息.

19.1.1. 中继来自客户端的消息 (Relaying a Message from a Client)

如果 relay agent 从客户端收到要中继的消息, relay agent 会把一个从分配给该链路的前缀中取得的全局作用域单播地址 (即 GUA 或 ULA) 放入 link-address 字段, 客户端应在该链路上被分配租约. 如果此类地址不可用, relay agent 可以将 link-address 字段设置为接收原始消息的接口上的链路本地地址. 不推荐这样做, 因为它可能要求在服务器配置中提供额外信息. 详细讨论见 [RFC7969] 第 3.2 节.

服务器将使用该地址确定客户端应从哪个链路分配租约和其他配置信息.

Relay-forward 消息中的 hop-count 值设置为 0.

relay 应当 (SHOULD) 按 [RFC6939] 中的描述插入 Client Link-Layer Address option.

如果 relay agent 无法使用 link-address 字段中的地址识别用于中继客户端响应的接口, relay agent 必须在 Relay-forward 消息中包含 Interface-Id option (见第 21.18 节). 服务器将在其 Relay-reply 消息中包含 Interface-Id option. 无论 relay agent 是否在 Relay-forward 消息中包含 Interface-Id option, relay agent 都会按本小节前文所述设置 link-address 字段.

19.1.2. 中继来自 Relay Agent 的消息 (Relaying a Message from a Relay Agent)

如果 relay agent 收到的消息是 Relay-forward 消息, 且消息中的 hop-count 值大于或等于 HOP_COUNT_LIMIT, relay agent 会丢弃收到的消息.

relay agent 将接收该消息的 IP 数据报中的源地址复制到 Relay-forward 消息的 peer-address 字段, 并将 hop-count 字段设置为收到消息中 hop-count 字段的值加 1.

如果收到消息的 IP 数据报头部中的源地址是全局作用域单播地址 (即 GUA 或 ULA), relay agent 将 link-address 字段设置为 0. 否则, relay agent 将 link-address 字段设置为分配给接收该消息的接口的全局作用域单播地址 (即 GUA 或 ULA), 或包含 Interface-Id option (见第 21.18 节) 来标识接收该消息的接口.

19.1.3. 带 Prefix Delegation 的 Relay Agent 行为 (Relay Agent Behavior with Prefix Delegation)

relay agent 转发包含 prefix delegation options 的消息时, 方式与中继地址相同 (即按照第 19.1.1 节和第 19.1.2 节).

如果服务器通过 relay agent 与客户端就 delegated prefixes 通信, 服务器可能需要一种协议或其他带外通信, 以便在客户端可能通过其转发流量的任何路由器上配置 delegated prefixes 的路由信息.

19.2. 中继 Relay-reply 消息 (Relaying a Relay-reply Message)

relay agent 除处理 Relay Message option (见第 21.10 节) 外, 还会处理 Relay-reply 消息中包含的任何 option.

relay agent 从 Relay Message option 中提取消息, 并将其转发到 Relay-reply 消息的 peer-address 字段中包含的地址. Relay agents 禁止修改该消息.

如果 Relay-reply 消息包含 Interface-Id option (见第 21.18 节), relay agent 会在 Interface-Id option 标识的链路上将消息从服务器中继到客户端. 否则, 如果 link-address 字段未设置为 0, relay agent 会在 link-address 字段标识的链路上中继该消息.

如果 relay agent 收到 Relay-reply 消息, 无论 Relay Message option 中封装的消息类型如何, 它都必须按上文定义处理该消息.

19.3. Relay-reply 消息构造 (Construction of Relay-reply Messages)

服务器使用 Relay-reply 消息来 (1) 在来自客户端的原始消息通过 Relay-forward 消息中继到服务器时向客户端返回响应, 或 (2) 在服务器没有可用于直接向客户端发送消息的地址时向客户端发送 Reconfigure 消息.

对客户端的响应必须通过与原始客户端消息相同的 relay agents 中继. 服务器通过创建一个 Relay-reply 消息实现这一点, 该消息包含 Relay Message option (见第 21.10 节), 其中携带发往返回路径上下一个 relay agent 的消息. 所包含的 Relay-reply 消息又包含另一个 Relay Message option, 用于发送到下一个 relay agent, 依此类推. 服务器必须记录收到消息中 peer-address 字段的内容, 以便构造携带服务器响应的适当 Relay-reply 消息.

例如, 如果客户端 C 发送的消息由 relay agent A 中继到 relay agent B, 再中继到服务器, 则服务器会向 relay agent B 发送以下 Relay-reply 消息:

   msg-type:       RELAY-REPL
hop-count: 1
link-address: 0
peer-address: A
Relay Message option containing the following:
msg-type: RELAY-REPL
hop-count: 0
link-address: address from link to which C is attached
peer-address: C
Relay Message option: <response from server>

Figure 10: Relay-reply Example

通过 relay agent 向客户端发送 Reconfigure 消息时, 服务器创建一个 Relay-reply 消息, 其中包含 Relay Message option, 该 option 携带发往返回客户端路径上下一个 relay agent 的 Reconfigure 消息. 服务器将 Relay-reply 消息头部中的 peer-address 字段设置为客户端地址, 并按 relay agent 将 Reconfigure 消息中继到客户端所需的方式设置 link-address 字段. 服务器通过先前与客户端的交互或某种外部机制获得客户端和 relay agent 的地址.

19.4. Relay Agents 与服务器之间的交互 (Interaction Between Relay Agents and Servers)

每当消息由 relay agent 朝服务器中继时, 都会在消息外增加一层新的封装. 每个 relay 都允许在其添加的封装层上插入额外 option, 但禁止更改被封装消息中的任何内容. 如果客户端和服务器之间存在多个 relays, 则会使用多层封装. 虽然这会使消息处理略微复杂, 但它提供了一个主要优势, 即清楚指示哪个 relay 插入了哪个 option. 响应消息预期经过相同 relays 返回, 但顺序相反. 每当响应消息朝客户端中继回来时, 都会移除一层封装.

在某些情况下, relays 可以添加一个或多个 option. 这些 option 可出于若干原因添加:

  • 首先, relays 可以提供有关客户端的额外信息. 服务器管理员通常更信任该信息源, 因为它来自网络基础设施而不是客户端, 且不易伪造. 服务器可使用这些 option 确定其分配策略.

  • 其次, relay 可能需要某些信息来将响应发回客户端. relay agents 预期是无状态的 (消息处理后不保留任何状态). relay agent 可以包含 Interface-Id option (见第 21.18 节), 该 option 会在响应中被回显. 它可以包含其他 option, 并请求服务器在响应中回显其中一个或多个 option. 然后 relay agent 可以使用这些 option 将响应发回客户端, 或用于其他需求. 客户端永远不会看到这些 option. 详情见 [RFC4994].

  • 第三, 有时 relay 是为某些 option 提供值的最佳设备. relay 可以在转发给服务器的消息中插入 option, 并请求服务器将该 option 传回客户端. 客户端将收到该 option. 需要注意, 服务器在这里是最终权威, 并且根据其配置, 它可以向客户端发送该 option, 也可以不发送. 详情见 [RFC6422].

出于各种原因, 服务器可能需要在消息处理完成后保留 relay 信息. 一个原因是 bulk leasequery 机制可能请求通过特定 relay 分配的所有地址和/或前缀. 第二个原因是 reconfigure 机制. 服务器可以选择不直接向客户端发送 Reconfigure 消息, 而是通过 relays 发送. 这种特定行为被视为实现细节, 不在本文档范围内.