CDN 内容分发
第 6 章讲完了"最后几百米的空气"——数据从路由器飞到你的手机。这一章换一个方向:数据从网站的机房到你的城市,走了多远?你在深圳点开一个视频秒开,而那家公司的服务器可能远在三千公里外的张家口。你感觉不到距离,不是因为距离消失了,而是因为有人提前把内容搬到了你家门口。干这件事的系统叫 CDN——它支撑着你每天刷的短视频、抢的秒杀、看的直播。这一节就把它讲透:CDN 做的事,一句话概括就是:与其让全国人民都跑总仓提货,不如把货提前铺到每个小区门口的连锁便利店。
双十一零点,你掐着表点开一件外套的商品页——图片"唰"地全出来了,详情页往下滑一点不卡。同一秒,全国有几亿人在做同样的事。你有没有想过:这几十张图片,是从哪儿发到你手机上的?
那家电商的主机房大概率在杭州或者张家口。如果每一张商品图都从那里原样发出,那零点的瞬间,机房出口会被挤到瘫痪,新疆用户的图片要在网线里跑三千公里。可现实是:你的图片大概率来自你所在这座城市郊区的某个机房——一个你从没听说过、却离你只有几十公里的地方。这就是这一节的主角每天在做的事。
先把这一节的术语翻译成人话
照例,先把本节的核心名词全部翻译成"人话",每个都能在生活里找到对应物。读完全文回来重看这张表,会有第二次收获。
| 术语 | 换成大白话 | 生活里对应的东西 |
|---|---|---|
| CDN(内容分发网络) | 说白了就是"开在全国每个小区门口的连锁便利店网络" | 蜜雪冰城 / 全国连锁超市 |
| 源站(Origin) | 说白了就是"真正压货的中央大仓,全系统唯一的总店" | 品牌工厂总仓 |
| 边缘节点(POP) | 说白了就是"你家门口那家便利店,离你最近的存货点" | 小区门口的超市门店 |
| 缓存(Cache) | 说白了就是"货架上摆着的现货" | 便利店的货架 |
| 命中(Hit) | 说白了就是"到店就有货,付钱直接拿走" | 货架上有你常喝的那瓶水 |
| 回源(Miss → Origin Pull) | 说白了就是"店里断货了,让总仓临时发一件过来" | 门店帮你从总仓调货 |
| 延迟(Latency) | 说白了就是"一问一答之间花掉的路程时间" | 快递在路上的时间 |
| TTL(缓存有效期) | 说白了就是"货架这批货的保质期,到期才换新" | 面包的出厂保质期 |
| DNS 就近调度 | 说白了就是"导航自动把你带往离你最近的那家门店" | 地图 App 选最近门店 |
| 预热(Prefetch) | 说白了就是"新品上市前提前把货铺到所有门店" | 大促前的铺货 |
| 动态加速 | 说白了就是"不存货,只给你抄近道的直达专车" | 不挂靠门店的冷链专线 |
| 边缘安全(DDoS 清洗 / WAF) | 说白了就是"守在小区大门口的保安亭,先检查再放行" | 小区门岗与安检 |
一句话串起整节:源站是总仓,节点是门店,缓存是货架,命中是现货直取,回源是临时调货,TTL 是保质期,调度是导航,安全是门岗。下面一个一个说。
为什么"远"是个大问题:光速不讲情面
先看物理。很多人以为网速慢的唯一原因是"带宽不够",其实还有第二个同样硬的约束:延迟——数据在路上花的时间,而这段时间的下限由光速决定,谁也压缩不了。光在真空里每秒跑 30 万公里,但商用光纤里走的信号实际速度大约是每秒 20 万公里(光在玻璃中会变慢,只剩真空的三分之二)。
算一笔账:北京到深圳直线约两千公里,光纤走的是铺设路径,打个折算两千二。单程 11 毫秒,一来一回(你发请求、服务器回数据)约 22 毫秒。听着不多?问题在于:打开一个普通网页要几十次一来一回——先问"你在哪"(DNS 解析),再握手,再逐个拉图片、样式、脚本。每次往返都老老实实花 22 毫秒,叠起来就是一秒开外;如果用户在乌鲁木齐,机房在上海,单程距离逼近四千公里,数字还要再翻一倍。好比你住的小区附近没有超市,买瓶酱油都要开车去市中心总仓——单趟不算慢,架不住一天要跑几十趟。
【延迟的叠加:一次"普通"的页面打开】
你的浏览器 上海机房
│── DNS 在哪? ──────────→│ 往返 1
│── 建立连接(三次握手) ──→│ 往返 2
│── 我要 index.html ────→│ 往返 3
│←── 页面骨架 + 又要 40 张图 ──┤
│── 图1? 图2? 图3? … ───→│ 往返 4~44
每一次往返 = 距离 × 光速的硬开销
结论:想快,只有两条路——把路修近,或者把货搬过来
修路基本没戏(物理距离摆在那),所以整个行业选择了第二条路:把内容搬到离用户近的地方。这就是 CDN 存在的全部理由。
CDN 的核心思想:把总仓的货,铺到每个小区门口
这个生意模式其实老掉牙了。想象一家连锁超市:总仓负责压货和供货,但顾客从来不直接去总仓买东西——大家去的是家门口的门店,门店卖的是从总仓提前运来的现货。CDN 干的就是同一件事,只不过"货"换成了图片、视频、网页文件,"门店"换成了部署在各个城市的机房。
补一段真实的历史。1998 年,麻省理工学院的两个年轻人被一个数学问题困扰:为什么几百人同时访问一个网站,网站就崩了?他们意识到症结在于所有人都挤在同一个源头提货,于是提出反过来——把内容复制到离用户更近的多台服务器上,让大家分流取货。他们创办的公司叫 Akamai,今天已是全球最大的 CDN 厂商之一,全球部署了数千个边缘节点。这个"全世界的访问都挤总仓"的痛点,催生了价值千亿美元的行业——而它的原理,和你家楼下的连锁便利店一模一样。
这里有个关键角色转换值得单独强调:CDN 出现之前,机房是"生产车间",亲手服务每一个访客;CDN 出现之后,机房退居二线变成"总仓",真正每天见顾客的,是散布在全国各地的边缘节点。网站的形象没变、网址没变,变的是背后那张看不见的仓储网络。
一次"命中"是怎么发生的:导航带你找到最近的门店
那么具体流程是什么?你在浏览器里输入一个图片地址(比如 img.shop.com/shoes.jpg),接下来发生的事按时间顺序拆开看:
- 第一步:DNS 发现这是个"连锁店地址"网站把图片域名接入了 CDN,域名的解析记录里会指向 CDN 的调度系统(技术上叫 CNAME,说白了就是"这个门牌归连锁总部管")。你的电脑并不知道哪家门店最近——它把问题抛给了 CDN 的智能调度。
- 第二步:调度系统看你的"户口所在地"CDN 拿到你的 IP,判断你大致在哪个城市、走哪条线路(电信/联通/移动),然后从它的门店名单里挑出对你而言最快的一家,把那家门店的 IP 地址发还给你。这一步就是"就近调度"——相当于地图导航帮你跳过了所有远的门店。
- 第三步:你去最近的门店提货你的浏览器向这个节点发起请求。节点查自己的货架:这双鞋的图片,之前有人来买过,现货还在——直接发货给你。这就是命中,整趟下来可能只花几毫秒,因为你和节点在同一座城市。
- 第四步:店里没货怎么办——回源如果货架是空的(比如你所在城市的门店第一次遇到有人要这张图),节点就充当"代购":它替你跑一趟总仓(源站),拿到文件,先在你的城市上架一份,再发给你。这一趟叫回源——你多等了一点时间,但下一个同城用户从此就能命中了。
注意这套设计的精妙之处:回源不是故障,而是补货机制。每一次回源都会让货架更满一点。热门内容会在几十分钟内铺满全国门店,之后大家全部命中——源站安安稳稳地待在千里之外,几乎感觉不到访问压力。
【没有 CDN vs 有 CDN】
没有 CDN: 有 CDN:
(调度:挑离你最近的门店)
全国用户 ──┐ 你 ──→ 深圳节点 ✔有货 → 秒回
│ 广州用户 ──→ 广州节点 ✔有货 → 秒回
全国用户 ──┼──→ 源站(上海)💥挤爆 乌鲁木齐用户 ──→ 乌市节点 ✘没货
│ └→ 回源(上海) → 补货 → 返回
全国用户 ──┘ (下一个乌市用户开始命中)
命中率:便利店老板的生死线
衡量一个 CDN 干得好不好,最重要的指标叫命中率——一百个顾客上门,多少人是直接拿现货走的。命中率 95% 的门店,只有五个顾客需要等调货;命中率掉到 70%,三成顾客都在门口干等,而且总仓的发货压力一点没省。命中率既是速度问题,也是钱的问题:每一次回源都要消耗源站带宽,而源站带宽是整个系统里最贵的资源之一。
什么东西命中率高?热点内容天然命中率高——首页大图、热播剧集的当红片段、系统更新包,全国人民都在要同一份货,早就在每个门店铺满了。什么东西命中率高不起来?长尾内容——就像图书馆里几十万册藏书,绝大多数一年没几个人借。一万个人各看一部不同的冷门老电影,对 CDN 来说几乎等于一万次回源。所以你会看到视频网站把热门剧优先推上各个节点,而冷门资源常常"第一次打开慢、第二次就快了"——第一次是替全城回的源。
这个指标在站长手里的读法也值得说一句:CDN 后台的报表几乎都会给你一条命中率曲线和一张回源流量榜。命中率连续走低,先别急着加节点——多半是最近新上的内容没配好缓存规则,或者一批"本该静态的内容"被程序加上了随机参数(比如图片地址末尾挂了个时间戳),导致每个请求在节点眼里都成了"不同的货"。后一种情况在自建站里极其常见:参数一变,缓存全废,门店里全是"只卖一次"的孤品。查报表时顺着回源流量榜从高到低看 URL,十有八九能当场逮住元凶。
缓存的规矩:保质期、下架与提前铺货
既然是货架,就得有规矩。CDN 缓存有三条核心规矩,每条都能对应到门店经营:
- TTL:每件货自带保质期网站在文件里写明"这张图可以放货架 7 天"(技术上就是 HTTP 响应头里的缓存时间)。保质期没到,节点就理直气壮地不回源、不换新——哪怕源站已经把图换掉了,节点照样把旧图发给你。这不是 bug,这是契约:宁可旧一点,也要快很多。好比面包店不可能每卖一个面包都打电话问总厂今天配方改没改。
- 刷新:强制下架旧货真遇到"必须立刻换新"的场景(比如官网发了一条紧急更正),站长可以向 CDN 下"刷新"指令:指定某个文件在所有门店立即下架,下次有人来就回源拿新的。打个比方,这相当于总部一个电话,全国所有门店连夜撤下某个批次的问题商品。
- 预热:大促前连夜铺货双十一零点前,运营商会把即将开抢的商品图提前"推送"到全国节点,让所有门店提前把货架塞满。这个动作叫预热——赌的就是零点那一秒,绝不能让任何一个门店出现"回源排队"。没有预热,零点瞬间全国海量的首次访问会同时砸向源站,那正是 CDN 本来要防住的局面。
理解了 TTL,你就理解了互联网上一个经典"灵异事件":站长明明改了首页大图,用户却说看到的还是旧图。多数时候既不是服务器坏了也不是用户眼花,而是节点货架上的旧图还没过保质期。排查思路在后面"自检"一节会给出——先看响应头确认命中状态,再决定刷新,顺序别乱。
哪些货能搬,哪些不能:静态与动态的分界线
CDN 再神,也有搬不动的东西。分界线只有一条:所有人看到的都一样吗?
- 能搬的:对谁都一样的"标准商品"图片、视频、音乐、网页样式、脚本、App 安装包——这些东西发给谁都是同一个字节,天然适合铺到所有门店的货架上。这类内容叫静态内容,是 CDN 的主场。
- 搬不动的:千人千面的"代办业务"你的购物车、银行卡余额、微信聊天记录、外卖订单状态——每个用户打开看到的都不一样,根本没法"提前备货"。这类叫动态内容,还得老老实实回源站处理。便利店能卖标准可乐,但没法替每个顾客代办不同的银行业务。
那动态请求就只能裸奔千里吗?也不是。CDN 对动态请求提供一种"不存货、只抄近道"的服务,业内叫动态加速:内容还是源站现场生成,但请求走 CDN 内部的高速通道——好比你的快递不进任何门店分拣,但从网点直接上了只跑干线的冷链专车,中途不堵不绕。再加上连接复用(专车不空跑返程,回程顺便把响应捎回来),动态页面也能省下不少往返时间。所以一个真实网站往往是"两条腿走路":静态走节点货架,动态走高速直连,浏览器里一次加载其实同时用了两套机制。
视频为什么不卡:切片与自适应码率
CDN 最惊艳的应用是视频。一部两小时的电影动辄几个 GB,如果当成一个大文件从远端完整下载,你要么等半小时,要么边下边看、稍微卡一下就断流。今天的流媒体行业用了两招组合拳解决了它,而且两招都和 CDN 天生一对:
- 第一招:切片——大文件切成小杯装服务器提前把整部电影切成几千段、每段只有几秒钟的小文件(技术上就是 HLS/DASH 这类协议干的事)。播放器看一段、拿一段,永远只请求"接下来那几秒"。好比一大桶奶茶不直接给你,而是分装成一排小杯,喝完一杯再给一杯。对 CDN 来说这简直是量身定做:每个小切片都是标准静态文件,可以铺满全国货架,任意一段都能就近秒取。
- 第二招:自适应码率——路况不好就自动换小杯同一部电影会被压成好几档清晰度:蓝光的、高清的、流畅的。播放器一边播一边测你的网速,网速好就拿高清段,突然变差就无缝切到流畅段,缓过来再升回去——画面偶尔糊一下,但绝不卡死。你看到"画质自动忽高忽低",幕后就是这套机制在实时决策。
两招合起来,"视频不卡"才真正成立:切片让"就近取货"成为可能,自适应让"路况波动"不再致命,CDN 让"就近"落到几十公里以内。缺任何一环,体验都塌回十年前。顺带解释一个日常困惑:网络直播总有几秒到几十秒延迟,元凶正是切片。主播的画面要先攒出一段几秒的切片、再推上 CDN,观众才能看到——延迟是这套流畅体验的自然代价,和"卡"不是一回事。
削峰:热搜爆点那一小时的缓冲垫
CDN 还有一项容易被低估的本事:替源站挡住瞬间洪峰。想象某明星官宣上热搜,一个平时每秒几千访问的页面,一小时内涌进百倍流量。如果没有缓冲,源站当场过载宕机,热搜变成"404 事故"。而有 CDN 时的画风完全不同:
洪峰先砸在分布全国的几百个边缘节点上——每个节点只承受本地那一小片用户的压力,而且大家要的是同一份静态页,直接命中现货。真正流向源站的回源流量被压到一个很小的数目,甚至可以由 CDN 主动限流:排队放行、合并同类请求(同一秒一百个人要同一张图,就只回源一次)。相当于景区黄金周的限流闸机:门口排队放人进去,核心景点永远只接待承受得住的人数。双十一、春晚红包、突发新闻,每一次都靠这层缓冲垫扛过来的。
值得琢磨的是这套机制和"扩容"的对比。扛洪峰有两条路:一条是把源站机器加一百倍,洪峰过了全闲置——好比为了一年一次的黄金周,把景区停车场修到能停全城的车;另一条就是 CDN 这套"节点分散吸收 + 回源合并限流",平日不花冤枉钱,洪峰来时自动成型。两条路的账根本不用细算:把洪水在几百个路口分掉,永远比把堤坝修到一百米高便宜。
CDN 的另一面:门口的保安亭
既然全国流量都要先经过 CDN,那顺手在门口加一道安检就顺理成章了。现代 CDN 的安全能力有三样值得认识:
- DDoS 清洗:把洪水拦在小区外面攻击者用海量垃圾流量淹没网站(第 8 章细讲)。接了 CDN 后,这些垃圾会先撞上分布各地的节点网络——节点多、带宽池大,脏流量在各家门口就被稀释、过滤掉,源站毫发无损。这就是"高防"服务的底层原理之一:不是你家门变结实了,是洪水在几百个路口就被分掉了。
- WAF:进门先开包检查Web 应用防火墙守在门口,检查每个请求包里有没有夹带恶意代码(注入、伪造、爬虫扫描),可疑的直接拦下。相当于地铁安检——正常乘客无感,危险品进不去。
- 隐藏源站:门牌不外泄所有访客只看得到 CDN 的地址,源站的真实 IP 藏在身后。攻击者找不到你家门牌,想直接绕过门岗去砸总仓都无从下手。好比明星的收件地址只填代收点,真实住址从不暴露。
这也解释了为什么海外 Cloudflare 的免费套餐能养活无数个人网站:对小型站长而言,CDN 的安全属性往往比加速属性更刚需。
国内格局:CDN 是一门"持牌"生意
一件很多人不知道的事:在中国大陆经营 CDN 业务需要工信部颁发的经营许可证。从 2016 年起,CDN 与云服务一起被纳入持牌管理——想给别人的网站提供分发加速,先拿牌照。今天的国内市场格局大致是三股力量:云厂商系(阿里云、腾讯云、华为云,CDN 打包在云服务里卖)、专业厂商系(网宿这类经营了二十多年的老牌 CDN 公司)、以及面向出海企业的国际厂商(Akamai、Cloudflare、Fastly)。企业选型时牌照合规是硬前提,其次才轮到节点质量、调度精度和价格。
个人站长还应该知道一个现实差异:海外免费 CDN 的节点大多在境外,中国大陆用户访问它,反而可能先绕出海再回来,慢上加慢。所以"白嫖海外免费 CDN 给国内用户加速"这条流传甚广的省钱经,多数时候是个美丽的误会——给谁加速,就用谁家门口的节点。
如果你只记住这一节的一个画面,请记住这个:CDN 就是一张覆盖全国的连锁便利店网络,你每天刷的一切静态内容,都是从离你最近的那家门店取的。
① 源站是中央大仓。网站的机房不再直接面对顾客,它退到幕后专心压货——总仓越清静,整个体系越健康。
② 边缘节点是每个小区门口的门店。导航(就近调度)看你从哪来,把你引向最快到的那家店;三千公里的距离,被缩短成了家门口的五百米。
③ 货架规矩三条。命中是现货直取;回源是断货时替你跑一趟总仓,顺手补货;TTL 是保质期——没到期不换新,所以"改图不生效"先查保质期,再强制下架(刷新),大促前还要连夜铺货(预热)。
④ 两类货两条路。标准商品(静态内容)铺满货架人人可取;千人千面的代办业务(动态内容)没法备货,但可以走不进店的冷链专线(动态加速)抄近道。
⑤ 门店还兼着门岗。洪水在几百个路口被分掉(DDoS 清洗),包裹开箱检查(WAF),总仓门牌永不外泄(隐藏源站)。
这张便利店地图记住了,本节的所有名词就都挂在上面了:总仓供货、门店备货、货架有保质期、热点先铺、长尾现调、动态走专线、门岗拦洪水。
站长视角:接入 CDN 前要过一遍的 Checklist
如果你自己有网站想接入 CDN,别只点"开通"按钮就完事,四件事按顺序过一遍:
- 静态资源单独用一个域名把图片、脚本、样式收拢到类似
img.你的域名.com的专属子域名再接入 CDN,主站域名保持直连。这样缓存规则一刀切得干净,将来排查问题时也能一眼分清"哪部分走了门店、哪部分直连总仓"。 - 缓存规则分层设置不同文件设不同 TTL:图片这类万年不变的长存(一年都行),CSS/JS 带版本号中等,HTML 短保命(几分钟)。好比超市里生鲜日配每日换、罐头食品囤半年——一刀切的保质期必然顾此失彼。
- HTTPS 证书交给 CDN 托管全站加密时代,CDN 节点要代替源站面对用户,证书得部署在节点上(现在主流厂商都支持自动签发续期,别手动传旧证书)。
- 回源链路自己保护好只允许 CDN 节点的 IP 回源(白名单),防止有人绕过门岗直捣源站;重要资源加防盗链校验,免得被别的网站白嫖你的带宽。门岗的价值一半在拦外人,一半在拦"绕门岗的人"。
动手自检:亲眼看一次"就近调度"
空口无凭,用一条命令验证今天讲的东西。打开命令提示符(Windows 按 Win 键输入 cmd),运行下面这条,看看一个大站会解析到哪些 IP:
看输出的"地址"一栏——它显示的并不是某台"唯一服务器",而是 CDN 就近调度给你的节点入口。最有说服力的玩法:把这条命令发给一个外地的朋友(或用手机流量换网络)跑一遍,对比两边的地址:同一个域名、不同城市,解析出的节点 IP 大概率不一样——这就是"导航带你去最近门店"的现场证据。再进一步,用 curl -I 某网址 看响应头,不少网站会带上类似 X-Cache 的字段,值里写着 HIT(命中)或 MISS(回源)——你亲眼就能看到自己是"现货直取"还是"临时调货"的那一个。响应头里常还有一个 Age 字段,含义特别直白:这份货在门店货架上已经摆了多少秒。连续刷新几次看它增长,你能真真切切地"看着保质期倒数"——第一次访问时 Age 是 0(刚回源补的货),多刷几次它就慢慢涨上去。零成本,一分钟,本节讲的所有机制当场变成你屏幕上跳动的数字。
常见误区:四条流传最广的 CDN 迷信
- 误解一:"上了 CDN,网站就一定快"CDN 只优化两样:路(就近)和静态货(缓存)。如果你的网站是动态生成、源站本身算得慢,CDN 一点忙都帮不上——门店再近,柜台办事慢照样排队。先分清慢在哪一段,再决定吃什么药。
- 误解二:"改了内容没生效,是服务器坏了"九成情况是节点货架上的旧货还没过保质期(TTL 未到)。先看响应头确认命中状态,再对单个 URL 做刷新——顺序对了,五分钟解决;顺序错了,重启一晚上服务器也没用。
- 误解三:"免费 CDN 是万能省钱神器"海外免费套餐的节点不在境内,国内用户访问可能更慢;而且免费档的回源流量、安全防护都有天花板,正经生意别把命脉押在赠品上。
- 误解四:"节点数量越多越强"比数量更重要的是调度准不准、节点质量稳不稳、回源链路畅不畅通。门店开得多但导航总带你绕路,体验反而更差。选型看实测,不看宣传页上的数字。
一句话送给你:三个判断"该不该上 CDN"的抓手
这一节名词不少,但落到决策上,真正值得带走的就三条:第一,看内容构成——图片视频脚本占大头、内容对所有人一样的,CDN 是质变;页面全是千人千面动态内容的,先优化源站再说。第二,看用户分布——用户散布全国的,就近调度价值巨大;用户全在同一座城、源站也在同一座城的,CDN 意义有限。第三,看扛不扛得住突发——有上热搜、上大促可能的,那层削峰缓冲垫和门岗安检,比"快"更救命。好比装修房子先想清楚自己要什么再买建材,而不是看见什么促销囤什么。把这三个抓手记住了,CDN 对你来说就不再是一个神秘缩写,而是一张随时能调用的地图。
一句话总结:CDN 是把内容从千里之外的源站,提前铺到离你几十公里的边缘节点的全国连锁系统——用"就近取货"消灭光速距离带来的延迟,用"货架缓存"扛住热点洪峰,顺手还在门口当保安。
机制上记住五件事:
· 延迟是硬约束:光速决定了距离没法谈判,一次页面打开几十个来回,远就是慢——所以要把货搬过来。
· 命中与回源:货架有货直接发(命中),没货替你跑总仓顺手补货(回源);热点天然高命中,长尾注定多回源。
· TTL 是双刃剑:保质期带来了速度,也带来"改图不生效"的经典误会——先看响应头,再刷新。
· 静态铺货、动态抄近道:内容对谁都一样的才缓存;千人千面的走动态加速专线。
· 安全是送的:DDoS 清洗、WAF、隐藏源站,流量必经之地天然适合设卡。
· 视频不卡的组合拳:切片让就近取货成为可能,自适应码率让路况波动不再致命,直播延迟正是切片的代价。
下一步:这一节讲的是"内容怎么搬到离用户最近的边缘"。下一节把视角拉回云上:当你的服务器本身也搬进机房集群时,它在云里的"私人领地"怎么规划——虚拟私有云 VPC(子网、安全组、路由表)正是 § 7.2 的故事。