前言

本人以前在CDN厂商蓝汛就职过一年时间,利用脑子里还残留的一些CDN知识,结合现有的书籍材料,写点东西。

what's the CDN

CDN(content delivery Network) 是一个复杂的系统,我们进行简化抽象来看,就能用下面几步来简单概括:

我们模拟北京电信用户访问www.ljf.info为例

  1. 北京电信用户请求首选DNS服务器(北京电信DNS服务器),要求解析www.ljf.info。
  2. 如果北京电信DNS服务器没有该域名的缓存,就从该域名的权威域名服务器。如果有这个域名解析记录的缓存,直接返回
  3. ljf.info的权威域名服务器根据DNS视图技术,根据发起请求的源IP,把www.ljf.info解析到北京电信CDN节点上。
  4. 北京电信用户访问到北京电信CDN节点。
  5. 北京CDN节点如果有网民访问的内容,就直接返回,没有的话,回源站取,返回给网民并且自己本地保留一份。

通过上面五步,CDN系统的2个关键技术分别如下:

  • DNS调度技术

    这个技术能够让来自不同区域、运营商的网民调度到距离网民最近的不同的CDN节点。
  • CDN节点缓存代理技术
  1. 所谓的缓存技术,就是该节点上如果有网民访问的未过期的网页资源,则它就直接返回给网民,减少网民访问的时间开销。
  2. 所谓的代理技术,如果该节点上没有对应的资源,或者资源过期,则他会请求源站内容后再返回给网民。

    缓存和代理技术优化了已经缓存的传输效率,对于某些不能够缓存的资源,如动态的登陆请求,将其优化网民和源站的链路,减少延时和丢包率。
典型的架构

架构讲解

  1. 负载均衡组:

    使用LVS的DR模式实现4层的网络负载均衡。使用DR模式的网络负载,主要优点在于实现高吞吐量以及屏蔽后端Nginx代理服务器中单台宕机对业务的影响。
  2. Nginx/Haproxy代理服务器

    使用Nginx反向代理技术(upstream),配置url_hash的方式提高后端squid缓存服务器组的缓存命中率,同时也能够对squid做建康检测,剔除宕机的服务器。
  3. squid缓存服务器

    根据HTTP协议中的有关缓存设置的规定,实现对页面和资源进行缓存的关键功能业务。通过改组服务器,可以实现缓存文件的快速响应和对源站的代理。

了解HTTP协议中的缓存控制指令和原理,是构建squid缓存的必要步骤。所以下面我们将下HTTP协议的缓存控制。

当然,有些CDN公司并不是这样的架构,而是这样的:


理解HTTP协议中的缓存控制

HTTP协议是采用客户端(request),服务器端响应(Response) 模型。在响应中,都能够通过相关控制指令对对端的缓存行为进行管理。首先要关心的是服务器端响应中的缓存控制头部,利用这些头部控制信息可以精细化地管理客户端缓存行为。

下面使用wget命令来看一个简单的列子。

[root@localhost ~]# wget -SO /dev/null "http://www.baidu.com"
--2016-11-06 21:03:44-- http://www.baidu.com/
Resolving www.baidu.com... 61.135.169.121, 61.135.169.125
Connecting to www.baidu.com|61.135.169.121|:80... connected.
HTTP request sent, awaiting response...
HTTP/1.1 200 OK
Server: bfe/1.0.8.18
Date: Sun, 06 Nov 2016 13:03:44 GMT
Content-Type: text/html
Content-Length: 2381
Last-Modified: Mon, 25 Jul 2016 11:11:20 GMT ①
Connection: Close
ETag: "5795f3d8-94d" ②
Expires: Sat,09 Jan 2016 07:47:23 GMT ③
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform ④
Pragma: no-cache
Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
Accept-Ranges: bytes
Length: 2381 (2.3K) [text/html]
Saving to: “/dev/null” 100%[======================================================================================>] 2,381 --.-K/s in 0.001s 2016-11-06 21:03:44 (4.40 MB/s) - “/dev/null” saved [2381/2381]

