14. 客户端发起的消息交换的可靠性
- 客户端发起的消息交换的可靠性
DHCP 客户端负责在第 17 节和第 18 节所述的客户端发起的消息交换中可靠地投递消息. 如果 DHCP 客户端未能收到来自服务器的预期响应, 客户端必须重传其消息. 本节描述客户 端在客户端发起的消息交换中所要使用的重传策略.
注意, 本节所述的过程与 Solicit 消息一起使用时略有改动. 改动后的过程在第 17.1.2 节中描述.
客户端通过向服务器发送一条消息来开始消息交换. 当客户端成功地从一台或多台服务器 收到适当的响应, 或者当根据下述重传机制判定消息交换已失败时, 消息交换终止.
客户端的重传行为由以下变量控制和描述:
RT 重传超时 (Retransmission timeout)
IRT 初始重传时间 (Initial retransmission time)
MRC 最大重传次数 (Maximum retransmission count)
MRT 最大重传时间 (Maximum retransmission time)
MRD 最大重传时长 (Maximum retransmission duration)
RAND 随机化因子 (Randomization factor)
每发送或重传一次消息, 客户端根据上述规则设置 RT. 如果在消息交换终止之前 RT 已到 期, 客户端重新计算 RT 并重传该消息.
每次计算新的 RT 都包含一个随机化因子 (RAND), 它是在 -0.1 到 +0.1 之间以均匀分布 随机选取的数. 引入随机化因子是为了最小化由 DHCP 客户端发送的消息之间的同步.
选择随机数的算法不需要在密码学上可靠. 该算法应当 (SHOULD) 在 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 次, 消息交换即告失败.
MRD 规定了客户端可以重传一条消息的时长的上限. 除非 MRD 为零, 否则自从客户端首次发 送该消息起经过 MRD 秒后, 消息交换即告失败.
如果 MRC 和 MRD 均非零, 则只要前两段中规定的任一条件满足, 消息交换即告失败.
如果 MRC 和 MRD 均为零, 客户端持续发送该消息, 直到收到响应为止.