📚 第五章 IP协议相关技术
📄 一句话概括

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 秒实验

  1. 想一下:为什么 hosts 文件不可能替代 DNS?
  2. 想一下:hosts 优先于 DNS,这个顺序有什么好处和坏处?
  3. 算一下:如果全球有 2 亿个域名,一个文件每行 40 字节,文件多大?

常见误区

  1. 以为「DNS 从一开始就有」。 先是 hosts 文件,1980 年代才改成分布式。
  2. 以为「hosts 已经没用了」。 还有用,本地开发、临时绕过、屏蔽广告都靠它。
  3. 以为「DNS 是一台大服务器」。 是成千上万台,分层授权、各管一段。
自测三问(点开对答案) 1. DNS 之前靠什么解析名字? —— **hosts 文件**,每台机器一份,手工维护。 2. 为什么必须改成分布式? —— **数据量太大、更新太频繁、查询量太高**,单点存不下也扛不住。 3. DNS 的三层结构是什么? —— **根、顶级域、权威**,每层只管自己那一段。

下一节拆开一个域名,看它的层级怎么读。

相关笔记