CDN 是怎么一回事
904 字 · 3 分钟#网络#CDN
看完一个讲 CDN 的视频之后的整理。视频本身讲得很好,值得一看:
CDN,Content Delivery Network,内容分发网络。
距离是硬伤
网络请求的耗时里有一个绕不开的物理事实:服务器可能距离用户十万八千里。距离越远,请求要经过的中间节点就越多,而节点之间还可能发生阻塞或者丢包。衡量这段旅程的指标叫 RTT(Round-Trip Time,往返时间)——光速再快,从上海到弗吉尼亚打个来回也要实打实地消耗几百毫秒。
一个朴素的解法是把服务器备份到世界各地,但对单个网站来说耗资巨大。于是就有一群人在世界各地搭好了服务器,把这件事做成了服务:这张由大量边缘服务器(离用户近的服务器)组成的网络,就是 CDN。
分发什么内容
CDN 分发的内容分两类,处理方式完全不同。
静态内容是长期不需要改变的资源,比如图标、样式表、字体。它们适合被缓存在边缘服务器上,但也不是无限期保存——源服务器在把文件交给 CDN 时,可以通过 HTTP 头 cache-control 声明缓存策略(no-cache、no-store、max-age 等),明确哪些资源要保存、保存多久。
动态内容是经常变化的部分,比如用户数据。它没法像静态资源那样一存了之,CDN 对它的价值主要在链路优化和安全防护上。
分发流程
关键认知:CDN 上并没有网站的源内容,内容都来自源服务器,区别只在于怎么到达 CDN。
对静态内容有两种方式。源服务器可以提前把静态内容主动备份给 CDN,这叫 push;如果没有提前备份,那么当用户访问时,边缘服务器再回源向服务器索取,这叫 pull。pull 模式下第一个用户会慢一点,但之后的用户都能吃到缓存。
动态内容没法缓存,但让请求先经过 CDN 依然有意义:它无形之中在用户和源服务器中间加了一道墙,用户不再直接访问源服务器,恶意流量(比如 DDoS)会先被这道墙消化掉一部分。
安全性和可靠性
CDN 的服务器多、分布广,这个特性本身就是可靠性的来源。CDN 厂商会监控这些服务器的负载情况,根据负载做流量分配,形成负载均衡。
这里有个很妙的技术叫任播(Anycast):多台服务器对外共享同一个 IP 地址,请求发出后由距离最近的服务器响应;如果某台服务器超载了,流量可以转移到其它没超载的服务器上。对用户来说这一切都是透明的。
传输层面则用 TLS/SSL 证书对网站进行保护,很多 CDN 厂商把证书签发和管理也一并做掉了。
一加一减
最后算一笔账。
加的是性能:CDN 会对文件做最小化和压缩,同时不断优化自身的硬件与软件,这些优化对接入的网站是白拿的。
减的是费用:带宽是按消耗计费的,消耗越大费用越高。CDN 让内容在离用户更近的地方被消费掉,大大减少了 CDN 到源服务器之间带宽的占用——类比开车,路程短了,油费自然就省了。