DNS域名解析工作原理详解

· 阅读约需16分钟

一、DNS是什么?

DNS(Domain Name System,域名系统)是互联网的一项核心服务。它可以将人们容易记忆的域名(比如 www.baidu.com)转换成计算机能识别的IP地址(比如 180.101.49.11)。

可以把DNS理解成互联网的”电话簿”:

  • 域名 = 人名(好记)
  • IP地址 = 电话号码(机器用)

如果没有DNS,我们访问网站就得记住一长串数字,那可太麻烦了。

1.1 为什么不直接用IP地址?

既然最终都是要访问IP地址,为什么不直接用IP,还要多一层域名解析呢?

原因很简单:

  1. IP地址难记:一长串数字,人脑记不住几个
  2. IP地址可能变:服务器换了IP,用户不用改,只要改DNS解析就行
  3. 一个域名可以对应多个IP:实现负载均衡
  4. 多个域名可以对应同一个IP:虚拟主机技术

二、域名的层级结构

域名不是随便起的,它是有层级结构的,从右到左层级越来越高。

比如 www.baidu.com. 这个域名:

  • . :根域名(最顶层,通常省略不写)
  • com :顶级域名(Top-Level Domain,TLD)
  • baidu :二级域名(我们通常注册的就是这个)
  • www :三级域名(也叫主机名)

2.1 常见的顶级域名

通用顶级域名(gTLD):

  • .com:商业机构(最常用)
  • .org:非营利组织
  • .net:网络服务机构
  • .edu:教育机构
  • .gov:政府机构
  • .io:现在很多科技公司喜欢用

国家顶级域名(ccTLD):

  • .cn:中国
  • .us:美国
  • .jp:日本
  • .uk:英国
  • 等等…

2.2 域名的树状结构

整个DNS系统就像一棵倒过来的树:

  • 最顶端是根域名服务器
  • 下面是顶级域名服务器
  • 再下面是权威域名服务器
  • 最下面是我们的电脑(本地DNS缓存)

三、DNS解析的完整过程

当你在浏览器输入一个网址,按下回车后,DNS解析是这样工作的:

3.1 第一步:查浏览器缓存

浏览器会先检查自己的缓存里有没有这个域名对应的IP地址。

  • 如果有,直接用,解析结束
  • 如果没有,继续下一步

不同浏览器的缓存时间不一样,一般是几分钟到几小时。

3.2 第二步:查系统缓存

浏览器缓存没有,就会问操作系统。

  • 操作系统也有自己的DNS缓存
  • Windows里可以用 ipconfig /displaydns 查看
  • Linux/macOS里的缓存机制各有不同

3.3 第三步:查 hosts 文件

系统缓存也没有,就会去查本地的 hosts 文件。

  • Windows路径:C:\Windows\System32\drivers\etc\hosts
  • Linux/macOS路径:/etc/hosts

这个文件里可以手动配置域名和IP的对应关系,优先级比DNS服务器还高。 我们平时开发调试的时候经常改这个文件。

3.4 第四步:问本地DNS服务器(LDNS)

前面三步都没找到,就会向我们配置的本地DNS服务器发起请求。

这个本地DNS服务器一般是:

  • 运营商自动分配的DNS
  • 或者我们手动设置的,比如 8.8.8.8(Google)、114.114.114.114(国内)

本地DNS服务器也有缓存,如果缓存里有,直接返回。

3.5 第五步:根域名服务器

如果本地DNS服务器也不知道,它就会去问根域名服务器

根域名服务器不会直接告诉你答案,但它会告诉你:”这个.com的域名,你去问.com的顶级域名服务器吧”,然后把.com顶级域名服务器的地址给你。

全球一共有13组根域名服务器(注意是”组”不是”台”,每组都有很多镜像)。

3.6 第六步:顶级域名服务器

本地DNS服务器拿到.com顶级服务器的地址后,就去问它。

.com顶级服务器也不会直接给答案,它会说:”baidu.com这个域名是某某权威服务器管的,你去问它吧”,然后把baidu.com的权威DNS服务器地址给你。

3.7 第七步:权威域名服务器

本地DNS服务器再去问baidu.com的权威DNS服务器。

这次终于问到正主了!权威服务器知道准确答案,直接把对应的IP地址返回给本地DNS服务器。

3.8 第八步:返回结果

本地DNS服务器拿到IP地址后:

  1. 先存到自己的缓存里,下次有人问就直接返回
  2. 然后把结果返回给你的电脑
  3. 你的电脑也存一份缓存
  4. 浏览器拿到IP,就可以建立连接访问网站了

3.9 递归查询 vs 迭代查询

这里有两个重要概念:

递归查询:

  • 就是”你帮我查,查到了告诉我结果”
  • 我们的电脑 → 本地DNS服务器,这是递归查询
  • 本地DNS服务器要负责把整个查询过程做完,最后返回最终结果

迭代查询:

  • 就是”我不知道,但我知道谁可能知道,你去问它”
  • 本地DNS服务器 → 根服务器 → 顶级服务器 → 权威服务器,这是迭代查询
  • 每一步都只返回下一步该问谁,不直接给最终答案

简单说:递归是”替我查到底”,迭代是”给你指条路”。

四、DNS缓存

DNS解析过程这么多步,如果每次都从头查一遍,那也太慢了。所以DNS系统设计了多层缓存机制。

4.1 缓存的层级

