文章

CDN

CDN(Content Distribution Network,内容分发网络),作用和linux镜像站或者maven仓库差不多,作为源站的镜像,能够帮源站分担访问压力、加速用户资源的获取。但是和镜像站也有区别:CDN对用户是无感知的,是一种透明的系统,或者说是源站的透明代理。CDN主要是通过DNS来实现的。

如果互联网系统算是一个企业,那么CDN一定程度上可以理解为企业在各地的办事处/分支销售。

  1. 加速
  2. DNS解析
  3. 同步策略
  4. 作用
  5. 感想

加速

互联网系统的访问路径一般是:server -> 接入的网络运营商A的出口 -> A和其他网络运营商B的互联节点 -> 网络运营商B到用户的入口 -> 用户client。所以网站访问速度取决于以下因素:

  1. 网站server到运营商链路的出口带宽;
  2. 不同网络运营商的网络的交汇点带宽(不同网络运营商仅有若干个节点互通,所有跨运营商之间的交互都要经过这些点);
  3. 用户client到运营商链路的入口带宽;

除了最后一点我们控制不了,其他两点都可以通过CDN来改善。比如在各大主要城市都设置CDN,以让用户就近访问,甚至还能给移动/联通/电信的网络分别设置CDN。

终于知道为啥很多老的下载站会提供移动/联通/电信下载了……网速慢的时代,用户要是能选择放在自己网络运营商上的资源,下载起来要快很多。

DNS解析

怎么做到让用户在访问网站的时候能够无感知(“透明”)地从CDN上下载东西呢?

Linux - dig & DNS中介绍了CNAME,canonical name。想设置CDN,就要:

  1. 先在CDN服务商那里把自己网站的ip注册上去,得到一个domain A。注意,这一点和配置DNS看起来很像,实际做的事情完全不一样
    1. 如果是DNS:domain A将指向自己的ip;
    2. 如果是CDN:domain A将指向CDN服务商自己的一堆ip,而这堆ip的内容复制于自己提供的ip
  2. 在自己的DNS服务商那里,把该domain A注册为自己域名的CNAME,即:自己的域名puppylpg.xyz的真实指向为domain A

之后用户访问puppylpg.xyz的时候,就会解析出它的CNAME:domain A。然后做进一步DNS解析,解析出domain A指向的CDN服务商的一堆ip,再选择一个就近的ip访问即可。

当然,因为穷,puppylpg.xyz实际上并没有配置CDN,而是直接指向自己的服务器ip。所以它配置的是一条A记录,而非CNAME:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ dig puppylpg.xyz

; <<>> DiG 9.16.37-Debian <<>> puppylpg.xyz
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2396
;; flags: qr rd ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;puppylpg.xyz.                  IN      A

;; ANSWER SECTION:
puppylpg.xyz.           0       IN      A       93.179.115.157

;; Query time: 0 msec
;; SERVER: 172.22.0.1#53(172.22.0.1)
;; WHEN: Wed Feb 22 01:56:10 CST 2023
;; MSG SIZE  rcvd: 58

一个有CDN的域名示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$ dig youdaoads.com

; <<>> DiG 9.16.37-Debian <<>> youdaoads.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37210
;; flags: qr rd ad; QUERY: 1, ANSWER: 10, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;youdaoads.com.                 IN      A

;; ANSWER SECTION:
youdaoads.com.          0       IN      CNAME   youdaoads.com.163jiasu.com.
youdaoads.com.163jiasu.com. 0   IN      CNAME   youdaoads.com.w.kunluncan.com.
youdaoads.com.w.kunluncan.com. 0 IN     A       220.181.157.136
youdaoads.com.w.kunluncan.com. 0 IN     A       220.181.157.137
youdaoads.com.w.kunluncan.com. 0 IN     A       220.181.157.140
youdaoads.com.w.kunluncan.com. 0 IN     A       220.181.157.141
youdaoads.com.w.kunluncan.com. 0 IN     A       220.181.157.135
youdaoads.com.w.kunluncan.com. 0 IN     A       220.181.157.138
youdaoads.com.w.kunluncan.com. 0 IN     A       220.181.157.139
youdaoads.com.w.kunluncan.com. 0 IN     A       220.181.157.142

;; Query time: 0 msec
;; SERVER: 172.22.0.1#53(172.22.0.1)
;; WHEN: Wed Feb 22 01:57:59 CST 2023
;; MSG SIZE  rcvd: 310

youdaoads.com指向youdaoads.com.163jiasu.com,后者是一个CDN服务商(从163jiasu就能看出来它是网易搞CDN的)提供的域名,该CDN域名的背后是一组服务器,所以有一堆A记录。

同步策略

配置CDN的时候,我们提供的服务器ip不和CDN提供的域名绑定(DNS才做绑定),而是仅用于内容同步。具体怎么同步?不重要。要么是我们push,要么是CDN pull,这是CDN服务商应该操心的事儿。一般情况下应该是pull,需要紧急实时更新资源时可以我们主动push。

作用

和镜像站一样,能够加速访问、缓解主站压力。但是镜像站和主站是有不同域名的两个网址,而CDN是“透明的网站代理”,所以会有一些其他的作用,比如能够隐藏源站,继而防止DDOS攻击

既然是代理,也可以偷偷改掉源站的内容,比如国际CDN巨头CloudFlare能够给代理的网页加上google analytics等。原本应该在源站的网页加入google analytics才能收到统计数据,现在直接由CDN后期注入了,源站无需操心。

CloudFlare不愧是CDN的巨头。

感想

其实CDN和DNS一样,知识都很简单,找个服务商买来配置一下啥都懂了,也很难再忘了……但是……emmm……

本文由作者按照 CC BY 4.0 进行授权