20. 中继代理行为
- 中继代理行为
中继代理 MAY 被配置为使用一个目的地址列表, 该列表 MAY 包含单播地址, All_DHCP_Servers 组播地址, 或由网络管理员选择的其他地址. 如果中继代理未被显式配置, 它 MUST 使用 All_DHCP_Servers 组播地址作为默认地址.
如果中继代理将消息中继到 All_DHCP_Servers 组播地址或其他组播地址, 它将 Hop Limit 字段设置为 32.
20.1. 中继客户端消息或 Relay-forward 消息
中继代理同时中继来自客户端的消息和来自其他中继代理的 Relay-forward 消息. 当中继代理收到一条需要中继的有效消息时, 它构造一条新的 Relay-forward 消息. 中继代理将接收该消息的 IP 数据报头部中的源地址复制到 Relay-forward 消息的 peer-address 字段. 中继代理将收到的 DHCP 消息 (不包括任何 IP 或 UDP 头部) 复制到新消息中的 Relay Message option. 中继代理将其配置为包含的任何其他选项添加到 Relay-forward 消息中.
20.1.1. 中继来自客户端的消息
如果中继代理从客户端收到要中继的消息, 中继代理在 link-address 字段中放置一个 global 或 site-scoped 地址, 该地址具有分配给客户端应被分配地址所在链路的前缀. 服务器将使用该地址确定应从哪条链路为客户端分配地址和其他配置信息. Relay-forward 消息中的 hop-count 被设置为 0.
如果中继代理无法使用 link-address 字段中的地址来标识通过哪个接口中继对客户端的响应, 中继代理 MUST 在 Relay-forward 消息中包含 Interface-id option (见第 22.18 节). 服务器将在其 Relay-reply 消息中包含该 Interface-id option. 无论中继代理是否在 Relay-forward 消息中包含 Interface-id option, 中继代理都按前一段所述填充 link-address 字段.
20.1.2. 中继来自中继代理的消息
如果中继代理收到的消息是一条 Relay-forward 消息, 且该消息中的 hop-count 大于或等于 HOP_COUNT_LIMIT, 则中继代理丢弃收到的消息.
中继代理将从客户端收到该消息的 IP 数据报中的源地址复制到 Relay-forward 消息的 peer-address 字段, 并将 hop-count 字段设置为收到消息中 hop-count 字段值加 1.
如果收到消息的 IP 数据报头部中的源地址是 global 或 site-local 地址 (并且运行中继代理的设备只属于一个站点), 中继代理将 link-address 字段设置为 0. 否则, 中继代理将 link-address 字段设置为分配给接收该消息的接口的 global 或 site-local 地址, 或包含 Interface-ID option 以标识接收该消息的接口.
20.2. 中继 Relay-reply 消息
中继代理除了处理 Relay Message option 之外, 还处理 Relay-reply 消息中包含的任何选项, 然后丢弃这些选项.
中继代理从 Relay Message option 中提取消息, 并将其转发到 Relay-reply 消息 peer-address 字段所包含的地址.
如果 Relay-reply 消息包含 Interface-id option, 中继代理在该 Interface-id option 标识的链路上将来自服务器的消息中继给客户端. 否则, 如果 link-address 字段未设置为零, 中继代理在 link-address 字段标识的链路上中继该消息.
20.3. Relay-reply 消息的构造
如果来自客户端的原始消息是通过 Relay-forward 消息中继到服务器的, 服务器使用 Relay-reply 消息向客户端返回响应. 如果服务器没有可用于直接向客户端发送 Reconfigure 消息的地址, 服务器也使用 Relay-reply 消息向客户端发送 Reconfigure 消息.
对客户端的响应 MUST 通过与原始客户端消息相同的中继代理进行中继. 服务器通过创建 Relay-reply 消息来实现这一点, 该消息包含一个 Relay Message option, 其中承载要发送给通向客户端返回路径上下一个中继代理的消息. 所包含的 Relay-reply 消息又包含另一个 Relay Message option, 发送给下一个中继代理, 依此类推. 服务器必须记录收到消息中 peer-address 字段的内容, 以便构造承载服务器响应的适当 Relay-reply 消息.
例如, 如果客户端 C 发送了一条消息, 该消息由中继代理 A 中继到中继代理 B, 然后到达服务器, 则服务器会向中继代理 B 发送以下 Relay-Reply 消息:
msg-type: RELAY-REPLY hop-count: 1 link-address: 0 peer-address: A Relay Message option, containing: msg-type: RELAY-REPLY hop-count: 0 link-address: address from link to which C is attached peer-address: C Relay Message option: <response from server>
通过中继代理向客户端发送 Reconfigure 消息时, 服务器创建一条 Relay-reply 消息, 其中包含一个 Relay Message option, 该选项承载要发送给通向客户端返回路径上下一个中继代理的 Reconfigure 消息. 服务器将 Relay-reply 消息头部中的 peer-address 字段设置为客户端地址, 并按中继代理将 Reconfigure 消息中继到客户端所需设置 link-address 字段. 服务器通过此前与客户端的交互或某种外部机制获得客户端和中继代理的地址.