从近到远:

  1. 浏览器缓存:最快,但容量小,时间短
  2. 系统缓存:比浏览器大一点
  3. 本地DNS服务器缓存:容量大,缓存时间长
  4. 各级DNS服务器缓存:根、顶级、权威都有缓存

4.2 TTL是什么?

TTL(Time To Live,生存时间)是DNS记录里的一个重要字段,单位是秒。

它告诉各级DNS服务器:”这条记录你可以缓存多久,过了这个时间就过期了,得重新查。”

  • TTL设置得短:更新快,但查询压力大
  • TTL设置得长:查询快,但更新慢

一般网站的TTL会设置成几分钟到几小时。 如果要换服务器IP,得提前把TTL改小,等旧缓存都过期了再切IP,这样影响最小。

五、常见的DNS记录类型

DNS不只是存域名到IP的映射,还有很多种记录类型:

记录类型作用例子
A记录域名 → IPv4地址baidu.com → 180.101.49.11
AAAA记录域名 → IPv6地址baidu.com → 240e:80:1a00:1::1
CNAME记录域名 → 另一个域名www.baidu.com → www.a.shifen.com
MX记录邮件服务器发邮件时找哪个服务器
TXT记录文本说明域名验证、SPF反垃圾邮件
NS记录域名服务器这个域名由哪个DNS服务器管理
PTR记录IP → 域名(反向解析)反查IP对应的域名

5.1 CNAME的作用

CNAME就是域名的别名。

比如你有一个服务器IP,上面跑了好几个网站:

  • blog.example.com
  • shop.example.com
  • www.example.com

你可以把它们都CNAME到同一个主域名上,这样以后换IP了,只要改主域名的A记录就行,不用一个个改。

CDN服务也是用CNAME来实现的,把你的域名解析到CDN服务商的域名上。

六、DNS安全问题

DNS虽然重要,但也有不少安全问题。

6.1 DNS劫持

DNS劫持就是把正常的域名解析到错误的IP地址上。

常见的劫持方式:

  • 运营商劫持:你访问某些网站,跳转到运营商的广告页
  • 路由器被黑:路由器的DNS被篡改,所有设备都中招
  • 恶意软件:改你电脑的DNS设置或者hosts文件
  • 中间人攻击:在网络中间篡改DNS响应

怎么防?

  • 用靠谱的DNS服务器
  • 开启DNSSEC(DNS安全扩展)
  • 定期检查hosts文件和DNS设置
  • 用HTTPS,即使被劫持了也能发现证书不对

6.2 DNS污染

DNS污染(也叫DNS投毒)是一种更隐蔽的攻击方式。

攻击者不直接篡改你的DNS,而是在你查询的时候,抢先返回一个假的结果。因为UDP协议不需要确认,你的电脑收到先到的那个假响应,就信以为真了。

GFW就是用这种方式屏蔽某些国外网站的。

6.3 DNS放大攻击

这是一种DDoS攻击方式:

  • 攻击者伪造受害者的IP地址
  • 向大量开放的DNS服务器发送很小的查询请求
  • DNS服务器会返回比请求大很多的响应
  • 大量的响应都涌向受害者的IP,把带宽撑爆

因为请求小、响应大,有放大效应,所以叫放大攻击。

七、常用的DNS工具

7.1 nslookup

最常用的DNS查询工具,Windows和Linux都有:

nslookup www.baidu.com

可以查域名对应的IP,也可以指定用哪个DNS服务器查。

7.2 dig

比nslookup更强大的工具,Linux/macOS常用:

dig www.baidu.com

能看到更详细的解析过程和TTL等信息。

7.3 公共DNS服务器

国内常用:

  • 114.114.114.114(114DNS)
  • 223.5.5.5(阿里DNS)
  • 119.29.29.29(腾讯DNS)

国外常用:

  • 8.8.8.8(Google DNS)
  • 1.1.1.1(Cloudflare DNS)
  • 9.9.9.9(Quad9)

八、常见问题

8.1 为什么有时候网站打不开,刷新一下又好了?

可能的原因:

  • DNS解析超时了,第一次没查到,第二次缓存有了
  • 本地DNS服务器出问题了,重试的时候换了一个
  • 网络波动,第一次请求丢包了

8.2 改了DNS解析,为什么我这边还是旧的?

因为缓存!各级DNS服务器和你的电脑都缓存了旧的记录,要等TTL过期了才会更新。

可以试试:

  • 清浏览器缓存
  • 清系统DNS缓存(Windows: ipconfig /flushdns)
  • 等TTL时间过了自然就更新了

8.3 一个域名可以对应多个IP吗?

可以!这就是DNS轮询,是最简单的负载均衡方式。

比如你查百度的域名,可能会返回好几个IP地址,每次返回的顺序还不一样,这样用户就会分散到不同的服务器上。

不过DNS轮询比较简单粗暴,不能感知服务器的健康状态,挂了一台还会把请求分过去。

九、总结

DNS是互联网的”地址簿”,把好记的域名翻译成机器用的IP地址。

核心要点:

  • 分层结构:根 → 顶级 → 权威,层层查询
  • 缓存机制:浏览器、系统、本地DNS都有缓存,提高速度
  • 递归+迭代:客户端到本地DNS是递归,本地DNS往上查是迭代
  • 安全问题:DNS劫持、DNS污染、放大攻击都是常见威胁

理解了DNS的工作原理,以后遇到网站打不开、解析不对之类的问题,你就能自己排查了。