2573 字
13 分钟
【随笔】一次域名访问到底经历了什么?

从 DNS 到 CDN#

或许你有过这样的疑问:

DNS 的作用不就是把域名解析成 IP 地址吗?

既然最终都会得到一个 IP 地址,那为什么还需要 CDN?

DNS 直接返回服务器 IP 不就行了吗?

这个问题实际上问到了 CDN 存在的根本原因。

要彻底理解 CDN,首先要理解:

DNS 解决的是“找到服务器”的问题,而 CDN 解决的是“找到最合适服务器”的问题。

一次普通的网站访问流程#

假设我们在浏览器输入:

https://www.baidu.com

浏览器并不知道这个域名对应哪个服务器,因此首先需要进行 DNS 查询。

可以看到浏览器本地缓存的百度dns信息和实际访问的百度远程IPv6是一致的。

DNS 的作用#

DNS(Domain Name System,域名系统)本质上就是互联网的电话簿。

例如:

www.baidu.com
240e:ff:e020:99b:0:ff:b099:cff1

DNS 的任务很简单:

把人类容易记忆的域名转换成计算机能够通信的 IP 地址(IPv4或IPv6)。

DNS 查询过程#

浏览器会经历以下步骤:

浏览器
本地缓存
操作系统缓存
hosts文件
Local DNS(运营商DNS)
根DNS
顶级域DNS(.com)
权威DNS
获得IP地址

例如:

www.baidu.com
240e:ff:e020:99b:0:ff:b099:cff1

然后浏览器拿着这个 IP:

240e:ff:e020:99b:0:ff:b099:cff1

建立TCP连接TLS 握手,最终获取网页内容。

整个流程如下:

用户输入域名
DNS解析
获得IP
建立连接
请求网页
服务器返回数据

扩展#

^3c486e

浏览器dns缓存查看:edge://net-internals/#dnschrome://net-internals/#dns

Windows系统缓存查看:ipconfig /displaydns

  • 参数说明
参数含义
Record Name查询的域名名称
Record TypeDNS记录类型(5=CNAME,28=AAAA,1=A记录)
Time To Live生存时间(秒),表示缓存还有多久过期
Data Length记录数据的长度(字节)
SectionDNS响应部分(Answer=答案部分)
CNAME Record规范名称记录(域名别名)
AAAA RecordIPv6地址记录

建立可靠连接-TCP 三次握手#

^c8a987

拿到 IP 地址后,浏览器还不能直接发数据。因为互联网传输是不可靠的,数据包可能会丢失。

浏览器需要和服务器进行 TCP 三次握手,确认双方都能正常收发数据:

1.第一次握手
客户端:喂,你能听到我说话吗?(SYN)

解释: 客户端发送 SYN(同步)包,携带自己的初始序列号(Seq=x);

  • SYN = Synchronize(同步序列号)
  • 含义:“我想和你建立连接,我的初始序列号是 x”
2.第二次握手
服务器:能听到,你能听到我吗?(SYN+ACK)

解释: 服务器回复 SYN-ACK 包

  • ACK = Acknowledgment(确认)
  • 含义:“我收到你的连接请求了(ACK=x+1),我也想和你建立连接,我的初始序列号是 y”
3.第三次握手
客户端:我也能听到你!(ACK)

解释: 客户端发送 ACK 包

  • 含义:“我收到你的响应了(ACK=y+1),连接建立成功”

建立安全通道-HTTPS 与 TLS 握手#

^37b649

如果你访问的是 http://,到这一步就可以直接发送明文数据了。 但现代网站都是 https://,这个 s 代表安全(Secure)

在 TCP 通道建立后,还需要进行 TLS(传输层安全性协议,Transport Layer Security) 握手,目的是验证服务器身份协商加密密钥

TLS 握手的过程如下:

索要证书(验证身份)#

客户端:你好,我是来访问的,请出示你的身份证(数字证书)。
服务器:好的,这是我的证书(包含我的公钥)。

客户端会检查这个证书是不是由权威机构(CA)颁发的,有没有过期,域名对不对。如果没问题,说明对方真的是 www.baidu.com,不是钓鱼网站。

协商“会话密钥”(非对称加密)#

接下来,双方需要约定一个用来加密聊天内容的 “会话密钥”(Session Key)。 为了防止黑客偷窥,这里使用了非对称加密(公钥加密,私钥解密):

1. 客户端自己生成一个随机数(预主密钥 Pre-Master Secret)。
2. 客户端用服务器证书里的【公钥】,把这个随机数加密,发给服务器。
(公钥 = 锁头,任何人都能用它锁东西)
3. 服务器收到密文后,用自己的【私钥】解密,得到了这个随机数(这里使用客户端公钥进行加密的,只有服务器的私钥才能解密,所以叫非对称加密)。
(私钥 = 钥匙,只有服务器自己有,能打开锁)

生成最终的“会话密钥”#

现在,客户端和服务器都拥有了那个“随机数”。 双方根据这个随机数,各自在本地计算出完全相同的会话密钥(Session Key)

开始加密通信#

客户端:以后我们的聊天内容,都用这个“会话密钥”加密!
服务器:同意!

总结一下 TLS 的精髓: 用非对称加密(公钥/私钥)来安全地传递“钥匙”,然后用这把“钥匙”(会话密钥)进行对称加密来传输实际数据。这样既保证了安全,又保证了加密速度。

