从 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:cff1DNS 的任务很简单:
把人类容易记忆的域名转换成计算机能够通信的 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整个流程如下:
用户输入域名 ↓DNS解析 ↓获得IP ↓建立连接 ↓请求网页 ↓服务器返回数据扩展
^3c486e
浏览器dns缓存查看:edge://net-internals/#dns、chrome://net-internals/#dns


Windows系统缓存查看:ipconfig /displaydns

- 参数说明
| 参数 | 含义 |
|---|---|
| Record Name | 查询的域名名称 |
| Record Type | DNS记录类型(5=CNAME,28=AAAA,1=A记录) |
| Time To Live | 生存时间(秒),表示缓存还有多久过期 |
| Data Length | 记录数据的长度(字节) |
| Section | DNS响应部分(Answer=答案部分) |
| CNAME Record | 规范名称记录(域名别名) |
| AAAA Record | IPv6地址记录 |
建立可靠连接-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.1Host: www.baidu.comCookie: ...服务器收到请求,返回网页数据。整个流程如下:
用户输入域名 ↓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 到底配置在哪里?
- 谁在配置它? 比如 B站(bilibili)的运维工程师。他们购买了
hdslb.com这个域名后,登录阿里云或腾讯云的“域名解析控制台”,在里面手动添加了一条 CNAME 记录,把i1.hdslb.com指向了腾讯 CDN 的调度域名。 - 它存在哪里? 它存在于远程的 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调度DNSCDN 调度系统会判断:
用户来自哪里?
使用什么运营商?
哪个节点负载最低?
哪个节点当前健康?最终返回不同 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节点 | 数据就近分发到哪里 |