DNS
dns.smg.fm Windows DNS 客户端行为说明
进入模拟器 ↓
Interactive Explainer

Windows 如何在多台 DNS 之间做选择?

不是随机,也不是轮询。Windows DNS 客户端维护一份有序列表与动态优先级分数, 只在超时无响应时故障转移;收到 NXDOMAIN 等否定应答不会切换服务器。

Preferred → Alternate 粘性约 15 分钟 ServerPriorityTimeLimit = 900s 单网卡超时阶梯

01核心要点

有序列表 首选(Preferred)排第一,其余为备用(Alternate)。查询按列表顺序发起。
动态优先级 每台服务器有 priority score。超时降分,成功应答加分;最高分者优先,同分看列表顺序。
仅超时才切换 NXDOMAIN / NODATA 等否定应答仍视为「服务器可用」,不会触发故障转移。
~15 分钟粘性 故障转移后,约 900 秒内会优先继续使用那台成功响应的服务器。

02交互模拟器

服务器数
速度
📌
故障转移已发生
接下来约 15 分钟会优先用这台:DNS2
t = 0.0
查询域名:example.test · 时长 0–10s
0s1s2s4s6s8s10s

03单网卡查询时间线(官方行为)

配置 2 台 DNS

t = 0向 DNS1 发查询
t = 1向 DNS2 发查询
t = 2再次向 DNS2 发查询
t = 4+两台并行重试
~10s停止查询

配置 3 台 DNS

t = 0向第 1 台发查询
t = 1向第 2 台发查询
t = 2向第 3 台发查询
t = 4+全部并行重试
~10s停止查询

优先级分数会随应答升降:超时降低分数,有效应答提升分数。分数最高者成为后续首选; 平局时回退到列表原始顺序。粘性窗口默认 ServerPriorityTimeLimit = 900 秒(约 15 分钟)。

04决策流程

需要解析域名
按当前优先级分数排序服务器
同分 → 列表顺序;首选默认最高
向当前最优服务器发送查询
(并按时间线阶梯探测其余服务器)
收到应答(含 NXDOMAIN)
提升该服务器分数
使用其应答结果
NXDOMAIN ≠ 故障转移
超时 / 无响应
降低该服务器分数
继续等待其他服务器
若其他服务器先成功应答
→ 故障转移 + ~15 分钟粘性

05简要对比:Windows · Linux · macOS

特性 Windows Linux (glibc) macOS
多服务器策略 有序 + 动态优先级分数 严格按 resolv.conf 顺序;超时才试下一台 按 scutil / 网络服务顺序;可并行
轮询 / 随机 否(默认 rotate 关闭) 否(非 round-robin)
NXDOMAIN 是否切换
故障粘性 ~15 分钟(可调) 无持久粘性(每次查询重来) 有短期偏好,实现细节因版本而异
并行探测 阶梯后并行(见时间线) 默认串行(options timeout/attempts) 常并行发往多服务器

上表为常见默认行为的简化对比,实际还受 nsswitch、mDNSResponder、DoH、企业策略等影响。