DNS 之前靠 hosts 文件:每台机器一份,手工维护。 网络一大就维护不动了,于是改成「分层 + 分布式」的结构。
5.2.1 讲了「需要名字」,这一节讲「名字系统怎么来的」。 2.1.x 的历史里提过 ARPANET,DNS 的演化也是那段历史的一部分。
一、hosts 文件时代
最早的「域名解析」就是查一个文本文件:一行一个对应关系,名字在前、IP 在后。 ARPANET 早期,这个文件由一个人维护,定期发给所有人。
| 项 | hosts 文件 | DNS |
|---|---|---|
| 存在哪 | 每台机器一份 | 分层服务器 |
| 谁维护 | 本机管理员 | 各级机构 |
| 更新多快 | 手工,可能拖几天 | 几分钟到几小时 |
| 能撑多大 | 几十台到几百台 | 全球 |
第三行是致命伤:每加一台机器,就要通知所有人改文件。 在几十台机器时还行,到几千台就彻底失控了。 第四行更根本: 文件是「全量复制」,而网络是「部分可知」——你不可能让每台机器都存下全世界的主机名。
二、为什么必须分布式
三个理由,一个比一个硬:
| 理由 | 说明 | 后果 |
|---|---|---|
| 数据量 | 全球域名上亿 | 一个文件存不下 |
| 更新频率 | 每天几十万次变更 | 没法全量同步 |
| 查询量 | 每秒上千万次 | 一台机器扛不住 |
第一行和第二行是「存储与一致性问题」,第三行是「性能问题」。 三个问题叠在一起,只剩一条路:分层 + 授权。 所谓「授权」就是: 根服务器不管具体域名,只记「.com 归谁管」;.com 的服务器只记「baidu.com 归谁管」。 每一层只知道自己那一段,查询时一层层往下问。
三、分层结构长什么样
三层就够用了:
| 层级 | 存什么 | 数量 |
|---|---|---|
| 根 | 所有顶级域在哪儿 | 13 个地址 |
| 顶级域 | 自己下面有哪些域 | 上千个 |
| 权威 | 某个域的具体记录 | 上亿 |
第一行「13 个地址」是任播撑起来的:地址只有 13 个,但实例有上千个, 所以「根服务器被打垮」这件事比听起来难得多。 第三行「权威」才是真正存答案的地方:前面两层只负责「指路」, 所以「改一条 A 记录」只需要改权威服务器,前面都不用动。
四、动手 Demo:域名解析之前,先看两个地方
系统找地址的顺序是「先 hosts、后 DNS」,这一节把两个地方都读出来。 注意 hosts 文件里真正生效的行数往往很少。
import os
hp = os.path.join(os.environ['SystemRoot'], 'System32',
'drivers', 'etc', 'hosts')
live = [x for x in open(hp, encoding='utf-8', errors='ignore')
if x.strip() and not x.startswith('#')]
print(len(live))
实跑输出:
--------------------------------------------------------------------
域名解析之前,先看两个地方
--------------------------------------------------------------------
**系统找地址的顺序是固定的**:**先查 hosts 文件,再问 DNS 服务器。**
**hosts 优先,这是很多人「改了不生效」的原因。**
**本机的 hosts 路径是 C:\windows\System32\drivers\etc\hosts**
**文件 22 行,其中真正生效的只有 0 行**
**再看 DNS 服务器是谁**:
**e93f%17**
**192.168.3.1**
**这两个地方的分工很清楚**:
**hosts 是「本地的小抄」,只影响这台机器;DNS 是「公共的电话簿」,影响所有人。**
**所以「临时把一个域名指到测试机」用 hosts,「让全公司都能访问」必须改 DNS。**
hosts 文件优先于 DNS,这是很多人「改了不生效」的原因: 你以为在查 DNS,其实系统先在本地小抄里找到了答案。 所以排查解析问题时,第一件事就是看 hosts。 「文件几十行、生效的只有几行」这个对比也有意义:大部分行是注释(以 # 开头), 是历史遗留和示例说明,真正生效的往往一条都没有。 第二张表读的是 DNS 服务器地址:它一般就是网关(家用路由器), 由路由器再向上游运营商的 DNS 转发。 所以「本机 DNS 配错」和「路由器 DNS 配错」都会导致同样的问题,但排查位置完全不同。
30 秒实验
- 想一下:为什么 hosts 文件不可能替代 DNS?
- 想一下:hosts 优先于 DNS,这个顺序有什么好处和坏处?
- 算一下:如果全球有 2 亿个域名,一个文件每行 40 字节,文件多大?
常见误区
- 以为「DNS 从一开始就有」。 先是 hosts 文件,1980 年代才改成分布式。
- 以为「hosts 已经没用了」。 还有用,本地开发、临时绕过、屏蔽广告都靠它。
- 以为「DNS 是一台大服务器」。 是成千上万台,分层授权、各管一段。
自测三问(点开对答案)
1. DNS 之前靠什么解析名字? —— **hosts 文件**,每台机器一份,手工维护。 2. 为什么必须改成分布式? —— **数据量太大、更新太频繁、查询量太高**,单点存不下也扛不住。 3. DNS 的三层结构是什么? —— **根、顶级域、权威**,每层只管自己那一段。下一节拆开一个域名,看它的层级怎么读。
- ☐ (本节完,下一节 5.2.3 域名的构成)