DNS协议概述
在互联网中,每台主机通常通过 IP 地址进行唯一标识,例如 192.168.1.100 或 2408:xxxx::1。但是 IP 地址由数字组成,不方便人们记忆和使用。因此,互联网设计了域名系统(Domain Name System,DNS) ,用于实现域名与 IP 地址之间的映射。
例如,用户访问:
www.example.com
实际上浏览器最终需要获得类似:
93.184.216.34
的 IP 地址,然后才能与目标服务器建立网络连接。
因此,可以简单理解为:
DNS 是互联网中的"电话簿",负责将容易记忆的域名转换为计算机能够识别的 IP 地址。
DNS 不仅能够完成"域名 → IP 地址"的解析,也能够完成反向解析、邮件服务器查询、服务发现等功能。
DNS的主要作用
DNS最基本的功能是完成域名解析。
例如:
www.baidu.com
↓ DNS解析
110.242.xxx.xxx
当用户在浏览器输入域名后,通常会经历以下过程:
用户
↓
浏览器
↓
操作系统DNS缓存
↓
本地DNS服务器
↓
根DNS服务器
↓
顶级域DNS服务器
↓
权威DNS服务器
↓
获得IP地址
↓
浏览器访问目标服务器



DNS的作用并不仅仅是将域名转换为 IPv4 地址,它还支持多种资源记录,例如:
| 记录类型 | 作用 |
|---|---|
| A | 域名映射到 IPv4 地址 |
| AAAA | 域名映射到 IPv6 地址 |
| CNAME | 域名别名 |
| MX | 指定邮件服务器 |
| NS | 指定权威DNS服务器 |
| PTR | IP地址反向解析域名 |
| TXT | 保存文本信息,常用于验证、安全策略等 |
| SRV | 服务发现 |
DNS的层次化域名结构
DNS采用分层的树形结构,整个域名系统从根开始向下划分。
例如:
.
│
┌───────────┼───────────┐
com cn org
│ │
example baidu
│
www
以:
www.example.com
为例:
.:根域com:顶级域(TLD)example:二级域www:主机名/子域名
因此,完整域名实际上是一个层次化结构。
常见顶级域包括:
.com 商业组织
.org 组织机构
.net 网络相关组织
.cn 中国国家顶级域
.jp 日本国家顶级域
.uk 英国国家顶级域
这种层次化设计具有很大的优势。
如果所有域名都由一个DNS服务器管理,那么互联网规模扩大后,单个服务器将无法承受巨大的查询压力。
通过分层管理,可以将不同域名划分到不同的DNS服务器中,从而实现:
分布式管理 + 分布式查询 + 提高系统可靠性和扩展性。
DNS服务器的分类
DNS系统中存在多种类型的服务器。
根DNS服务器
根服务器位于DNS层级结构的最顶层。
它通常不会直接告诉客户端:
www.example.com = 93.184.216.34
而是告诉查询者:
.com域应该去哪些DNS服务器查询。
也就是说,根服务器主要负责顶级域的定位。
顶级域DNS服务器
顶级域服务器负责管理某一个顶级域。
例如:
.com
.cn
.org
.net
当根服务器告诉DNS客户端去查询 .com 后,客户端就可以向 .com 顶级域服务器发起查询。
顶级域服务器继续告诉客户端:
example.com对应的权威DNS服务器是谁。
权威DNS服务器
权威DNS服务器保存某个域名的最终解析信息。
例如:
example.com
对应的权威DNS服务器可能保存:
www.example.com → 93.184.216.34
mail.example.com → 93.184.216.35
因此:
权威DNS服务器是最终能够给出域名解析结果的服务器。
DNS域名解析过程
假设用户在浏览器中访问:
www.example.com
下面分析一次典型的DNS解析过程。
第一步:浏览器缓存查询
浏览器首先检查自己的DNS缓存。
如果之前已经解析过:
www.example.com
→ 93.184.216.34
并且缓存还没有过期,就可以直接使用该结果。
这样可以避免产生网络DNS请求。
第二步:操作系统缓存查询
如果浏览器没有找到结果,操作系统可能继续检查本地DNS缓存。
例如:
浏览器
↓
操作系统DNS缓存
如果操作系统已经缓存了对应IP地址,同样可以直接返回。
第三步:查询递归DNS服务器
如果本地没有缓存,操作系统会向配置的DNS服务器发送DNS请求。
例如:
PC
↓
192.168.1.1
或者:
PC
↓
8.8.8.8
第四步:递归DNS服务器查询根服务器
如果递归DNS服务器也没有缓存结果,它会向根DNS服务器查询:
www.example.com
根服务器发现:
.com
属于顶级域,因此返回 .com 顶级域服务器的信息。
第五步:查询TLD服务器
递归DNS服务器继续向 .com 顶级域服务器查询:
www.example.com
.com服务器知道:
example.com
由哪些权威DNS服务器负责,因此返回权威DNS服务器地址。
第六步:查询权威DNS服务器
递归DNS服务器继续向权威DNS服务器发送请求。
权威服务器查询自己的DNS记录:
www.example.com
→ 93.184.216.34
然后把结果返回给递归DNS服务器。
第七步:返回客户端
递归DNS服务器将最终结果返回给用户:
www.example.com
↓
93.184.216.34
浏览器拿到IP地址之后,就可以进一步进行TCP/TLS/HTTP等通信。
整个过程可以简化为:
DNS解析
客户端
│
│ www.example.com
↓
递归DNS服务器
│
↓
根DNS服务器
│
│ .com服务器地址
↓
.com顶级域服务器
│
│ example.com权威服务器地址
↓
权威DNS服务器
│
│ 93.184.216.34
↓
递归DNS服务器
│
↓
客户端
递归查询与迭代查询
DNS查询过程中经常涉及两个重要概念:
递归查询(Recursive Query)和迭代查询(Iterative Query)。
1. 递归查询
客户端向DNS服务器提出请求:
请帮我找到 www.example.com 的IP地址。
DNS服务器需要负责把完整的查询过程完成。
最终直接返回:
93.184.216.34
即:
客户端 → DNS服务器
DNS服务器 → 最终结果
2. 迭代查询
DNS服务器之间通常采用迭代方式。
例如根服务器不会直接完成所有查询,而是告诉DNS服务器:
我不知道具体IP,
但是你可以去.com服务器查询。
然后DNS服务器继续查询 .com。
因此:
递归:
客户端
↓
递归DNS
↓
最终IP
迭代:
递归DNS
↓
根服务器
↓
.com服务器
↓
权威DNS服务器
↓
最终IP
实际DNS解析通常是:
客户端与递归DNS之间采用递归查询,递归DNS与其他DNS服务器之间主要采用迭代查询。
DNS缓存机制
如果每一次访问网站都从根服务器开始查询,那么DNS系统的压力会非常大。
因此DNS设计了非常重要的缓存机制。
例如第一次查询:
www.example.com
↓
93.184.216.34
DNS服务器会把结果缓存起来。
下一次用户再次查询:
www.example.com
DNS服务器可以直接返回:
93.184.216.34
而无需再次访问根服务器。
DNS记录通常包含一个:
TTL(Time To Live)
TTL表示DNS缓存允许保存多长时间。
例如:
www.example.com
A
93.184.216.34
TTL = 300
表示该记录可以缓存约300秒。
缓存机制能够:
- 降低DNS服务器压力
- 减少网络流量
- 提高DNS查询速度
- 降低域名解析延迟
DNS使用的网络协议
DNS属于应用层协议。
传统DNS主要使用:
UDP 53端口
进行查询。
典型结构:
应用层:DNS
传输层:UDP
网络层:IP
数据链路层:Ethernet/Wi-Fi
例如:
客户端
192.168.1.100:随机端口
│
│ UDP
↓
DNS服务器
8.8.8.8:53
DNS使用UDP的主要原因是:
DNS请求通常数据量较小,而且UDP无需建立连接,能够降低查询延迟。
但是DNS并不是只能使用UDP。
在一些情况下会使用:
TCP 53
例如:
- DNS响应数据较大
- DNS区域传送
- DNSSEC等场景
- UDP响应被截断后需要重新通过TCP查询
现代DNS体系中还出现了:
DoH(DNS over HTTPS)
DoT(DNS over TLS)
用于提高DNS查询过程中的隐私和安全性。
DNS报文基本结构
DNS报文通常由以下几个部分组成:
┌──────────────────────┐
│ Header │
├──────────────────────┤
│ Question │
├──────────────────────┤
│ Answer │
├──────────────────────┤
│ Authority │
├──────────────────────┤
│ Additional │
└──────────────────────┘
其中:
Header
保存DNS报文的基本控制信息,例如:
- Transaction ID
- 查询/响应标志
- Opcode
- 状态码
- Question数量
- Answer数量
Question
表示客户端希望查询什么。
例如:
Name = www.example.com
Type = A
表示:
查询
www.example.com的IPv4地址。
Answer
保存最终查询结果:
www.example.com
A
93.184.216.34
Authority
表示具有权威性的DNS服务器信息。
Additional
提供额外的DNS信息。
DNS中的重要资源记录
DNS服务器通过资源记录(Resource Record,RR)保存域名信息。
例如:
www.example.com A 93.184.216.34
其中:
域名 类型 数据
www.example.com A 93.184.216.34
比较常见的记录有:
A记录
www.example.com → 192.168.1.100
负责IPv4地址解析。
AAAA记录
www.example.com → IPv6地址
负责IPv6地址解析。
CNAME记录
www.example.com → server.example.com
表示域名别名。
MX记录
用于指定邮件服务器。
NS记录
用于指定域名对应的权威DNS服务器。
PTR记录
用于反向解析:
IP地址 → 域名
DNS的安全问题
DNS作为互联网基础设施,也面临一些安全问题。
例如:
DNS缓存投毒
攻击者向DNS缓存中注入错误记录:
www.example.com
↓
恶意服务器IP
用户访问正常域名时,可能被引导到攻击者服务器。
DNS劫持
攻击者或者网络设备篡改DNS请求,使用户访问错误的服务器。
DNS欺骗
攻击者伪造DNS响应,使客户端相信错误的解析结果。
为了提高DNS安全性,可以采用:
DNSSEC
DNSSEC通过数字签名等机制提高DNS数据的真实性和完整性。
另外:
DoH
DoT
可以对DNS查询过程进行加密,降低DNS请求被窃听和篡改的风险。
总结
DNS是互联网中非常重要的应用层协议,其核心功能是完成域名与IP地址之间的映射。DNS采用分层、分布式的树形结构,将域名空间划分为根域、顶级域、权威域等多个层次,从而解决了互联网规模不断扩大带来的管理和查询压力。
一次典型的DNS解析过程通常包括浏览器缓存、操作系统缓存、递归DNS缓存以及根服务器、顶级域服务器和权威DNS服务器等多个环节。DNS查询过程中,客户端通常向递归DNS服务器发起递归查询,而递归DNS服务器则通过迭代查询逐级寻找最终的权威DNS服务器。
DNS主要使用UDP 53端口进行通信,在特定情况下也会使用TCP 53端口。为了提高查询效率,DNS通过TTL和缓存机制减少重复查询。同时,DNS通过A、AAAA、CNAME、MX、NS、PTR等资源记录支持不同类型的域名解析。
从整个计算机网络体系来看,DNS虽然只是一个应用层协议,但它承担着连接"人类可读的域名 "和"计算机使用的IP地址"的重要作用。现代互联网中的网站访问、CDN、云服务、负载均衡以及服务发现等大量功能都离不开DNS。因此,理解DNS的层次结构、解析流程、递归与迭代查询、缓存机制以及安全机制,是学习计算机网络和理解互联网工作原理的重要基础。