下面对①,②,③,④标注的内容进行详解:

  1. Last-Modified: Mon, 25 Jul 2016 11:11:20 GMT

    表示该文件的最后修改时间是Mon, 25 Jul 2016 11:11:20 GMT。客户端在后续需要请求该文件的时候,使用对应的请求头部If-Modified-Since:Mon, 25 Jul 2016 11:11:20 GMT 就可以验证服务器端的文件是否发生了变化,可以使用下面的命令去验证.
[root@localhost ~]# wget --header="If-Modified-Since: Mon, 25 Jul 2016 11:11:20 GMT"   -SO /dev/null "http://www.baidu.com/"

如果服务器端文件没有在此时间后没有发生变化,则服务器端不需要重新发送整个文件,而只需要发送"304 Not Modified" 通知客户端即可。节省传输文件的带宽和时间

  1. ETag: "5795f3d8-94d"

    相当于该静态资源的ID,在Web服务器器Nginx中,Etag值是基于文件的最后修改时间和文件大小(字节)计算出来的。浏览器在下一次请求该资源的过程中。使用If-None-Match:“5795f3d8-94d” 就可以确定这个资源是否发生了变化。服务器端再次验证,如果未变化,则直接返回给客户端 HTTP/1.1 304 Not Modified , 则不需要再次传输整个文件,祈祷缓存的作用。命令如下所示:
[root@localhost ~]# wget --header='If-None-Match: "5795f3df-94d"'   -SO /dev/null "http://www.baidu.com/"
--2016-11-06 21:25:00-- http://www.baidu.com/
Resolving www.baidu.com... 61.135.169.121, 61.135.169.125
Connecting to www.baidu.com|61.135.169.121|:80... connected.
HTTP request sent, awaiting response...
HTTP/1.1 200 OK
Server: bfe/1.0.8.18
Date: Sun, 06 Nov 2016 13:25:00 GMT
Content-Type: text/html
Content-Length: 2381
Last-Modified: Mon, 25 Jul 2016 11:11:30 GMT
Connection: Close
ETag: "5795f3e2-94d"
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Pragma: no-cache
Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
Accept-Ranges: bytes
Length: 2381 (2.3K) [text/html]
Saving to: “/dev/null” 100%[======================================================================================>] 2,381 --.-K/s in 0.001s 2016-11-06 21:25:00 (3.34 MB/s) - “/dev/null” saved [2381/2381]
  1. Expires: Sat,09 Jan 2016 07:47:23 GMT

    服务器端告诉客户端,在Sat,09 Jan 2016 07:47:23 GMT之前需要获取该资源时,不必要在发起HTTP请求,直接使用这个缓存文件即可。
  2. Cache-Control: private, no-cache, no-store, proxy-revalidate,

    这样出现no-cache一般都是不缓存的,每次访问都需要从服务器上获取,还有一种是“Cache-Control: max-age=86400”,这个表示从收到这个网页资源的864000秒之内,都可以重复使用,不需要再访问网站。

如有问题请与本人联系,18500777133@sina.cn

