IP 地址难记,而且会变,所以需要「名字」这层抽象。 名字和地址的分离,让「换机器不用通知用户」变成了可能。
5.1 说 IP 不管「名字变地址」,这一节讲为什么需要名字。 5.2.2 讲这个「名字系统」是怎么长出来的。
一、两个具体的难处
第一个难处是「记不住」:四段数字没有含义、没有节奏、还容易记混。 第二个难处更要紧:地址会变。
| 场景 | IP 会怎样 | 名字会怎样 |
|---|---|---|
| 换机房 | 整段换掉 | 不变 |
| 加 CDN | 按地区不同 | 不变 |
| 做容灾 | 故障时切走 | 不变 |
三行都是「地址必须变」的场景:如果用户直接记 IP,每一次变更都要通知所有人。 而有了名字,用户只看名字,背后怎么换是他的事。 这就是「间接层」的价值:计算机里几乎所有「解耦」都是加一层间接。
二、名字该长什么样
好的名字有三个特征:有含义、有层级、能扩展。 域名恰好三条都占了。
| 特征 | 域名的做法 | 好处 |
|---|---|---|
| 有含义 | baidu、mail、shop | 看一眼知道是什么 |
| 有层级 | 点分隔,从左到右 | 可以无限加层 |
| 能扩展 | 顶级域可以新增 | 不用改规则 |
第二行「可以无限加层」是有代价的:层级越深,解析要走的路越长。 所以实际域名很少超过四层——「够用就好」比「结构完美」重要。
三、名字和地址是两套东西
一个常见的误解是「域名就是地址的别名」。 更准确的说法是:名字是「给人用的标识」,地址是「给机器用的位置」。
| 项 | 名字 | 地址 |
|---|---|---|
| 给谁用 | 人 | 机器 |
| 会不会变 | 尽量不变 | 经常变 |
| 唯一吗 | 全球唯一 | 同一时刻唯一 |
| 谁管 | 注册商 | 运营商 |
第二行是核心区别:名字追求「永不变」,地址注定「要变」。 所以「把名字解析成地址」这件事必须有一个专门的系统来做——而且这个系统必须能快速更新。 第三行容易被忽略: 同一个域名可以对应多个地址(负载均衡),而同一个地址也可以对应多个域名(虚拟主机)。 所以它们不是「一对一」,是「多对多」。
四、动手 Demo:IP 为什么记不住
把 IP 和域名的字符数摆在一起,再看同一个域名解析出几个地址。 字符数其实差不多,差别在「有没有含义」。
import socket
print(len('192.168.3.152'), len('www.baidu.com'))
ips = {x[4][0] for x in socket.getaddrinfo('www.baidu.com', 80,
socket.AF_INET)}
print(len(ips), sorted(ips))
实跑输出:
--------------------------------------------------------------------
IP 为什么记不住
--------------------------------------------------------------------
**记忆负担是可以量的**:**长度、有没有结构、能不能读出来。**
**IP 三项全输。**
IP 地址 字符数 域名 字符数
------------------------------------------------------
192.168.3.152 13 www.baidu.com 13
110.242.68.66 13 www.qq.com 10
8.8.8.8 7 dns.google 10
**长度其实差不多,差别在「结构」**:
**域名的分段有含义(www 是服务、baidu 是品牌、com 是类型),IP 的四段数字没有任何语义。**
**人能记「有意义的东西」,记不住「一串数」。**
**还有一个更硬的问题:地址会变。**
**同一台服务器的 IP 今天和明天可能不同**,**但域名可以一直不变。**
**所以「用域名」不只是好记,是「换机器不用通知用户」。**
**实测一个「会变」的例子**:
**www.baidu.com 现在解析出 1 个 IPv4 地址**:
**183.2.172.177**
**同一个域名,不同时间、不同地点解析结果都可能不同**——
**这就是「必须有个东西把名字翻成地址」的原因。**
长度差不多这件事本身就说明问题:「记不住」不是长度问题,是「没有结构」的问题。 域名能拆成「www / baidu / com」三段,每段都有意义;IP 拆成四段数字,每段只能靠死记。 第二段的实测结果值得看:同一个域名解析出多个 IPv4 地址, 这就是「一个名字对多个地址」的活例子。 所以「域名解析」不是查表,更像「从一堆候选里挑一个」。 这也解释了「为什么不能把域名写死成 IP」:写死的那一个,可能明天就不在列表里了。 而域名永远指向「当前可用的那一批」。
30 秒实验
- 算一下:一个 IP 有几个字符?一个典型域名呢?
- 想一下:为什么「域名比 IP 好记」不能只用长度解释?
- 想一下:同一个域名对应多个 IP,好处和坏处各是什么?
常见误区
- 以为「域名就是 IP 的别名」。 是两套体系,一个给人用,一个给机器用,多对多。
- 以为「域名越长越难记」。 关键在有没有含义,
www.abc.com比10.20.30.40好记得多。 - 以为「域名解析结果固定」。 会变,按地区、按时间、按负载都可能不同。
自测三问(点开对答案)
1. IP 地址的两个难处是什么? —— **记不住、会变**。 2. 域名为什么比 IP 好记? —— **因为它有含义、有层级**,不是一串无结构的数字。 3. 名字和地址的关系是一对一吗? —— **不是,是多对多**:一个名字可对应多个地址,一个地址也可承载多个名字。下一节讲 DNS 是怎么长出来的:从 hosts 文件到分布式系统。
- ☐ (本节完,下一节 5.2.2 DNS的产生)