建站绕不开 CDN,但它到底在网络上加了什么、为什么访问就变快了,值得完整梳理一遍。CDN 全称 Content Delivery Network,内容分发网络:在现有 Internet 上叠一层新架构,把网站内容发布到最接近用户的网络”边缘”(边缘服务器),用户就近取内容,从而缓解网络拥挤、提高响应速度,技术上解决带宽小、访问量大、网点分布不均造成的访问慢。
原理的起点
CDN 技术最早在美国兴起,基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,让内容传得更快、更稳。做法是在网络各处放置节点服务器,在现有互联网之上构成一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息,把用户请求重新导向离用户最近的服务节点。
网络架构分两大块:中心指 CDN 网管中心和 DNS 重定向解析中心,负责全局负载均衡,设备装在管理中心机房;边缘主要指异地节点,是 CDN 分发的载体,由 Cache 和负载均衡器等组成。换个说法:CDN 是为在传统 IP 网上发布宽带丰富媒体而特别优化的网络覆盖层,广义上代表一种基于质量与秩序的网络服务模式。它是一个策略性部署的整体系统,包括分布式存储、负载均衡、网络请求重定向和内容管理 4 个要件。
四个要件逐个拆
分布式存储
存储资源分布到各个地理位置、各个网段,把 CDN 分发的文件和数据库表记录存起来持续服务。存储采用三级架构:核心存储、CDN 服务节点分布式缓存、终端本地缓存。任意一个点的存储崩溃或失效,不影响系统服务的可用性。
![图片[1]-什么是CDN?它的原理是什么?-本站](https://i1.img.azhai.de/upload/d766b54becf25d99-23-02-19-1.png?)
以国内环境为例,CDN 系统在 5 大运营商(中国电信、中国网通、中国铁通、中国移动、中国联通)以及 2 大专有网络(中国教育和科研计算机网、中国科技网)都布有节点,消除不同运营商互联瓶颈的影响,实现跨运营商加速,各网络里的用户都能拿到不错的访问质量。
内容管理
内容管理和全局网络流量管理(Traffic Management)是 CDN 的核心。内容服务基于缓存服务器,也叫代理缓存(Surrogate),位于网络边缘,距用户仅”一跳”(Single Hop)之遥;代理缓存是内容提供商源服务器(通常在 CDN 服务商的数据中心)的透明镜像。据统计,CDN 能处理整个网站页面 70%~95% 的内容访问量,减轻源站压力,提升性能和可扩展性。
负载均衡
负载均衡系统实现 CDN 的内容路由功能:把用户请求导向整个网络中的最佳节点,选择策略可以是距离最近、节点负载最轻等。它分两层:
- 全局负载均衡(GSLB):在整个网络范围内把请求定向到最近的节点或区域,主要功能是就近性判断。判断方式有静态的(按 IP 地址配置表做 IP 到 CDN 节点的映射)和动态的(让节点实时探测到目标 IP 的距离,以 RRT、Hops 作度量单位,再比较结果),两者也可综合使用。
- 本地负载均衡(SLB):局限在一定区域内,找一台最适合的节点服务,决策依据是 CDN 节点的健康性、负载情况、支持的媒体格式等运行状态。获取 Cache 设备状态的方法:主动探测(SLB 与 Cache 无协议交互接口时,用 ping 等命令发起探测并分析返回),或协议交互(按事先定义的协议实时交换状态信息)。协议交互比探测准确可靠,但目前没有标准协议,各家多为私有协议,互通困难。
实现手段主要有 DNS、应用层重定向、传输层重定向等。
网络请求的重定向
用户访问接了 CDN 的资源时,DNS 域名服务器通过 CNAME 方式把最终域名请求重定向到 CDN 里的智能 DNS 负载均衡系统;它按一组预先定义的策略(内容类型、地理区域、网络负载状况等),把当时能最快响应用户的节点地址返回给用户。同时它与所有 CDN 节点保持通信、搜集健康状态,确保不会把请求分配到已不可用的节点。
两个实际问题
挂 CDN 后怎么拿客户端真实 IP
接入后源站收到的请求都来自 CDN 节点,原始 IP 变了。一般 CDN 节点会把源客户端 IP 以某种方式传给源站,比如有的网宿 CDN 把源 IP 加进一个叫 “Cdn-Src-Ip” 的 Http Header,以 C# 为例(不同 CDN 提供商可能不一样):
String srcIp = Request.Headers["Cdn-Src-Ip"];
if(srcIp == null) {
srcIp = Request.UserHostAddress;
}
也可以从 HTTP 请求 Header 的 “HTTP_X_FORWARDED_FOR” 字段取,它的值形如 “原始真实IP,1层代理IP,2层代理IP,…”。判断该字段是否为空(没走 CDN 或代理时为空),非空就取第一段作为客户端 IP,简单有效;多层代理这类复杂情况不在这里处理。
内容更新和同步怎么保证
节点内容与源站的同步靠刷新时间策略:更新频率低的内容设较长刷新时间,减轻回源压力;频繁更新的内容设 10 分钟或更短。刷新时间可按目录、按具体 URL、按关键字段设置,相当灵活。
给自己站点上 CDN 时
原理落到操作上就三条:登录统计和防刷逻辑要按上面的方法改造,不然日志里全是节点 IP;缓存规则要按内容更新频率分层设置,动态接口一般不缓存;就近性、回源带宽这些由服务商负责,自己能控制的是刷新策略和头部字段解析。















暂无评论内容