一、DNS 是什么
DNS(Domain Name System,域名系统),属于应用层协议。
DNS 的核心作用:域名 ↔ IP地址 相互解析。
IP地址是互联网主机的数字编号(如 180.101.49.11),不方便人类记忆;域名(www.baidu.com)是给人看的名字。DNS就像互联网的电话本,把域名翻译成IP地址,浏览器才能找到目标服务器。
默认端口:53
DNS 既可以使用 UDP,也支持 TCP。
- UDP:短查询,绝大多数域名解析请求,速度快;
- TCP:DNS报文过大、区域传输、DNSSEC场景使用。
二、DNS 域名层级结构
域名采用树状分层结构,从右往左层级依次降低:www.baidu.com.
.根域名(根服务器)com顶级域名(TLD)baidu二级域名www主机名
域名末尾的
.代表根,写域名时通常省略。
三、DNS 服务器分类
- 根域名服务器
全球一共13组根服务器,只保存顶级域名服务器地址,不保存具体域名记录。
作用:收到请求,返回对应顶级域名服务器地址。 - 顶级域名服务器(TLD)
负责.com、.org、.cn这类后缀,保存二级域名的权威服务器地址。 - 权威域名服务器
保存某个域名(如 baidu.com)的真实解析记录,是域名记录的最终来源。 - 递归域名服务器(本地DNS)
也就是我们电脑配置的DNS服务器(如 114.114.114.114、8.8.8.8)。
客户端只和递归服务器交互;递归服务器代替客户端,逐层去查询根、TLD、权威服务器,拿到结果返回给客户端,并缓存结果。
区分:
- 递归查询:客户端 → 本地DNS(本地DNS帮你查到底)
- 迭代查询:本地DNS → 根 → TLD → 权威服务器(一层层自己去问)
四、DNS 完整查询流程(以访问 www.baidu.com 举例)
- 客户端(电脑/手机)检查本地hosts文件,如果有域名IP映射,直接使用,不走DNS;
- 若无,检查本机DNS缓存;缓存命中直接返回IP;
- 缓存未命中,客户端向本地递归DNS服务器发送UDP查询请求;
- 本地DNS检查自己缓存,有记录直接返回;没有则发起迭代查询:
- 询问根服务器:www.baidu.com 去哪里查;根服务器返回
.com顶级域名服务器地址; - 询问 .com顶级域名服务器,得到 baidu.com 的权威服务器地址;
- 询问 baidu.com权威服务器,拿到
www.baidu.com对应的IP;
- 询问根服务器:www.baidu.com 去哪里查;根服务器返回
- 本地DNS把IP结果返回给客户端;
- 本地DNS缓存这条解析记录(受TTL控制),客户端也在本机缓存;
- 客户端拿到IP,发起TCP连接访问网站。
TTL(Time To Live,生存时间):控制DNS记录在缓存中保留多久,过期重新查询。
五、常见DNS资源记录类型
DNS服务器保存多条类型的记录,最常用:
| 记录类型 | 含义 | 作用 |
|---|---|---|
| A记录 | IPv4地址记录 | 域名 → IPv4地址 |
| AAAA记录 | IPv6地址记录 | 域名 → IPv6地址 |
| CNAME | 别名记录 | 一个域名指向另一个域名 |
| MX | 邮件交换记录 | 指定域名对应的邮件服务器(SMTP使用) |
| NS | 域名服务器记录 | 该域名由哪台权威服务器负责解析 |
| TXT | 文本记录 | 存放SPF、DKIM等邮件验证、域名所有权验证 |
六、DNS 报文结构
DNS请求与响应报文格式相同,分为头部、问题段、回答段、授权段、附加段。
重点字段:
- ID:请求与响应匹配编号;
- Flags:标志位,区分查询/响应、递归请求等;
- QNAME:要查询的域名;
- QTYPE:查询的记录类型(A/AAAA/MX)。
七、DNS 两种查询方式
- 递归查询
客户端只向本地DNS发一次请求,本地DNS负责完成全部查询,最后返回结果给客户端。
客户端 ↔ 本地DNS 是递归查询。
- 迭代查询
本地DNS服务器依次询问根、TLD、权威服务器;每一级服务器只返回下一级服务器地址,不会直接返回最终IP。
本地DNS 和根/TLD/权威服务器之间是迭代查询。
八、DNS 相关安全问题
- DNS劫持:篡改DNS返回结果,把域名解析到恶意IP;
- DNS缓存投毒:污染DNS服务器缓存,让缓存内域名指向错误IP;
- 中间人窃听:传统UDP DNS查询明文传输,可以被抓包看到查询的域名;
安全方案:DNS over HTTPS(DoH)、DNS over TLS(DoT)、DNSSEC(域名记录签名防篡改)。
九、hosts 文件
hosts是本机静态域名映射文件,优先级高于DNS查询。
Windows路径:C:\Windows\System32\drivers\etc\hosts
Linux/macOS路径:/etc/hosts
可以手动写域名与IP映射,用来本地调试网站。
十、小结
- DNS应用层协议,默认端口53;UDP为主,TCP用于大报文;
- 核心功能:域名和IP互相转换;
- 服务器分层:根服务器→顶级域名服务器→权威服务器;递归服务器帮用户代查并缓存;
- 两种查询:递归查询(客户端到本地DNS)、迭代查询(DNS服务器之间);
- 解析顺序:hosts文件 → 本机DNS缓存 → 递归DNS查询;
- 常用记录A、AAAA、CNAME、MX、TXT。
思考题:DNS查询大部分用UDP,为什么设计成UDP而不是TCP?
0 条笔记