说到DNS,有很多工具可以用来找出最适合你系统的方案。你运行DNS工具,它给出“最佳DNS”,然后你把DNS地址填进适配器。搞定,你的网络感觉更快了,而且可能也更安全、更私密。
但当你用不同工具运行DNS测试时会发生什么?正如我发现的那样,根据所使用的DNS测试不同,你会得到截然不同的结果——而这背后有充分的理由。
我在三个不同工具上运行了DNS测试
广泛测试本应给出更清晰的结果
几个月来,我一直在断断续续地运行各种DNS测试,因为我把家庭网络上的Cloudflare换成了自定义DNS方案。自那以后,我还对一些最流行的DNS提供商进行了基准测试,看看哪个才是真正最好的,并使用GRC Benchmark V2发现了一些我从未听说过的DNS提供商。
在那段时间里,我用过几个不同的工具。DNS Speed Test是一个在线DNS测试工具,出结果很快,而前面提到的GRC Benchmark V2是Steve Gibson传奇般的GRC Benchmark V1 DNS测试工具的新版本。它也是一个付费工具,花10美元买个永久授权,但物有所值。
我还在PC上运行了一个PowerShell脚本,用一系列流行的解析器和网站测试我的DNS,将现有的DNS配置与另外两个工具进行对比,这样我就有了三组清晰的数据可以对比。
但在三个DNS测试工具上,我得到了三个不同的结果
每个工具都建议了不同的最佳DNS
真正让我惊讶的是,每个工具给出的结果差异竟然这么大。这背后有充分的理由,我稍后会详细说明,但说到底就是每个工具的测试方法不一样。
所以,GRC Benchmark V2建议我使用一个名为Vercara的DNS服务,根据该工具的说法,它比其他大多数选项快得多。但问题也来了:Vercara DNS是一项面向企业的高级DNS服务。因此,虽然它的DNS解析看起来超级快,但它并不是我会使用的工具,因为它要花钱,而很多其他流行的DNS解析器都是免费的。
然后,DNS Speed Test则认为Quad9更适合我的网络。我以前在许多设备上使用过Quad9,它是一个流行的DNS解析器,我们经常建议人们尝试。
最后,我的PowerShell脚本发现,在测试包含的八个免费DNS服务中,AdGuard是25个样本中最快的选项。
三个不同的DNS测试,三个不同的结果,这就让人纳闷了:“这是怎么回事?”
为什么不同的DNS测试工具结果不一样
它们不是对速度有争议——而是对测什么有争议
乍一看,我收到了一堆乱七八糟的DNS测试结果,让人很难搞清楚到底什么才最适合我的网络。其实真正的情况是,每个工具回答的其实是稍微不同的DNS测试问题。
例如,GRC Benchmark V2不只是测你大概听说过的那几个DNS解析器。它是一个全面的DNS测试工具,这意味着它内置了一个庞大的IPv4、IPv6、DoH和DoT解析器列表,它会扫描这些解析器来生成你的列表。所以测试要花不少时间(我这边超过了20分钟),但也意味着你会得到一个真正全面的列表。但后来我发现,里面有些解析器你根本用不了。
这就是GRC Benchmark V2自定义DNS列表派上用场的地方;你可以自己挑一组特定的DNS解析器,而不是用工具里预置的全部解析器。
而且,这还不是测试的全部,还有些让人意想不到的地方。GRC Benchmark V2测试UDP、DoH和DoT。但DNS Speed Test只测试DoH连接,这意味着每个结果反映的是解析器在加密HTTPS连接上的性能,而不是大多数设备默认用的普通DNS。这个区别很关键,就像我在对比加密和非加密DNS提供商时发现的那样。
我的PowerShell脚本也使用了不同的测试方法
你猜怎么着?我的PowerShell脚本又是另一套做法。它只测试走老式UDP端口53的DNS,结果又不一样。想自己试试的话,脚本在下面:
$domains = @("google.com","bbc.co.uk","reddit.com","amazon.com","github.com")
$resolvers = @{
"Cloudflare" = "1.1.1.1"
"Quad9" = "9.9.9.9"
"Google" = "8.8.8.8"
"OpenDNS" = "208.67.222.222"
"AdGuard" = "94.140.14.14"
"Mullvad" = "194.242.2.2"
"LibreDNS" = "88.198.92.222"
"CleanBrowsing" = "185.228.168.9"
$passes = 5
$results = foreach ($name in $resolvers.Keys) {
$allTimes = for ($i = 1; $i -le $passes; $i++) {
Clear-DnsClientCache
$domains | ForEach-Object {
(Measure-Command { Resolve-DnsName -Name $_ -Server $resolvers[$name] -ErrorAction SilentlyContinue }).TotalMilliseconds
[PSCustomObject]@{
Resolver = $name
AvgMs = [math]::Round(($allTimes | Measure-Object -Average).Average, 1)
样本数 = $allTimes.Count
$results | Sort-Object AvgMs
缓存也是另一个有争议的地方,同样会影响你得到的结果。
我的脚本在每一遍测试前都会专门清除 DNS 缓存——我只想要冷的、无缓存的查询,因此五个域名乘以五轮测试,每个解析器得到 25 次真实查询,没有缓存来撑高数据。
GRC V2 就反着来:它有意同时测量缓存和未缓存的性能,并将两者融合成一个单一的、能反映抖动的评分,它的合理之处在于,现实中浏览网页时会不断命中缓存。AdGuard 在我的脚本中排到了第一,并不是因为 AdGuard 是我测试过的最快 DNS。而是因为 AdGuard 在冷查询方面最快,这并没有乍一看那么惊艳。
那么,这些结果中我到底应该相信哪一个?
综合以上所有情况,再加上测试方法上的差异,并不意味着这三个 DNS 测试哪个是错的。真正需要关注的是你用的是什么连接和协议,以及冷查询性能还是缓存平均值更重要。
考虑到大多数人不会每天不断清除 DNS 缓存,缓存后的平均分更重要。
由于前面提到的原因,我们不用Vercara,那就只剩Quad9和AdGuard了。因为我之前用过Quad9,一直觉得它性能不错,看来我还是得用回Quad9。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.