为什么 DNS 仍然难以学习?

2023年 8月 13日 32.7k 0

我经常写关于我发现难以学习的技术的文章。不久前,我的朋友 Sumana 向我提出了一个有趣的问题 - 为什么这些东西学起来那么难?为什么它们看起来如此神秘?

以 DNS 为例。我们从 80 年代 开始使用 DNS(已经超过 35 年了!)。它在互联网上的每个网站中都使用。而且它相当稳定 - 在很多方面,它的工作方式与 30 年前完全相同。

但是我花了好几年的时间才弄清楚如何自信地调试 DNS 问题,我也见过很多其他程序员在调试 DNS 问题上苦苦挣扎。那么到底发生了什么呢?

以下是关于为什么学习排除 DNS 问题很困难的几点思考。

(我不会在这篇文章中详细解释 DNS,更多关于 DNS 如何工作的信息,请参阅 《用一个周末实现一个 DNS》 或 我的 DNS 方面的博文)

并不是因为 DNS 非常难

当我最终学会如何排除 DNS 问题时,我的反应是“什么,就这样吗???这并不难!”我感觉有点被骗了!我可以在 几个小时 内向你解释关于 DNS 令我感到困惑的一切事情。

那么 - 如果 DNS 并不是那么复杂,为什么我花了这么多年的时间才弄清楚如何排除相当基本的 DNS 问题(比如“即使我已经正确设置了,我的域名仍无法解析”或者“dig 命令和我的浏览器的 DNS 结果不一致,为什么?”)?

而且,在发现 DNS 学习困难方面,我并不孤单!我与许多经验丰富的程序员朋友讨论过多年来的 DNS 问题,其中很多人要么:

  • 不敢轻易对其网站进行简单的 DNS 更改
  • 或对 DNS 工作原理的基本事实感到困惑(比如记录是 拉取的而非推送的)
  • 或对 DNS 基础知识了解得很好,但却和我一样存在一些知识盲点(负缓存和 dig 命令及浏览器如何以不同方式进行 DNS 查询的细节)

因此,如果我们都面临着 DNS 的相同困扰,到底发生了什么?为什么对许多人来说学习 DNS 如此困难?

以下是我的一些看法。

很多系统是隐藏的

当你在计算机上发起 DNS 请求时,基本的过程如下:

  • 你的计算机向一个名为“解析器”的服务器发起请求。
  • 解析器检查其缓存,并向一些称为“权威名称服务器”的其它服务器发起请求。
  • 以下是你看不到的一些内容:

    • 解析器的缓存。里面有什么内容?
    • 在你的计算机上进行 DNS 请求的库代码是哪个(是否是 libc 的 getaddrinfo 函数?如果是,它是来自 glibc、musl 还是苹果?是你的浏览器的 DNS 代码吗?还是其他自定义的 DNS 实现?)所有这些选项的行为略有不同,并且有不同的配置、缓存方法、可用功能等等。例如,musl DNS 直到 2023 年初 才支持 TCP。
    • 解析器与权威名称服务器之间的对话。如果你能够神奇地获得一个准确记录你的请求期间向下游查询的每个权威名称服务器以及它们的响应的追踪,我认为很多 DNS 问题将变得非常简单。(比如,如果你能运行 dig +debug google.com 并获得一些额外的调试信息会怎么样?)

    如何和隐藏系统打交道

    以下是几个处理隐藏系统的方法:

    • 向人们传授隐藏系统的知识会产生重大影响。很长一段时间里,我不知道我的计算机有多个不同的 DNS 库,它们在不同情况下使用,我对此感到困惑了好几年。这是我的重要排错方法。
    • 通过 Mess With DNS,我们尝试了一种“鱼缸”的方法,展示了通常隐藏的系统(与解析器和权威名称服务器的对话)的一些部分。
    • 我觉得将 DNS 扩展以包括一个“调试信息”部分会非常酷。(注:似乎这已经有了!它被称为“扩展 DNS 错误”,即 EDE,各种工具正在逐渐添加对它的支持。)

    扩展 DNS 错误看起来不错

    扩展 DNS 错误是 DNS 服务器提供额外调试信息的一种新方式。以下是一个示例:

    $ dig @8.8.8.8 xjwudh.com
    ;; Got answer:
    ;; ->>HEADERHEADERHEADERHEADER

    相关文章

    服务器端口转发,带你了解服务器端口转发
    服务器开放端口,服务器开放端口的步骤
    产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
    如何使用 WinGet 下载 Microsoft Store 应用
    百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
    百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

    发布评论