我是一名有着 15 年经验的业余程序员,虽未在像 V2EX 这样的专业平台与大家以代码会友,但我也认真研究了您的源代码。在此,我想先谈谈对您作品`dns-bechmark`的一些看法。
您的`dns-bechmark`作品是这样运行的:它以`dnspyre`(目前 star 数为 124 的 DNS 压力测试工具,
https://github.com/Tantalor93/dnspyre )为核心,通过 Go 语言调用外部`dnspyre`命令。这个工具会对自行收集的 DNS 服务器列表进行测试,测试时利用世界排名较靠前的 1000 个域名(
https://github.com/Tantalor93/dnspyre/blob/master/data/1000-domains )进行并发解析。在这个过程中,`dnspyre`会输出测试的 json 结果,您的作品会解析这些结果,并结合自身的评分体系对 DNS 服务器进行评分,同时使用 GEOCODE 分类,最终生成结果 json 文件。最后通过 Web 前端读取结果,并按照评分高低进行可视化展示。
不过,这个作品存在一些问题。
首先是关于评分算法与网络性能相关的问题。作为核心的压力测试工具`dnspyre`,其本身无法规避网络性能问题。您在评分算法中设置的`LatencyRangeMax`、`LatencyRangeMin`、`LatencyFullMarkPoint`这三个算子都和网络延时密切相关。这就导致了按照您的算法,像 1.1.1.1 这样的 DNS 服务器得分远低于 223.5.5.5 ,但这与实际情况并不相符。
其次,使用`dnspyre`对公共 DNS 进行高频查询存在问题。暂且不考虑这种行为是否符合道德规范,这种高频查询会浪费公共资源。而且当单 IP 高频次查询达到一定程度时,必然会触发 DNS 服务商的防火墙,这会进一步影响评分算法的结果。
再者,您的评分算法只考虑了`errorRate`,却没有考虑解析结果的准确性,也没有考虑诸如 DNS 劫持等情况。我们都知道,在国内由于一些特殊原因,查询 Google 、Facebook 等域名时,即使局域网内配置了旁路由进行 IP 分流/cache ,RTT 几乎都是 1ms ,但这显然不符合真实的网络解析情况。
最后,在对 DNS 服务器地址使用`net.LookupIP(server)`进行解析并返回 geo code 进行分类时也有问题。因为`net.LookupIP`本身会依赖系统的 resolver 进行解析,也就是会依赖系统默认的 DNS 。然而很多公共 DNS 是在多国部署的,这样做会导致地区分类不准确。
总结来说,您的`dns-bechmark`作品有其亮点。您精心收集了全球很多 DNS 服务器,并利用`dnspyre`进行压力测试,最后将结果汇聚并进行了可视化展示,界面还算美观,这在一定程度上可以为本地优选服务器提供参考。但需要注意的是,如前文所述,影响评分结果的主要因素是网络延时,所以这个结果只能体现本地到“世界 DNS”的性能,仅对本地网络有参考价值,缺乏分享和对比价值。毕竟,通常情况下速度最快的 DNS 往往是本地宽带运营商提供的。此外,您的评分只考虑了 QPS 、延时、错误率等指标,没有对解析结果、应用层 RTT 等结果进行校验,这就可能导致得分最高的 DNS 服务器未必能提供最好的解析结果。还有一点,鉴于您的作品并非 100%原创,尤其是核心的`bechmark`程序`dnspyre`,希望您能在 README 文件中对`dnspyre`进行相关引用并致谢,这符合开源社区的礼仪规范。
--- 感谢豆包对人类回复进行了润色 ---