为什么敲几个字母就能访问网站?DNS原理大揭秘
你有没有想过一个问题:为什么输入"baidu.com"就能打开百度?
今天,我用查字典的故事,来讲讲DNS到底在做什么。
原文地址
DNS是干嘛的?
想象一下,你想知道某个同学的电话号码。
有两种方式:
- 直接记住:你把全班同学的电话号码都背下来
- 查通讯录:你不知道,但你可以查学校的通讯录
显然,第二种更现实。
互联网也是一样的:
-
IP地址:就像电话号码,比如
112.80.248.76 -
域名:就像人名,比如
baidu.com
你不可能记住所有网站的IP地址,但你可以记住域名。
DNS(Domain Name System,域名系统)就是互联网的"通讯录"——它负责把域名翻译成IP地址。
域名是怎么组成的?
先来看看www.baidu.com这个域名:
www.baidu.com
│ │ │
│ │ └──── .com 是顶级域名
│ └───────── baidu 是二级域名
└─────────────── www 是三级域名
域名层级
-
根域名:
.(那个隐藏的点) -
顶级域名:
.com、.cn、.org、.edu -
二级域名:
baidu、taobao、google -
三级域名:
www、mail、blog
就像地址一样:
中国 → 北京市 → 海淀区 → 中关村大街1号
. → .cn → .beijing → .zhongguancun
DNS是怎么工作的?
你输入baidu.com,浏览器是怎么找到服务器的?
让我用查字典的故事来解释:
想象一下查字典
你想查"百度"这个词的意思:
- 先翻记忆(浏览器缓存):上次好像在哪儿见过?
- 翻家里的小本子(操作系统hosts):上次记在笔记本上了
- 问老师(本地DNS服务器):我们学校有本字典能查
- 老师问校长(根DNS服务器):这个词太长了,得分头查
- 校长查索引(顶级域名服务器):.com开头的词都归.com部门管
- 最后查到(权威DNS服务器):找到了!这个词的意思是"IP 112.80.248.76"
这就是DNS查询的全过程!
更直观的流程图
你输入 baidu.com
│
▼
┌───────────────────┐
│ 1. 浏览器缓存 │ 有?直接用
└─────────┬─────────┘
│ 没有
▼
┌───────────────────┐
│ 2. 操作系统缓存 │ 有?直接用
└─────────┬─────────┘
│ 没有
▼
┌───────────────────┐
│ 3. 本地DNS服务器 │
│ (114.114.114.114)│
└─────────┬─────────┘
│
▼
一级一级往下问
│
┌─────┴─────┐
▼ ▼
根DNS .com DNS
│ │
│ ▼
│ baidu.com DNS
│ │
└─────┬─────┘
│
▼
┌───────────────────┐
│ 返回IP: 112.80.248.76 │
└───────────────────┘
│
▼
浏览器访问这个IP
每个步骤具体做什么?
| 步骤 | 谁在做 | 做了什么 |
|---|---|---|
| 1 | 浏览器 | 检查最近访问过的域名缓存 |
| 2 | 操作系统 | 检查hosts文件 |
| 3 | 本地DNS | 运营商的DNS服务器,帮你递归查询 |
| 4 | 根DNS服务器 | 负责.和顶级域名(.com、.cn) |
| 5 | 权威DNS | 域名所有者自己的DNS(百度公司) |
整个过程可能只需要几十毫秒,你根本感觉不到!
DNS缓存:不用每次都问
上面的流程看起来很复杂,但因为DNS缓存无处不在,实际上很少走完完整流程:
- 浏览器缓存:几分钟到几小时
- 操作系统缓存:Windows、macOS会缓存更久
- 路由器缓存:你家路由器也可能缓存
- 运营商缓存:运营商的DNS服务器会缓存
所以第一次访问baidu.com可能慢一点,之后就快了。
DNS记录类型:不止A记录
DNS不只是存IP地址,还有很多类型:
| 类型 | 作用 | 例子 |
|---|---|---|
| A记录 | 域名 → IPv4 |
baidu.com → 112.80.248.76
|
| AAAA记录 | 域名 → IPv6 |
baidu.com → 240e:ff:e020:9e::100
|
| CNAME | 域名 → 另一个域名 |
www.baidu.com → www.a.shifen.com
|
| MX记录 | 域名 → 邮件服务器 |
@baidu.com → mx.baidu.com
|
| TXT记录 | 存放文本信息 | 用来验证域名所有权 |
| NS记录 | 指定域名由哪个DNS服务器解析 |
baidu.com → dns.baidu.com
|
CNAME的好处
www.baidu.com其实指向了www.a.shifen.com。
这就是CNAME——别名。
百度可以随时把www.baidu.com指向新的IP,只需要改一下CNAME,用户不需要记住新IP,体验不变。
DNS有什么问题?
DNS很棒,但不是完美的。
1. DNS污染
有些运营商或防火墙会篡改DNS结果。你输入google.com,返回了错误的IP——你访问不了Google,或者访问了假网站。
这叫DNS污染(DNS Spoofing)。
2. DNS劫持
黑客黑掉你的路由器或DNS服务器,故意返回错误的IP——你以为是访问银行,实际上是钓鱼网站。
这叫DNS劫持(DNS Hijacking)。
3. 隐私问题
DNS查询是明文的,你的运营商知道你访问了哪些网站。
怎么解决?——DNS over HTTPS
既然DNS有问题,那就加密!
DoH(DNS over HTTPS)
把DNS查询伪装成HTTPS请求,就像普通的网页请求一样。
别人看到了HTTPS请求,但不知道你在查DNS。
DoT(DNS over TLS)
用TLS加密DNS查询,更加安全。
公共DNS
除了运营商的DNS,还有一些公共DNS:
-
Google DNS:
8.8.8.8、8.8.4.4 -
Cloudflare DNS:
1.1.1.1、1.0.0.1
这些公共DNS通常更快、更安全、不劫持。
总结:DNS做了什么?
| 步骤 | 做了什么 |
|---|---|
| 1. 输入域名 | baidu.com |
| 2. 查缓存 | 浏览器、操作系统、路由器有没有记录? |
| 3. 递归查询 | 根服务器 → .com服务器 → baidu.com DNS |
| 4. 返回IP | 112.80.248.76 |
| 5. 访问服务器 | 浏览器向这个IP发起HTTP请求 |
写在最后
现在你应该懂了:
- DNS = 互联网的"通讯录",把域名翻译成IP
- A记录 = 域名→IP的对应关系
- CNAME = 别名,让换IP更容易
- DNS缓存 = 各地都有小本本,不用每次都查
- DoH/DoT = 加密查询,更安全
下次你输入baidu.com的时候,记得——这背后有一群DNS服务器在帮你"查号"呢。