为什么敲几个字母就能访问网站?DNS原理大揭秘

10 阅读5分钟

你有没有想过一个问题:为什么输入"baidu.com"就能打开百度?

今天,我用查字典的故事,来讲讲DNS到底在做什么。


原文地址

墨渊书肆/为什么敲几个字母就能访问网站?DNS原理大揭秘


DNS是干嘛的?

想象一下,你想知道某个同学的电话号码。

有两种方式:

  1. 直接记住:你把全班同学的电话号码都背下来
  2. 查通讯录:你不知道,但你可以查学校的通讯录

显然,第二种更现实。

互联网也是一样的:

  • 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
  • 二级域名baidutaobaogoogle
  • 三级域名wwwmailblog

就像地址一样:

中国 → 北京市 → 海淀区 → 中关村大街1号
.     →   .cn  →  .beijing →  .zhongguancun

DNS是怎么工作的?

你输入baidu.com,浏览器是怎么找到服务器的?

让我用查字典的故事来解释:

想象一下查字典

你想查"百度"这个词的意思:

  1. 先翻记忆(浏览器缓存):上次好像在哪儿见过?
  2. 翻家里的小本子(操作系统hosts):上次记在笔记本上了
  3. 问老师(本地DNS服务器):我们学校有本字典能查
  4. 老师问校长(根DNS服务器):这个词太长了,得分头查
  5. 校长查索引(顶级域名服务器):.com开头的词都归.com部门管
  6. 最后查到(权威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记录域名 → IPv4baidu.com112.80.248.76
AAAA记录域名 → IPv6baidu.com240e:ff:e020:9e::100
CNAME域名 → 另一个域名www.baidu.comwww.a.shifen.com
MX记录域名 → 邮件服务器@baidu.commx.baidu.com
TXT记录存放文本信息用来验证域名所有权
NS记录指定域名由哪个DNS服务器解析baidu.comdns.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 DNS8.8.8.88.8.4.4
  • Cloudflare DNS1.1.1.11.0.0.1

这些公共DNS通常更快、更安全、不劫持。


总结:DNS做了什么?

步骤做了什么
1. 输入域名baidu.com
2. 查缓存浏览器、操作系统、路由器有没有记录?
3. 递归查询根服务器 → .com服务器 → baidu.com DNS
4. 返回IP112.80.248.76
5. 访问服务器浏览器向这个IP发起HTTP请求

写在最后

现在你应该懂了:

  • DNS = 互联网的"通讯录",把域名翻译成IP
  • A记录 = 域名→IP的对应关系
  • CNAME = 别名,让换IP更容易
  • DNS缓存 = 各地都有小本本,不用每次都查
  • DoH/DoT = 加密查询,更安全

下次你输入baidu.com的时候,记得——这背后有一群DNS服务器在帮你"查号"呢。