目录
前言
一、什么是 DNS?—— 互联网的 “地址簿”
为什么需要 DNS?
DNS 的核心参数
二、DNS 解析原理:递归与迭代的协作
1. 两种核心查询方式
2. 完整解析流程(以www.baidu.com为例)
缓存清理命令
三、DNS 服务器类型:分布式架构的分工
常用公共 DNS 推荐
四、实战:搭建 DNS 服务器(BIND 为例)
1. 安装软件包
2. 核心配置文件说明
3. 配置步骤
(1)修改全局配置(/etc/named.conf)
(2)定义区域(/etc/named.rfc1912.zones)
(3)创建区域数据文件(/var/named/benet.com.zone)
(4)启动服务并测试
4. 反向解析配置(可选)
五、从输入www.baidu.com到页面显示:全流程梳理
1. DNS 解析(获取 IP)
2. 建立 TCP 连接(三次握手)
3. SSL/TLS 握手(HTTPS 加密)
4. 发送 HTTP 请求与接收响应
5. 页面渲染与连接关闭
总结
前言
在互联网世界中,我们每天输入www.baidu.com
就能打开百度首页,背后藏着一套精密的 “地址翻译与通信机制”。其中,DNS(域名系统)是整个流程的起点,它解决了 “人类记域名、电脑认 IP” 的核心矛盾。本文将从 DNS 基础讲起,详解解析原理,并完整梳理从输入域名到页面显示的全链路。
一、什么是 DNS?—— 互联网的 “地址簿”
DNS(Domain Name System,域名系统)本质是域名与 IP 地址的映射数据库,相当于互联网的 “114 查号台”。
为什么需要 DNS?
计算机之间的通信依赖唯一的 IP 地址(如180.101.50.242
,类似 “门牌号”),但 IP 地址由数字组成,难以记忆。域名(如baidu.com
)是 IP 的 “人性化别名”,DNS 的核心作用就是实现域名与 IP 的双向转换:
- 正向解析:域名→IP(最常用,如
www.baidu.com
→180.101.50.242
); - 反向解析:IP→域名(多用于邮件反垃圾验证等场景)。
DNS 的核心参数
- 端口与协议:默认使用 53 端口,UDP 协议用于常规查询(速度快),TCP 协议用于主从服务器数据同步(可靠,适合大数据量);
- 域名结构(FQDN):全限定域名,完整标识主机位置,格式为
主机名.子域.二级域.顶级域.根域
(根域.
通常省略)。例如www.sina.com.cn
,拆解后为:- 主机名:
www
(具体服务节点); - 子域:无;
- 二级域:
sina
(企业 / 机构标识); - 顶级域:
com.cn
(国家顶级域 +.com 类别域)。
- 主机名:
二、DNS 解析原理:递归与迭代的协作
DNS 解析不是 “一步到位”,而是本地缓存→多级服务器协作的过程,结合了两种查询方式:
1. 两种核心查询方式
查询方式 | 应用场景 | 特点 | 通俗类比 |
---|---|---|---|
递归查询 | 客户端 ↔ 本地 DNS 服务器 | 客户端只问一次,等待最终结果,中间过程由服务器代理 | “帮我查下百度的 IP,我只要结果” |
迭代查询 | 本地 DNS 服务器 ↔ 根 / 顶级 / 权威服务器 | 上级服务器不直接返回结果,只给 “下一个查询地址”,需自行迭代 | “我不知道,你去问顶级域服务器吧” |
2. 完整解析流程(以www.baidu.com
为例)
- 本地缓存优先:浏览器先查自身缓存(如 Chrome 的 DNS 缓存),再查操作系统缓存(Windows 用
ipconfig /displaydns
查看)和hosts
文件(手动绑定的域名 - IP 直接生效); - 递归请求本地 DNS:若本地无缓存,电脑向本地 DNS 服务器(运营商提供或公共 DNS 如
114.114.114.114
)发送递归查询; - 迭代查询根服务器:本地 DNS 无缓存时,先向根服务器(全球 13 组逻辑集群,管理顶级域)查询,根服务器返回
.com
顶级域服务器地址; - 查询顶级域服务器:本地 DNS 向
.com
顶级域服务器查询,对方返回baidu.com
的权威服务器(百度自己的 DNS 服务器,如dns.baidu.com
)地址; - 查询权威服务器:本地 DNS 向百度权威服务器查询
www.baidu.com
,对方返回最终 IP(如180.101.50.242
); - 结果返回与缓存:本地 DNS 将 IP 返回给浏览器,并缓存该记录(缓存时长由域名的 TTL 值决定,通常几小时到几天),方便下次快速查询。
缓存清理命令
- Windows:
ipconfig /flushdns
(清理缓存),ipconfig /displaydns
(查看缓存); - Linux:需安装
nscd
服务,执行nscd -i hosts
清理。
三、DNS 服务器类型:分布式架构的分工
全球 DNS 是庞大的分布式系统,不同服务器各司其职:
服务器类型 | 核心职责 | 举例 |
---|---|---|
根 DNS 服务器 | 管理根域,返回顶级域服务器地址 | 全球 13 组逻辑根服务器(A-M),国内有镜像节点 |
顶级域 DNS 服务器 | 管理特定顶级域(如.com 、.cn ),返回权威服务器地址 | .com 服务器、.cn 服务器(由 CNNIC 管理) |
权威 DNS 服务器 | 管理具体域名(如baidu.com ),存储域名 - IP 映射的最终数据 | ns1.baidu.com 、ns2.baidu.com |
缓存 DNS 服务器 | 不管理区域数据,仅缓存查询结果,加速访问 | 运营商本地 DNS、公共 DNS(8.8.8.8 、223.5.5.5 ) |
常用公共 DNS 推荐
- 国内:
114.114.114.114
(稳定)、223.5.5.5
/223.6.6.6
(阿里云); - 国外:
8.8.8.8
/8.8.4.4
(Google)、1.1.1.1
(Cloudflare)。
四、实战:搭建 DNS 服务器(BIND 为例)
BIND(Berkeley Internet Name Domain)是最主流的 DNS 服务器软件,以下以 CentOS 为例,演示主服务器的正向 / 反向解析配置。
1. 安装软件包
yum install bind bind-chroot bind-utils -y
# bind:主程序;bind-chroot:安全隔离;bind-utils:包含nslookup/dig等测试工具
2. 核心配置文件说明
配置文件路径 | 作用 |
---|---|
/etc/named.conf | 全局配置(监听地址、允许查询网段等) |
/etc/named.rfc1912.zones | 区域配置(定义负责的域名及数据文件) |
/var/named/xxx.zone | 区域数据文件(存储域名 - IP 映射记录) |
3. 配置步骤
(1)修改全局配置(/etc/named.conf
)
vim /etc/named.conf
options {listen-on port 53 { 192.168.10.23; }; # 监听本地服务IP# listen-on-v6 port 53 { ::1; }; # 禁用IPv6(按需)directory "/var/named"; # 区域数据文件存放路径allow-query { 192.168.10.0/24; }; # 允许查询的网段(按需调整)
};
zone "." IN { # 根域配置(默认无需修改)type hint;file "named.ca"; # 根服务器地址列表
};
include "/etc/named.rfc1912.zones"; # 引入区域配置
(2)定义区域(/etc/named.rfc1912.zones
)
以benet.com
域名为例,添加正向解析区域:
vim /etc/named.rfc1912.zones
zone "benet.com." IN {type master; # 主服务器file "benet.com.zone"; # 区域数据文件名allow-update { none; };
};
(3)创建区域数据文件(/var/named/benet.com.zone
)
复制模板文件并保留权限:
cd /var/named/
cp -p named.localhost benet.com.zone # -p保留权限和属主
编辑数据文件,添加解析记录:
vim /var/named/benet.com.zone
$TTL 1D # 缓存生存周期(1天)
@ IN SOA benet.com. admin.benet.com. ( # @代表当前域名,admin.benet.com是管理员邮箱0 ; serial # 更新序列号(主从同步用,主需大于从)1D ; refresh # 从服务器刷新间隔1H ; retry # 刷新失败重试间隔1W ; expire # 失效时间3H ) ; minimum # 无效记录缓存时间NS benet.com. # 本域DNS服务器A 192.168.10.23 # DNS服务器IP
IN MX 10 mail.benet.com. # 邮件服务器(优先级10)
www IN A 192.168.10.23 # www.benet.com → 192.168.10.23
mail IN A 192.168.10.11 # mail.benet.com → 192.168.10.11
ftp IN CNAME www # ftp是www的别名(ftp.benet.com指向www.benet.com)
* IN A 192.168.10.100 # 泛域名解析(任意前缀.benet.com都指向该IP)
(4)启动服务并测试
# 启动服务,关闭防火墙和SELinux
systemctl start named
systemctl stop firewalld
setenforce 0# 客户端配置DNS(/etc/resolv.conf)
echo "nameserver 192.168.10.23" > /etc/resolv.conf# 测试解析
nslookup www.benet.com # 应返回192.168.10.23
host mail.benet.com # 应返回192.168.10.11
五、从输入www.baidu.com
到页面显示:全流程梳理
DNS 解析只是第一步,完整的访问过程涉及网络协议栈多层协作,共分 5 个阶段:
1. DNS 解析(获取 IP)
如前文所述,通过递归 + 迭代查询,得到www.baidu.com
的 IP 地址(如180.101.50.242
)。
2. 建立 TCP 连接(三次握手)
浏览器向百度服务器的 443 端口(HTTPS 默认端口)发起 TCP 连接:
- 第一次:客户端发送 SYN(同步请求);
- 第二次:服务器返回 SYN+ACK(同意连接);
- 第三次:客户端发送 ACK(确认连接)。
连接建立后,进入数据传输阶段。
3. SSL/TLS 握手(HTTPS 加密)
百度默认使用 HTTPS,需先建立加密通道:
- 客户端发送支持的加密套件列表;
- 服务器选择套件并返回证书(含公钥);
- 客户端验证证书,生成会话密钥并用公钥加密发送给服务器;
- 双方用会话密钥加密后续数据。
4. 发送 HTTP 请求与接收响应
- 浏览器发送 HTTP 请求:
GET /index.html HTTP/1.1
,携带浏览器信息(User-Agent)、Cookie 等; - 百度服务器(如 Nginx)接收请求,调用后端服务(搜索数据库、动态页面生成器),生成 HTML 响应;
- 服务器将 HTML、CSS、JS、图片等资源返回给浏览器。
5. 页面渲染与连接关闭
- 浏览器解析 HTML 结构,加载 CSS 渲染样式,执行 JS 处理交互,最终显示百度首页;
- 通信完成后,通过 “四次挥手” 关闭 TCP 连接(客户端发 FIN→服务器 ACK→服务器发 FIN→客户端 ACK)。
总结
DNS 是互联网的 “基础设施”,通过分布式架构和缓存机制实现了域名到 IP 的高效转换;而从输入域名到页面显示,是 DNS 解析、TCP 连接、HTTPS 加密、HTTP 通信、页面渲染的完整协同。理解这套流程,能帮我们更好地排查网络问题(如 DNS 缓存污染、连接超时等),也能更深入地认识互联网的运行逻辑。