一文读懂 DNS:从域名解析到百度访问全流程

目录

前言

[一、什么是 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. 配置步骤)

(1)修改全局配置(/etc/named.conf)

(2)定义区域(/etc/named.rfc1912.zones)

(3)创建区域数据文件(/var/named/benet.com.zone)

(4)启动服务并测试

[4. 反向解析配置(可选)](#4. 反向解析配置(可选))

五、从输入www.baidu.com到页面显示:全流程梳理

[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.com180.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为例)

  1. 本地缓存优先 :浏览器先查自身缓存(如 Chrome 的 DNS 缓存),再查操作系统缓存(Windows 用ipconfig /displaydns查看)和hosts文件(手动绑定的域名 - IP 直接生效);
  2. 递归请求本地 DNS :若本地无缓存,电脑向本地 DNS 服务器(运营商提供或公共 DNS 如114.114.114.114)发送递归查询;
  3. 迭代查询根服务器 :本地 DNS 无缓存时,先向根服务器 (全球 13 组逻辑集群,管理顶级域)查询,根服务器返回.com顶级域服务器地址;
  4. 查询顶级域服务器 :本地 DNS 向.com顶级域服务器查询,对方返回baidu.com权威服务器 (百度自己的 DNS 服务器,如dns.baidu.com)地址;
  5. 查询权威服务器 :本地 DNS 向百度权威服务器查询www.baidu.com,对方返回最终 IP(如180.101.50.242);
  6. 结果返回与缓存:本地 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.comns2.baidu.com
缓存 DNS 服务器 不管理区域数据,仅缓存查询结果,加速访问 运营商本地 DNS、公共 DNS(8.8.8.8223.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 缓存污染、连接超时等),也能更深入地认识互联网的运行逻辑。

相关推荐
一叶飘零_sweeeet17 小时前
SPI 机制深度剖析:Java、Spring、Dubbo 的服务发现哲学与实战指南
java·spring·dubbo
杨DaB4 天前
【SpringBoot】Dubbo、Zookeeper
spring boot·后端·zookeeper·dubbo·java-zookeeper
Warren989 天前
Java后端面试题(含Dubbo、MQ、分布式、并发、算法)
java·开发语言·分布式·学习·算法·mybatis·dubbo
不努力谁会可怜你?10 天前
Dubbo + zk 微服务
dubbo
Warren9810 天前
Java Record 类 — 简化不可变对象的写法
java·开发语言·jvm·分布式·算法·mybatis·dubbo
z***82911 天前
vivo Pulsar 万亿级消息处理实践(2)-从0到1建设 Pulsar 指标监控链路
人工智能·dubbo
helloworld_工程师12 天前
Dubbo应用开发之基于xml的第一个Dubbo程序
dubbo
啥都不懂的小小白12 天前
Dubbo从入门到实战:分布式服务开发指南
分布式·dubbo