DNS 域名解析 · 计算机网络
shop.example.com 这样的名字是怎么变成地址的?
课程目录为什么需要它
人用名字,网络用数字。DNS 是互联网的电话簿,负责把名字翻译成数字,你发出的几乎每个请求都要经过它。工程师之间有句玩笑「问题总出在 DNS」,因为太多故障都是从这里开始的。
直觉理解
访问 shop.example.com 时,你的电脑会问 DNS 解析器:「这个名字的 A 记录是什么?」答案是一个 IPv4 地址,附带一个 TTL,表示这个答案可以缓存多久。
常见的记录类型:
| 类型 | 把名字映射到…… |
|---|---|
| A | 一个 IPv4 地址 |
| AAAA | 一个 IPv6 地址 |
| CNAME | 另一个名字(别名) |
| MX | 这个域名的邮件服务器 |
| TXT | 任意文字,常用来证明你拥有某个域名 |
在终端里,dig 域名 直接向 DNS 提问,curl 网址 发出一个 HTTP 请求。
定义
DNS 记录
One entry in DNS: a name, a type (A, CNAME, MX…), a value and a TTL.DNS 里的一条记录:名字、类型(A、CNAME、MX……)、值和 TTL。
TTL 生存时间
Time to live: how many seconds a resolver may cache an answer. After changing a record, old answers can linger until the TTL runs out.生存时间:解析器可以缓存这个答案多少秒。改了记录之后,旧答案可能会一直存在,直到 TTL 用完。
示例
先问 DNS,再问服务器
在互动课里运行dig 查到地址;curl 取回网页。
dig +short shop.example.com
dig shop.example.com
curl https://shop.example.com逐步执行
- L1+short 只打印答案。
203.0.113.10 - L2完整的答案:名字、TTL(300 秒)、类型 A、地址。
- L3知道地址后,HTTP 请求返回了网页。
<h1>Shop</h1>
一个不存在的名字
在互动课里运行名字打错了:DNS 里没有记录,curl 连开始都开始不了。
dig +short shopp.example.com
curl https://shopp.example.com这个例子故意以报错结束:重点是学会读报错信息。
逐步执行
- L1什么答案都没有。
- L2Could not resolve host:问题出在 DNS,不在服务器。
常见错误
以为修改会立刻生效
改了记录之后,解析器会一直用旧答案,直到 TTL 过期。计划迁移前一天先把 TTL 调低。
先怪服务器
「Could not resolve host」说明 DNS 失败了;根本还没联系到服务器。重启任何东西之前,先用 dig 检查名字。
小测验
1. 哪种记录类型把 www.example.com 指向另一个名字 example.com?
查看答案
答案:A
CNAME 是别名:一个名字指向另一个名字。
2. 这段代码会输出什么?
dig +short api.example.com
dig +short mail.example.com查看答案
答案:A
每个名字都有自己的 A 记录。
动手练习
3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。
- 预测输出读出答案
准确写出这些命令打印的内容。
- 改需求修好拼写错误
这个健康检查在到达服务器之前就失败了。找出原因,修好命令,让它打印健康检查的 JSON。
- 从零写先查再取
打印
shop.example.com的地址(只要地址),然后用curl -I只获取https://shop.example.com的响应头。
本课术语
| 术语 | 中文 | 英文定义 |
|---|---|---|
| DNS | 域名系统 | The system that turns names like example.com into IP addresses. |
| Resolver | 解析器 | The DNS server that looks names up for your computer. |
| TTL | 生存时间 | How long an answer may be cached. |