DNS域名解析工作原理详解
一、DNS是什么?
DNS(Domain Name System,域名系统)是互联网的一项核心服务。它可以将人们容易记忆的域名(比如 www.baidu.com)转换成计算机能识别的IP地址(比如 180.101.49.11)。
可以把DNS理解成互联网的”电话簿”:
- 域名 = 人名(好记)
- IP地址 = 电话号码(机器用)
如果没有DNS,我们访问网站就得记住一长串数字,那可太麻烦了。
1.1 为什么不直接用IP地址?
既然最终都是要访问IP地址,为什么不直接用IP,还要多一层域名解析呢?
原因很简单:
- IP地址难记:一长串数字,人脑记不住几个
- IP地址可能变:服务器换了IP,用户不用改,只要改DNS解析就行
- 一个域名可以对应多个IP:实现负载均衡
- 多个域名可以对应同一个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地址后:
- 先存到自己的缓存里,下次有人问就直接返回
- 然后把结果返回给你的电脑
- 你的电脑也存一份缓存
- 浏览器拿到IP,就可以建立连接访问网站了
3.9 递归查询 vs 迭代查询
这里有两个重要概念:
递归查询:
- 就是”你帮我查,查到了告诉我结果”
- 我们的电脑 → 本地DNS服务器,这是递归查询
- 本地DNS服务器要负责把整个查询过程做完,最后返回最终结果
迭代查询:
- 就是”我不知道,但我知道谁可能知道,你去问它”
- 本地DNS服务器 → 根服务器 → 顶级服务器 → 权威服务器,这是迭代查询
- 每一步都只返回下一步该问谁,不直接给最终答案
简单说:递归是”替我查到底”,迭代是”给你指条路”。
四、DNS缓存
DNS解析过程这么多步,如果每次都从头查一遍,那也太慢了。所以DNS系统设计了多层缓存机制。
4.1 缓存的层级
从近到远:
- 浏览器缓存:最快,但容量小,时间短
- 系统缓存:比浏览器大一点
- 本地DNS服务器缓存:容量大,缓存时间长
- 各级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的工作原理,以后遇到网站打不开、解析不对之类的问题,你就能自己排查了。