CDN网络(一)之典型的CND架构与HTTP协议的缓存控制的更多相关文章

  1. 一张图说明CDN网络的原理

    原文: http://blog.csdn.net/coolmeme/article/details/9468743 1.用户向浏览器输入www.web.com这个域名,浏览器第一次发现本地没有dns缓 ...

  2. CDN网络的原理

    来源:http://blog.csdn.net/coolmeme/article/details/9468743 版权声明:本文为博主原创文章,未经博主允许不得转载. 1.用户向浏览器输入www.we ...

  3. cdn网络加速

    CDN全称Content Delivery Network,即内容分发网络.其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快.更稳定.通过在网络各处放置节点服 ...

  4. CDN网络原理

    1.用户向浏览器输入www.web.com这个域名,浏览器第一次发现本地没有dns缓存,则向网站的DNS服务器请求: 2.网站的DNS域名解析器设置了CNAME,指向了www.web.51cdn.co ...

  5. CDN网络科普小文(小说版)

    引言 作为公司 cdn 小组的一名小码仔,我为写一篇 cdn 的科普文章准备了好一段时间(大概有一个多月没有更新我的社交账号了). 在我刚进入公司,培训完,进入小组,了解到我们做的是 cdn 相关的工 ...

  6. 【RL-TCPnet网络教程】第41章 HTTP超文本传输协议基础知识

    第41章      HTTP超文本传输协议基础知识 本章节为大家讲解HTTP(HyperText Transfer Protocol,超文本传输协议),从本章节开始,正式进入嵌入式Web的设计和学习. ...

  7. 分层架构下的纯JDBC事务控制简单解决方案【转】

    http://blog.csdn.net/qjyong/article/details/5464835 对目前的JavaEE企业应用开发来说,基本都会采用分层的架构, 这样可以分散关注.松散耦合.逻辑 ...

  8. Android okHttp网络请求之缓存控制Cache-Control

    前言: 前面的学习基本上已经可以完成开发需求了,但是在项目中有时会遇到对请求做个缓存,当没网络的时候优先加载本地缓存,基于这个需求我们来学习一直okHttp的Cache-Control. okHttp ...

  9. UNIX网络编程——分析一帧基于UDP的TFTP协议帧

    下图是UDP的段格式: 相比TCP段格式,UDP要简单得多,也没啥好说的,需要注意的是UDP数据长度指payload加上首部的长度. 下面分析一帧基于UDP的TFTP协议帧: 以太网首部 0000: ...

随机推荐

  1. TextBoxFor控件的扩展---Bootstrap在mvc上的应用

    TextBoxFor控件的问题: 1:自带了样式,再用bootstrap样式会有冲突. 2:要加水印,js事件,限制输入长度比较麻烦. 因此需要对textboxfor控件进行扩展. 目标: 1:能使用 ...

  2. NLPIR分词工具的使用(java环境下)

    一.NLPIR是什么? NLPIR(汉语分词系统)由中科大张华平博士团队开发,主要功能包括:中文分词,词性标注,命名实体识别,用户词典功能,详情见官网:http://ictclas.nlpir.org ...

  3. JavaScript学习笔记- 正则表达式常用字符集及方法

    正则表达式修饰符(修饰符 可以在全局搜索中不区分大小写) i(ignoreCase)执行对大小写不敏感的匹配 g (global)     执行全局匹配(查找所有匹配而非在找到第一个匹配后停止) m( ...

  4. getopt

    头文件 #include<unistd.h> 定义函数 int getopt(int argc,char * const argv[ ],const char * optstring); ...

  5. SharedPreferences保存数据

    1.使用SharedPreferences保存数据方法如下: //实例化SharedPreferences对象(第一步) SharedPreferences mySharedPreferences= ...

  6. Cause: org.apache.ibatis.reflection.ReflectionException: Could not set property 'orderdetails' of 'class com.luchao.mybatis.first.po.Orders' with value 'Orderdetail [id=null, ordersId=3, itemsId=1, it

    从上面异常的解释来看是因为反射不能将Orders设置到orderdetails属性上,仔细检查了MyBatis的配置文件,发现: <collection property="order ...

  7. overlay-1

    .overlay-shadowbox{ visibility:hidden; position:absolute; display:block; margin:0; padding:0; top:0; ...

  8. 【CodeVS 3289】【NOIP 2013】花匠

    http://codevs.cn/problem/3289/ dp转移,树状数组维护前缀max和后缀max进行优化,$O(nlogn)$. #include<cstdio> #includ ...

  9. Edge Model

    三种edge Step (阶梯) Ramp (坡) Roof 因为噪声的存在, ramp edge是最常见的. 一阶和二阶算子在ramp edge处的表现 一阶和二阶算子对噪声的敏感性 从上自下, 高 ...

  10. 数据库开发基础-SQl Server 主键、外键、子查询(嵌套查询)

    主键 数据库主键是指表中一个列或列的组合,其值能唯一地标识表中的每一行.这样的一列或多列称为表的主键,通过它可强制表的实体完整性.当创建或更改表时可通过定义 PRIMARY KEY约束来创建主键.一个 ...