目录
[一、什么是 DNS?------ 互联网的 "地址簿"](#一、什么是 DNS?—— 互联网的 “地址簿”)
[为什么需要 DNS?](#为什么需要 DNS?)
[DNS 的核心参数](#DNS 的核心参数)
[二、DNS 解析原理:递归与迭代的协作](#二、DNS 解析原理:递归与迭代的协作)
[1. 两种核心查询方式](#1. 两种核心查询方式)
[2. 完整解析流程(以www.baidu.com为例)](#2. 完整解析流程(以www.baidu.com为例))
[三、DNS 服务器类型:分布式架构的分工](#三、DNS 服务器类型:分布式架构的分工)
[常用公共 DNS 推荐](#常用公共 DNS 推荐)
[四、实战:搭建 DNS 服务器(BIND 为例)](#四、实战:搭建 DNS 服务器(BIND 为例))
[1. 安装软件包](#1. 安装软件包)
[2. 核心配置文件说明](#2. 核心配置文件说明)
[3. 配置步骤](#3. 配置步骤)
(2)定义区域(/etc/named.rfc1912.zones)
(3)创建区域数据文件(/var/named/benet.com.zone)
[4. 反向解析配置(可选)](#4. 反向解析配置(可选))
[1. DNS 解析(获取 IP)](#1. DNS 解析(获取 IP))
[2. 建立 TCP 连接(三次握手)](#2. 建立 TCP 连接(三次握手))
[3. SSL/TLS 握手(HTTPS 加密)](#3. SSL/TLS 握手(HTTPS 加密))
[4. 发送 HTTP 请求与接收响应](#4. 发送 HTTP 请求与接收响应)
[5. 页面渲染与连接关闭](#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 缓存污染、连接超时等),也能更深入地认识互联网的运行逻辑。