4. 发送 HTTP 请求#

安全通道建立后,浏览器开始发送真正的业务请求:

GET /index.html HTTP/1.1
Host: www.baidu.com
Cookie: ...

服务器收到请求,返回网页数据。整个流程如下:

用户输入域名
DNS解析(拿到 IP)
TCP 三次握手(建立可靠通道)
TLS 握手(验证身份,协商会话密钥)
发送 HTTP 请求(数据被会话密钥加密)
服务器返回加密数据
浏览器解密并渲染网页

如果没有 CDN,会发生什么?#

假设某视频网站只有一个源站服务器:

北京机房
IP:1.1.1.1

全国用户访问时:

广州用户
北京服务器
上海用户
北京服务器
新疆用户
北京服务器

所有请求全部打到北京。

问题1:距离太远#

互联网虽然快,但依然受物理距离影响。

例如:

广州 → 北京
约2000公里
新疆 → 北京
约3000公里

数据需要经过大量路由节点。

结果:

延迟增加
页面打开变慢
视频缓冲增多

问题2:跨运营商访问#

国内存在多个运营商:

电信
联通
移动
广电

如果:

用户:
广州联通
服务器:
北京电信

数据需要经过运营商之间的互联节点。

结果:

速度下降
丢包增加
体验变差

问题3:源站压力过大#

假设:

1000万用户同时观看视频

所有流量都访问:

1.1.1.1

那么:

CPU爆满
带宽打满
服务器崩溃

整个网站可能直接瘫痪。

CDN 到底解决了什么问题?#

CDN(Content Delivery Network)

中文:

内容分发网络

其核心思想非常简单:

不让所有用户都访问源站,而是在全国各地部署大量缓存节点。

例如:

北京(源站)
广州CDN节点
上海CDN节点
深圳CDN节点
成都CDN节点
西安CDN节点
杭州CDN节点
...

提前把热门资源同步到这些节点上。

这样用户访问时:

广州用户
广州CDN
上海用户
上海CDN
成都用户
成都CDN

而不是全部访问北京源站。

误解:CDN 不是独立于 DNS 存在的#

很多初学者认为:

DNS负责解析IP
CDN负责加速

似乎是两套系统。

实际上:

CDN 的加速能力恰恰是通过 DNS 实现的。

换句话说:

CDN = DNS + 调度系统 + 缓存节点

其中最关键的部分就是:

智能DNS调度

CDN 是如何接管 DNS 的?#

假设:

img.example.com

启用了 CDN。

此时权威 DNS 不再直接返回真实服务器 IP。

而是返回一个 CNAME

  • CNAME 到底配置在哪里?
  1. 谁在配置它? 比如 B站(bilibili)的运维工程师。他们购买了 hdslb.com 这个域名后,登录阿里云或腾讯云的“域名解析控制台”,在里面手动添加了一条 CNAME 记录,把 i1.hdslb.com 指向了腾讯 CDN 的调度域名。
  2. 它存在哪里? 它存在于远程的 DNS 服务器上(比如腾讯云的 DNS 服务器 dnsv1.com),它不存在于你的个人电脑硬盘里。

例如:

img.example.com
img.example.com.cdn.provider.com

这个过程叫:

CNAME(别名记录)

没有 CDN 时#

DNS 返回:

img.example.com
1.1.1.1

所有用户都访问:

1.1.1.1

有 CDN 时#

DNS 返回:

img.example.com
img.example.com.cdn.provider.com

然后继续解析:

CDN调度DNS

CDN 调度系统会判断:

用户来自哪里?
使用什么运营商?
哪个节点负载最低?
哪个节点当前健康?

最终返回不同 IP。

广州电信用户#

返回:

14.215.x.x

广州 CDN 节点。

上海联通用户#

返回:

101.226.x.x

上海 CDN 节点。

成都移动用户#

返回:

183.232.x.x

成都 CDN 节点。

最终效果:

同一个域名
不同用户
获得不同IP

这正是 CDN 的核心能力。

CDN 节点里没有资源怎么办?#

很多人还有一个疑问:

用户访问 CDN 节点时,如果资源不存在怎么办?

答案是:

回源(Origin Pull)

例如:

用户请求:

video.mp4

广州 CDN 节点发现:

缓存未命中
(Cache Miss)

于是:

广州CDN
北京源站

获取文件。

然后:

缓存到本地

再返回给用户。

后续用户访问:

Cache Hit

直接从广州 CDN 返回。

无需再访问北京源站。

整个访问流程图#

无 CDN#

用户
DNS解析
获得源站IP
北京服务器
返回内容

所有流量:

用户
北京

有 CDN#

用户
DNS解析
CDN调度DNS
获得最近CDN节点IP
CDN节点
返回内容

缓存未命中:

用户
CDN节点
源站
CDN缓存
用户

缓存命中:

用户
CDN节点
用户

记忆点#

技术解决的问题
DNS域名如何找到服务器
CDN如何找到最合适的服务器
源站数据真正存储在哪里
CDN节点数据就近分发到哪里
【随笔】一次域名访问到底经历了什么?
https://jzzt.cc.cd/posts/随笔思辨/笔记-260611一次域名访问到底经历了什么/
作者
局子粥头
发布于
2026-06-11
许可协议
CC BY-NC-SA 4.0