计算机网络学习指南计算机网络学习指南
首页
基础教程
进阶内容
实战案例
编程指南
首页
基础教程
进阶内容
实战案例
编程指南
  • 基础教程

    • 📚 基础教程
    • 🎯 学习目标
    • 🚀 学习路线
    • 📊 章节概览
  • 💡 学习建议
  • 🎓 学完之后
  • 第1章 - 什么是计算机网络?
  • 第2章 - 网络分层模型
  • 第3章 - IP 地址详解
  • 第4章 - 子网掩码与网络划分
  • 第5章 - TCP 与 UDP 协议
  • 第6章 - HTTP 与 HTTPS
  • 第7章 - DNS 域名解析
  • 第8章 - NAT 与网关

第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 记录对比表

记录类型作用指向常见应用
AIPv4 地址IP 地址网站访问
AAAAIPv6 地址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特点
Google8.8.8.88.8.4.4全球最快,稳定
Cloudflare1.1.1.11.0.0.1注重隐私
阿里云223.5.5.5223.6.6.6国内快
腾讯119.29.29.29182.254.116.116国内稳定
114114.114.114.114114.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 数据完整性

💡 长安的学习建议

  1. 理解解析流程 - DNS 解析是分层的,从根开始一步步查找
  2. 记住常用 DNS 服务器 - 8.8.8.8、223.5.5.5 要记住
  3. 学会排查 DNS 问题 - ping、nslookup、dig 命令要会用
  4. 注意 DNS 缓存 - 很多"奇怪"的问题都是缓存导致的
  5. 重视 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 和网关的原理!

继续学习第8章:NAT 与网关 →

💪 练习题

  1. 当你在浏览器输入 www.google.com 并按回车,DNS 解析经历了哪些步骤?
  2. A 记录和 CNAME 记录有什么区别?
  3. 如何清除本地 DNS 缓存?
  4. 为什么要使用 DNS 预解析?
答案提示
  1. DNS 解析步骤:

    1. 检查浏览器缓存
    2. 检查操作系统缓存(hosts 文件)
    3. 查询本地 DNS 服务器(ISP 提供)
    4. 本地 DNS 查询根域名服务器
    5. 根服务器返回 .com 顶级域名服务器地址
    6. 查询 .com 服务器
    7. .com 服务器返回 google.com 权威服务器地址
    8. 查询 google.com 权威服务器
    9. 返回 www.google.com 的 IP 地址
    10. 缓存结果并返回给浏览器
  2. A 记录 vs CNAME 记录:

    • A 记录:
      • 直接指向 IP 地址
      • 例:www.example.com → 192.168.1.100
      • 解析速度快
    • CNAME 记录:
      • 指向另一个域名(别名)
      • 例:www.example.com → example.com
      • 需要额外一次 DNS 查询
      • 灵活,修改目标域名的 IP 不影响 CNAME
  3. 清除 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"
    
  4. DNS 预解析的作用:

    • 提前解析第三方域名的 IP 地址
    • 减少用户点击链接后的等待时间
    • 特别适合引用大量第三方资源的网站
    • 示例:
      <link rel="dns-prefetch" href="//cdn.example.com">
      
    • 可以节省 20-120ms 的 DNS 查询时间
最近更新: 2025/12/27 10:13
Contributors: 王长安
Prev
第6章 - HTTP 与 HTTPS
Next
第8章 - NAT 与网关