第7章 - DNS 域名解析
嗨,朋友!
你每天都在浏览器输入 www.baidu.com、www.taobao.com,但你有没有想过,计算机怎么知道这些网站的 IP 地址是多少?答案就是:DNS!
DNS 就像互联网的"电话簿",把我们容易记住的域名翻译成计算机能理解的 IP 地址。这一章,我会用最简单的方式,带你搞懂 DNS 的工作原理!
🤔 什么是 DNS?
生活中的类比 📞
想象一下,你要给朋友打电话:
方式1:记住电话号码
你:"我要打给 138-1234-5678" ← 太难记了!
方式2:用通讯录
你:"我要打给'张三'" ← 容易记!
手机:查找通讯录 → 138-1234-5678 → 拨号
DNS 就是互联网的"通讯录":
没有 DNS:
你:"我要访问 220.181.38.148" ← 谁记得住?
有了 DNS:
你:"我要访问 www.baidu.com" ← 好记!
DNS:查找 → 220.181.38.148 → 连接
定义
DNS(Domain Name System,域名系统)是互联网的一项服务,它将人类可读的域名转换为机器可读的 IP 地址。
为什么需要 DNS?
原因1:IP 地址难记
❌ 220.181.38.148
✅ www.baidu.com
原因2:IP 地址可能变化
- 百度换服务器,IP 变了
- 但域名不变,用户无感知
原因3:一个域名可以对应多个 IP
- 负载均衡
- CDN 加速
🌐 域名的结构
域名的组成
www.baidu.com.
│ │ │ │
│ │ │ └─ 根域名(通常省略)
│ │ └───── 顶级域名(TLD)
│ └─────────── 二级域名
└─────────────── 三级域名(子域名)
详细分解
完整域名:www.example.com.
从右往左读:
1. 根域名: . (通常省略)
2. 顶级域名: com
3. 二级域名: example
4. 三级域名: www
顶级域名分类
通用顶级域名(gTLD)
.com - 商业组织(最常用)
.org - 非营利组织
.net - 网络服务商
.edu - 教育机构
.gov - 政府部门
.int - 国际组织
.mil - 军事机构
.info - 信息服务
.biz - 商业
国家/地区顶级域名(ccTLD)
.cn - 中国
.us - 美国
.uk - 英国
.jp - 日本
.de - 德国
.fr - 法国
新顶级域名
.tech - 科技
.app - 应用
.dev - 开发者
.cloud - 云服务
.ai - 人工智能
🔍 DNS 解析过程
完整的解析流程
当你在浏览器输入 www.baidu.com 并按回车:
① 浏览器缓存
└─ 有缓存?✅ → 直接使用
└─ 无缓存?❌ → 继续
② 操作系统缓存
└─ 检查 hosts 文件
└─ 有记录?✅ → 直接使用
└─ 无记录?❌ → 继续
③ 本地 DNS 服务器(ISP 提供)
└─ 有缓存?✅ → 返回结果
└─ 无缓存?❌ → 继续
④ 根域名服务器
└─ "我不知道 baidu.com 的 IP"
└─ "但我知道 .com 服务器的地址"
└─ 返回 .com 顶级域名服务器地址
⑤ 顶级域名服务器(.com)
└─ "我不知道 www.baidu.com 的 IP"
└─ "但我知道 baidu.com 的权威服务器"
└─ 返回 baidu.com 权威服务器地址
⑥ 权威 DNS 服务器(baidu.com)
└─ "www.baidu.com 的 IP 是 220.181.38.148"
└─ 返回 IP 地址
⑦ 本地 DNS 服务器
└─ 缓存结果
└─ 返回给客户端
⑧ 浏览器
└─ 缓存结果
└─ 连接 220.181.38.148
图解 DNS 解析
你的电脑 本地DNS 根DNS .com DNS baidu.com DNS
│ │ │ │ │
│─①查询 www.baidu.com──→│ │ │ │
│ │ │ │ │
│ │─②查询根服务器→│ │ │
│ │←③返回.com地址─│ │ │
│ │ │ │
│ │─④查询.com服务器──────────→│ │
│ │←⑤返回baidu.com地址────────│ │
│ │ │
│ │─⑥查询baidu.com服务器────────────────────→│
│ │←⑦返回IP:220.181.38.148──────────────────│
│ │ │
│←⑧返回IP地址──────────│ │
│ │
│─⑨连接 220.181.38.148─────────────────────────────────────────→│
📝 DNS 记录类型
常见的 DNS 记录
A 记录(Address Record)
作用:将域名指向 IPv4 地址
例子:
www.example.com → 192.168.1.100
example.com → 192.168.1.100
用途:
- 网站访问
- 最常用的记录类型
AAAA 记录
作用:将域名指向 IPv6 地址
例子:
www.example.com → 2001:db8::1
用途:
- 支持 IPv6 访问
CNAME 记录(Canonical Name)
作用:域名别名,指向另一个域名
例子:
www.example.com → example.com
blog.example.com → www.example.com
用途:
- CDN 加速配置
- 多个域名指向同一个服务器
MX 记录(Mail Exchange)
作用:指定邮件服务器
例子:
example.com → mail.example.com (优先级 10)
example.com → mail2.example.com (优先级 20)
用途:
- 配置企业邮箱
TXT 记录
作用:存储文本信息
例子:
example.com → "v=spf1 include:_spf.google.com ~all"
用途:
- SPF 邮件验证
- 域名所有权验证
- 网站验证
NS 记录(Name Server)
作用:指定域名服务器
例子:
example.com → ns1.example.com
example.com → ns2.example.com
用途:
- 指定权威 DNS 服务器
DNS 记录对比表
| 记录类型 | 作用 | 指向 | 常见应用 |
|---|---|---|---|
| A | IPv4 地址 | IP 地址 | 网站访问 |
| AAAA | IPv6 地址 | IPv6 地址 | IPv6 网站 |
| CNAME | 别名 | 域名 | CDN、负载均衡 |
| MX | 邮件服务器 | 域名 | 邮箱服务 |
| TXT | 文本信息 | 文本 | 验证、配置 |
| NS | 名称服务器 | 域名 | 域名解析 |
⚡ DNS 缓存
缓存的层次
① 浏览器缓存
- 最快
- 时间最短(几分钟)
② 操作系统缓存
- 很快
- 时间较短(几小时)
③ 路由器缓存
- 快
- 家庭网络共享
④ ISP DNS 缓存
- 较快
- 所有用户共享
TTL(Time To Live)
TTL:缓存有效期
例子:
www.baidu.com A 220.181.38.148 TTL=600
↑
600秒(10分钟)
600秒后:
- 缓存失效
- 需要重新查询
清除 DNS 缓存
# Windows
ipconfig /flushdns
# Linux
sudo systemctl restart systemd-resolved
# 或
sudo service nscd restart
# macOS
sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder
# Chrome 浏览器
访问:chrome://net-internals/#dns
点击:Clear host cache
💻 实际应用案例
前端开发
查看 DNS 解析时间
// 使用 Performance API
window.addEventListener('load', () => {
const perfData = window.performance.timing;
const dnsTime = perfData.domainLookupEnd - perfData.domainLookupStart;
console.log(`DNS 解析耗时:${dnsTime}ms`);
});
// 使用 Resource Timing API
const resources = performance.getEntriesByType('resource');
resources.forEach(resource => {
const dnsTime = resource.domainLookupEnd - resource.domainLookupStart;
console.log(`${resource.name} DNS 耗时:${dnsTime}ms`);
});
DNS 预解析
<!-- 提前解析第三方域名 -->
<link rel="dns-prefetch" href="//cdn.example.com">
<link rel="dns-prefetch" href="//api.example.com">
<link rel="dns-prefetch" href="//fonts.googleapis.com">
<!-- 预连接(DNS + TCP + TLS) -->
<link rel="preconnect" href="https://cdn.example.com">
后端开发
Node.js DNS 查询
const dns = require('dns');
// 查询 A 记录
dns.resolve4('www.baidu.com', (err, addresses) => {
if (err) {
console.error('DNS 查询失败:', err);
return;
}
console.log('IP 地址:', addresses);
// 输出:['220.181.38.148', '220.181.38.149']
});
// 查询所有记录类型
dns.resolve('www.baidu.com', 'ANY', (err, records) => {
console.log('所有记录:', records);
});
// 反向解析(IP → 域名)
dns.reverse('8.8.8.8', (err, hostnames) => {
console.log('域名:', hostnames);
// 输出:['dns.google']
});
// Promise 版本
const { promises: dnsPromises } = require('dns');
async function lookupDomain() {
try {
const addresses = await dnsPromises.resolve4('www.google.com');
console.log('Google IP:', addresses);
} catch (err) {
console.error('查询失败:', err);
}
}
lookupDomain();
Python DNS 查询
import socket
import dns.resolver # 需要安装:pip install dnspython
# 方式1:使用 socket
hostname = 'www.baidu.com'
ip_address = socket.gethostbyname(hostname)
print(f"{hostname} 的 IP 地址:{ip_address}")
# 方式2:使用 dnspython
resolver = dns.resolver.Resolver()
# 查询 A 记录
answers = resolver.resolve('www.baidu.com', 'A')
for rdata in answers:
print(f'A 记录:{rdata.address}')
# 查询 MX 记录
answers = resolver.resolve('gmail.com', 'MX')
for rdata in answers:
print(f'MX 记录:{rdata.exchange} 优先级:{rdata.preference}')
# 查询 TXT 记录
answers = resolver.resolve('example.com', 'TXT')
for rdata in answers:
print(f'TXT 记录:{rdata.strings}')
运维配置
配置 DNS 服务器
# Linux - 编辑 /etc/resolv.conf
sudo vim /etc/resolv.conf
# 添加 DNS 服务器
nameserver 8.8.8.8 # Google DNS
nameserver 8.8.4.4 # Google DNS 备用
nameserver 114.114.114.114 # 国内 DNS
nameserver 223.5.5.5 # 阿里云 DNS
# 应用配置
sudo systemctl restart systemd-resolved
hosts 文件配置
# Windows:C:\Windows\System32\drivers\etc\hosts
# Linux/Mac:/etc/hosts
# 格式:IP地址 域名
127.0.0.1 localhost
192.168.1.100 dev.example.com
192.168.1.200 api.example.com
# 用途:
# - 本地开发测试
# - 屏蔽广告域名
# - 加速常用网站
测试工程师
使用 nslookup 查询
# 查询域名
nslookup www.baidu.com
# 输出:
# Server: 192.168.1.1
# Address: 192.168.1.1#53
#
# Non-authoritative answer:
# Name: www.baidu.com
# Address: 220.181.38.148
# 指定 DNS 服务器查询
nslookup www.baidu.com 8.8.8.8
# 查询特定记录类型
nslookup -type=MX gmail.com
nslookup -type=TXT example.com
使用 dig 命令(Linux/Mac)
# 基本查询
dig www.baidu.com
# 简洁输出
dig www.baidu.com +short
# 输出:220.181.38.148
# 查询特定记录
dig www.baidu.com A # A 记录
dig gmail.com MX # MX 记录
dig example.com NS # NS 记录
# 追踪解析过程
dig www.baidu.com +trace
# 指定 DNS 服务器
dig @8.8.8.8 www.google.com
🌍 常用 DNS 服务器
国内 DNS
阿里云 DNS:
223.5.5.5
223.6.6.6
腾讯 DNS:
119.29.29.29
182.254.116.116
百度 DNS:
180.76.76.76
114 DNS:
114.114.114.114
114.114.115.115
国际 DNS
Google DNS:
8.8.8.8
8.8.4.4
Cloudflare DNS:
1.1.1.1
1.0.0.1
OpenDNS:
208.67.222.222
208.67.220.220
DNS 服务器对比
| DNS 服务商 | 主 DNS | 备用 DNS | 特点 |
|---|---|---|---|
| 8.8.8.8 | 8.8.4.4 | 全球最快,稳定 | |
| Cloudflare | 1.1.1.1 | 1.0.0.1 | 注重隐私 |
| 阿里云 | 223.5.5.5 | 223.6.6.6 | 国内快 |
| 腾讯 | 119.29.29.29 | 182.254.116.116 | 国内稳定 |
| 114 | 114.114.114.114 | 114.114.115.115 | 老牌,稳定 |
🔒 DNS 安全
DNS 劫持
攻击场景:
你访问:www.bank.com
DNS 被劫持 → 返回假 IP
实际访问:钓鱼网站
防护措施:
- 使用可信 DNS 服务器
- 启用 DNSSEC
- 使用 HTTPS
DNS 污染
某些地区的 DNS 会返回错误的 IP 地址
解决方案:
- 更换 DNS 服务器
- 使用 DNS over HTTPS (DoH)
- 使用 VPN
DNSSEC
DNSSEC:DNS 安全扩展
作用:
- 验证 DNS 响应的真实性
- 防止 DNS 欺骗和劫持
原理:
- 使用数字签名
- 确保 DNS 数据完整性
💡 长安的学习建议
- 理解解析流程 - DNS 解析是分层的,从根开始一步步查找
- 记住常用 DNS 服务器 - 8.8.8.8、223.5.5.5 要记住
- 学会排查 DNS 问题 - ping、nslookup、dig 命令要会用
- 注意 DNS 缓存 - 很多"奇怪"的问题都是缓存导致的
- 重视 DNS 安全 - 使用可信的 DNS 服务器
📝 小结
这一章我们学习了:
✅ DNS 的作用:域名 → IP 地址,互联网的"电话簿"
✅ 域名结构:根域名、顶级域名、二级域名、三级域名
✅ DNS 解析过程:浏览器 → 本地DNS → 根DNS → 顶级DNS → 权威DNS
✅ DNS 记录类型:A、AAAA、CNAME、MX、TXT、NS
✅ DNS 缓存:浏览器、操作系统、ISP 多层缓存,TTL 控制过期
✅ 实际应用:前端DNS预解析、后端DNS查询、运维DNS配置
🎯 下一步
现在你已经理解了 DNS 域名解析,但是家里只有一个公网 IP,为什么多台设备都能同时上网呢?下一章我们来学习 NAT 和网关的原理!
💪 练习题
- 当你在浏览器输入
www.google.com并按回车,DNS 解析经历了哪些步骤? - A 记录和 CNAME 记录有什么区别?
- 如何清除本地 DNS 缓存?
- 为什么要使用 DNS 预解析?
答案提示
DNS 解析步骤:
- 检查浏览器缓存
- 检查操作系统缓存(hosts 文件)
- 查询本地 DNS 服务器(ISP 提供)
- 本地 DNS 查询根域名服务器
- 根服务器返回 .com 顶级域名服务器地址
- 查询 .com 服务器
- .com 服务器返回 google.com 权威服务器地址
- 查询 google.com 权威服务器
- 返回 www.google.com 的 IP 地址
- 缓存结果并返回给浏览器
A 记录 vs CNAME 记录:
- A 记录:
- 直接指向 IP 地址
- 例:
www.example.com → 192.168.1.100 - 解析速度快
- CNAME 记录:
- 指向另一个域名(别名)
- 例:
www.example.com → example.com - 需要额外一次 DNS 查询
- 灵活,修改目标域名的 IP 不影响 CNAME
- A 记录:
清除 DNS 缓存:
# Windows ipconfig /flushdns # Linux sudo systemd-resolve --flush-caches # macOS sudo dscacheutil -flushcache sudo killall -HUP mDNSResponder # Chrome 浏览器 访问 chrome://net-internals/#dns 点击 "Clear host cache"DNS 预解析的作用:
- 提前解析第三方域名的 IP 地址
- 减少用户点击链接后的等待时间
- 特别适合引用大量第三方资源的网站
- 示例:
<link rel="dns-prefetch" href="//cdn.example.com"> - 可以节省 20-120ms 的 DNS 查询时间
