扒一扒 DNS 的前世今生

今天给大家科普一下关于DNS的相关知识,讲一讲一个网址背后发生的一些故事。

简单来说,DNS(域名系统)就是域名和各种数据之间的一个映射表。最常见的映射就是把像 chatgpt.com 这样的域名转换成电脑能懂的IP地址。

当你把 chatgpt.com 敲进浏览器时,DNS 就会出马,找到并返回这个域名绑定的 IP 地址:

图片

当然啦,这背后发生了很多事。在这篇文章里,我们就来扒一扒它到底是怎么运作的。

我希望这篇文章能比 ChatGPT 或者 DeepSeek 讲得还好懂,要是连它们都能写得比我好,那我就太失败了!

好了,闲话少说,咱们开始吧。

DNS 诞生之前

在深入 DNS 之前,咱先看看它出现之前是啥情况。

在 80 年代现代互联网出现之前,有个叫ARPAnet的玩意儿。它是当时第一个分组交换网络,算是现代互联网的老祖宗。

ARPAnet 用一个叫HOSTS.TXT的文件,把服务器的域名和网络地址(也就是 IP 地址)对应起来。

这个文件大概长这样:

复制
# 官方 ARPANET 主机表 (hosts.txt) # 格式:<IP 地址> <主机名> [别名] # [注释] 10.0.0.6 mit-ai # MIT 人工智能实验室 10.0.0.7 sri-nic # SRI 网络信息中心 10.0.0.11 ucla-seismo # 加州大学洛杉矶分校 地震学系 10.0.0.13 berkeley # 加州大学伯克利分校 10.0.0.14 stanford # 斯坦福大学 # 别名 (可选项,跟在主机名后面) 10.0.0.6 mit mit-ai1.2.3.4.5.6.7.8.9.10.11.

这个“主” HOSTS.TXT 文件就一份,由斯坦福研究所 (SRI) 独家维护。这慢慢就出问题了,为啥呢?

流量和服务器压力山大:所有设备都得找 SRI 的服务器查名字,SRI 服务器快被压垮了。名字撞车越来越频繁:网络变大了,大家想用的好名字就那些,冲突越来越多。文件变得巨胖:文件大小涨到了 100-200KB。现在看这点数据不算啥,但在 80 年代的基础设施条件下,这已经是个大瓶颈了。

这些问题可太要命了,直接催生了 DNS 的诞生。

DNS登场

DNS 架构

DNS (域名系统)最好理解成一个分布式的和层次化的系统。

啥意思呢?

分布式:意思是 DNS 运行在好多台互相连接的服务器(也就是 DNS 服务器)上。层次化:DNS 组织成一个树状结构,上面的服务器管着下面的服务器。等会儿讲到 DNS 区域时再细说。DNS 记录

现在我们知道了,DNS 就是一堆服务器按树状结构组织起来,互相通信。那这些服务器存啥呢?

DNS 服务器存的就是DNS 记录。看个例子:

复制
# DNS 记录结构 # 域名 TTL(秒) 类别 类型 数据 example.com. 3600 IN A 93.184.216.34 www.example.com. 3600 IN CNAME example.com. example.com. 3600 IN MX 10 mail.example.com. mail.example.com. 3600 IN A 93.184.216.50 example.com. 3600 IN TXT "hello world"1.2.3.4.5.6.7.

来详细掰扯掰扯每个字段是啥意思:

域名:就是互联网上的域名,比如 chatgpt.com。注意结尾那个点 . 表示根域(通常可以省略)。TTL:生存时间(单位秒)。意思是这个记录你能在本地缓存多久,过期了就得去问权威服务器要新的。类别:这玩意儿基本总是IN,代表“互联网” (Internet)。还有别的类,像CH或HS,但现在基本不用了。类型:代表这条记录存的是哪类数据。最常见的类型有:

A:代表一个IPv4 地址。

AAAA:代表一个IPv6 地址。

CNAME:意思是规范名称,就是给另一个域名起个别名。

MX:邮件交换器,指定谁来收这个域名的邮件(后面跟优先级,数字越小越优先)。

TXT:文本记录,可以存任意文本(比如验证信息、安全策略啥的)。

