CDN的基础架构及缓存控制

兔子高防CDN:(免费版开放中)ddos高防,CC防御,免备案,全行业接入,香港CN2在内的海量节点.


CDN 这个概念是我在上大学期间没有接触过的,工作中第一次接触这个东西的时候,谈到CDN的三级缓存策略。我第一反应:这不就是 CPU 的 L1/L2 cache 嘛。现在想来,不管是网络还是计算机体系结构,很多设计原理都是想通的:传输瓶颈在哪里,就在哪里设计缓存。一级缓存不够,就设计多级缓存,同时利用各种缓存调度算法,提高命中率。这就是CDN很重要的一个应用。


CDN 基础架构



各家的 CDN 基本上都是这个结构,请求到边缘节点,边缘未命中就会回 L2 或者 L3节点。还没有资源就会回源站取资源,然后再存储到边缘节点上。

CDN中,最重要的就是缓存这个东西,了解浏览器和 HTTP 是怎么控制缓存的非常重要。 接下来我们就来看下缓存控制策略。



HTTP缓存控制策略


强制缓存

控制强制缓存的字段分别是Expires和Cache-Control,其中Cache-Control优先级比Expires高。


协商缓存

协商缓存就是强制缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器根据缓存标识决定是否使用缓存的过程。 控制协商缓存的字段分别有:Last-Modified / If-Modified-Since和Etag / If-None-Match,其中Etag / If-None-Match的优先级比Last-Modified / If-Modified-Since高。



CDN缓存控制

如果源站设置了 no-cache 、private、 max-age = 0 都遵循源站,CDN 是不会进行缓存的。

如果源站返回的vary头包含cookie每次刷新cookie的值都在变,所以cache命中不了。



需要注意的点

Cache-Control:请求头和响应头都可以设置,控制网页缓存

public:所有内容都将被缓存(客户端和代理服务器都可缓存)

private:所有内容只有客户端可以缓存,Cache-Control的默认取值。

no-cache:客户端缓存内容,是否使用缓存则需要经过协商缓存来验证决定。即需要向服务器确认缓存是否是最新

no-store:所有内容都不会被缓存,即不使用强制缓存,也不使用协商缓存

max-age:max-age=xxx (xxx is numeric)表示缓存内容将在xxx秒后失效

强制缓存优先于协商缓存进行,若强制缓存(Expires和Cache-Control)生效则直接使用缓存,若不生效则进行协商缓存(Last-Modified / If-Modified-Since和Etag / If-None-Match),协商缓存由服务器决定是否使用缓存,若协商缓存失效,那么代表该请求的缓存失效,返回200,重新返回资源和缓存标识,再存入浏览器缓存中;生效则返回304,继续使用缓存。

强制刷新 (command+shift+R):浏览器不使用缓存,因此发送的请求头部均带有 Cache-control: no-cache(为了兼容,还带了 Pragma: no-cache),服务器直接返回 200 和最新内容。