/etc/resolv.conf
配置为:
options timeout:1 attempts:5 rotate
nameserver A
nameserver B
两个配置的名称服务器都有 3 秒的延迟。发生以下消息交换:
- 00:00 - 查询 #1 发送到 A
- 00:01 - 查询 #2 发送到 B
- 00:02 - 查询 #3 发送到 A
- 00:03 - 查询 #4 发送到 B
- 00:03 - 从 A 收到回复 #1
Linux 解析器是否会接受对查询 #1 的回复,因为它仍在解析地址,或者是否丢弃初始 1 秒超时后的所有回复?
不幸的是,man resolf.conf并没有真正澄清这一点。
DNS 查询也基于 RTT(往返时间),就像 ICMP 一样。DNS 查询的 RTT 是对发出DNS 查询和收到答案之间的延迟的度量,这意味着回复(在您的情况下 - 从 A 收到的对 #1 的回复)必须在配置的最大超时之前到达令其被视为有效。它与 ICMP 的工作方式完全相同。
从技术上讲,RTT 是发送信号所需的时间长度加上接收该信号的确认所需的时间长度。
我已经在我的实验室中测试了这种行为。如果 Linux 解析器在解析域时出现,它确实会成功回复,即使回复的延迟大于 1 秒。在我的实验室中,我设置了 3 秒的 DNS 服务器延迟,并且设置了 {{options timeout:1 attempt:5}},客户端仍然解析了域。数据包捕获证明在客户端已经发送了对两个配置的 DNS 服务器的多个查询后收到了回复。
将默认值或 {{options timeout:5 次尝试:1}} 更改为 {{options timeout:5 次尝试:1}} 从而减少 DNS 服务器故障转移延迟,同时仍然允许慢速 DNS 服务器同时提供答案。