数据:你要查的那个信息的真身。具体是啥完全取决于类型字段。

DNS 区域

还记得我们说 DNS 是个大树吗?

那么,一个 DNS 区域就可以代表整棵树、树的一个分支、或者树里的一个节点。

在下面的示意图里,我圈出了两个分支,标为区域1和区域2。不过区域怎么划分其实挺随意的。

图片

关键点在于:位于一个区域根部的那个 DNS 服务器,负责管理它下面的所有服务器。比如,example.com 这个服务器就管着 hello 和 world(如果它们是子域的话)。

DNS 服务器

“DNS 服务器”这个词用得很宽泛,这也是我学 DNS 时最晕乎的地方之一。

简单说,任何运行 DNS 软件的服务器都可以叫 DNS 服务器。但有四种核心角色你必须知道:

权威域名服务器:这些服务器存着它们负责的DNS 区域里所有域名的官方 DNS 记录。比如 .com 的权威服务器就存着所有以 .com 结尾网站的记录。递归解析器:一个专门帮客户(比如你的电脑)查找 DNS 信息的程序,还会把结果缓存起来。比如客户说“我要访问 www.example.com”,递归解析器就把复杂的查询过程全包了,最后直接给你返回 example.com 的正确 IPv4 地址(A 记录)。你的路由器或 ISP(像电信、联通)提供的 DNS 服务器通常就干这个活。缓存服务器:专门用来存之前查过的 DNS 结果,这样下次再问就能飞快地给答案。转发器:它自己不去查,而是把收到的 DNS 查询请求 转给另一个能查的服务器(通常就是个递归解析器)去处理。

一台物理上的 DNS 服务器可以同时干好几样活。比如,一个递归解析器通常也自带缓存功能(也就是缓存服务器)。

DNS 查询实例

术语讲够了,让我们看个动图(脑补一下)!看看这一切是怎么配合工作的,举个栗子🌰:一个客户端第一次查询 hello.world.com 的 IP 地址(A 记录)。

图片

请求内容是:A hello.world.com? (意思就是:hello.world.com 的 IP 是啥?)

注意:存根解析器(Stub Resolver)不算真正的 DNS 服务器,它就是你电脑操作系统里一个简单的 DNS 客户端,负责跟你配置的 DNS 服务器(通常是路由器或 ISP 的)对话。路由器这时通常就扮演转发器的角色。

接下来,就要进行递归 DNS 查询了。过程大概是这样的:

客户端问路由器/本地DNS:“嘿,hello.world.com 的 IP 是啥?” (本地没缓存)。本地DNS(递归解析器)开始干活:先看看自己缓存里有没有,没有。跑去问根域名服务器:“.com 该找谁管啊?”根服务器回复:“.com 的事归这些 TLD 服务器(顶级域服务器)管,地址是 X.X.X.X”。问 .com TLD 服务器:“world.com 该找谁管啊?”.com TLD 服务器回复:“world.com 归这些权威服务器管,地址是 Y.Y.Y.Y”。问 world.com 权威服务器:“hello.world.com 的 IP 是啥?”world.com 的权威服务器回复:“在这儿呢,hello.world.com 的 A 记录是143.54.1.8”。结果返回与缓存:递归解析器拿到最终答案 143.54.1.88,开心地把它返回给客户端(一路经过路由器)。这个结果会一路被缓存:ISP 的解析器会缓存它,你的路由器(如果支持)也可能会缓存,你的电脑操作系统也会缓存。缓存多久?看记录的 TTL 值,通常几小时到几天不等(比如 1 到 72 小时)。连接建立:客户端浏览器拿到 IP 地址 143.54.1.88,终于可以向这个地址发送 HTTP 请求加载网页了。

图片

结语

DNS 这玩意儿挺绕的,倒不是因为它本身多难,而是因为要搞懂的东西实在有点多。

即使有了这些概念解释和实例演示,我们也只是掀开了 DNS 世界的一角。它在现实世界中能干的事和带来的影响,远比我们这里讲的要丰富和深远得多。

THE END
本站服务器由亿华云赞助提供-企业级高防云服务器