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

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

  1. 算一下:一个 IP 有几个字符?一个典型域名呢?
  2. 想一下:为什么「域名比 IP 好记」不能只用长度解释?
  3. 想一下:同一个域名对应多个 IP,好处和坏处各是什么?

常见误区

  1. 以为「域名就是 IP 的别名」。 是两套体系,一个给人用,一个给机器用,多对多。
  2. 以为「域名越长越难记」。 关键在有没有含义,www.abc.com 比 10.20.30.40 好记得多。
  3. 以为「域名解析结果固定」。 会变,按地区、按时间、按负载都可能不同。
自测三问(点开对答案) 1. IP 地址的两个难处是什么? —— **记不住、会变**。 2. 域名为什么比 IP 好记? —— **因为它有含义、有层级**,不是一串无结构的数字。 3. 名字和地址的关系是一对一吗? —— **不是,是多对多**:一个名字可对应多个地址,一个地址也可承载多个名字。

下一节讲 DNS 是怎么长出来的:从 hosts 文件到分布式系统。

相关笔记