跳到主要内容

15. Reliability of Client-Initiated Message Exchanges

DHCP 客户端负责第 18 节中描述的 client-initiated message exchanges 的可靠消息交付. 如果 DHCP 客户端未能从服务器收到预期响应, 客户端必须根据下面描述的重传策略重传其消息.

请注意, 本节描述的过程在与 Solicit 消息一起使用时略有修改. 修改后的过程见第 18.2.1 节.

客户端通过向服务器发送消息来开始 message exchange. 当 (1) 客户端成功从一个或多个服务器收到适当的响应, 或 (2) 根据下面描述的重传机制认为 message exchange 已失败时, message exchange 结束.

客户端必须更新重传消息中 Elapsed Time option (见第 21.9 节) 内的 "elapsed-time" 值. 在某些情况下, 如果客户端任一租约的 valid lifetime 在重传前到期, 客户端可能还需要修改 IA Address options (见第 21.6 节) 或 IA Prefix options (见第 21.22 节) 中的值. 因此, 每当本文档提到客户端消息的 "retransmission" 时, 它既指修改原始消息, 也指把这个新的消息实例发送给服务器.

客户端重传行为由以下变量控制和描述:

RT: 重传超时

IRT: 初始重传时间

MRC: 最大重传次数

MRT: 最大重传时间

MRD: 最大重传持续时间

RAND: 随机化因子

这些参数中与各种消息相关的具体值在第 18.2 节的各小节中给出, 使用第 7.6 节表 1 中定义的值. RAND 算法在所有消息传输中通用.

每次消息传输或重传时, 客户端按下面给出的规则设置 RT. 如果 RT 在 message exchange 结束前到期, 客户端会重新计算 RT 并重传消息.

每次计算新的 RT 都包含一个随机化因子 (RAND), 这是在 -0.1 到 +0.1 之间按均匀分布选择的随机数. 引入随机化因子是为了尽量减少 DHCP 客户端所发送消息的同步.

选择随机数的算法不需要具备密码学强度. 该算法应该在每次调用 DHCP 客户端时产生不同的随机数序列.

首次消息传输的 RT 基于 IRT:

RT = IRT + RAND*IRT

后续每次消息传输的 RT 基于前一个 RT 值:

RT = 2*RTprev + RAND*RTprev

MRT 指定 RT 值的上界 (不考虑使用 RAND 添加的随机化). 如果 MRT 的值为 0, 则 RT 值没有上限. 否则:

if (RT > MRT)
RT = MRT + RAND*MRT

MRC 指定客户端可以重传消息次数的上界. 除非 MRC 为零, 否则一旦客户端已传输该消息 MRC 次, message exchange 即失败.

MRD 指定客户端可以重传消息的时间长度上界. 除非 MRD 为零, 否则一旦自客户端首次传输该消息起已经过 MRD 秒, message exchange 即失败.

如果 MRC 和 MRD 都非零, 则只要满足前两段中任一条件, message exchange 即失败.

如果 MRC 和 MRD 都为零, 客户端会继续传输该消息直到收到响应.

不要求客户端在整个 RT 周期内都监听响应; 出于节省功耗或其他原因, 它可以在至少等待 RT 和 MAX_WAIT_TIME 中较短者之后关闭监听能力. 当然, 如果客户端已与服务器协商使用 Reconfigure, 则客户端必须监听 Reconfigure.