作为前端er,辛辛苦苦搬完砖,好不容易上线之后,正准备告一声万事大吉,回家吃鸡。忽然qa/pm/老板问,为什么我这里还是没有更新?只能是弱弱的回一声,清个缓存看看?或者还有那么一天,发现大部分区域都是好的,只有某些区域是旧的,这就要讨论一个叫CDN的东西了。

背景

说个最经典的结论,无论什么东西,传输都需要时间。这个应该都不会有疑问。
我们的网络而言,有两个用户,一个在海角天边,一个就用内网坐在你跟前,你说他们的体验会不会有差别。这里就不说结论了,应该比较清晰。
关键在于如何解决这个问题,最理想化的,海角天边的跟前要是也有个相同服务器不就完了。
就是这么朴素的道理,这样就引出了CDN。

CDN定义

CDN的全称是Content Delivery Network,即内容分发网络。
能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。
已达到一下三点:

  1. 使用户可就近取得所需内容,
  2. 解决 Internet网络拥挤的状况,
  3. 提高用户访问网站的响应速度。

从技术上全面解决由于网络带宽小、用户访问量大、网点分布不均等原因,解决用户访问网站的响应速度慢的根本原因。

CDN基本原理

在看CDN如何解决之前,先回头看下经典的问题,用户输入url回车之后会发生什么。
对于未使用CDN之前,如下图所示:

注:本图来源见水印,比较经典的图就不自己瞎画了
大概有这么几个步骤:

  1. 用户输入url(显然不能是ip,毕竟一串数字太难记了)
  2. 本地DNS系统解析域名
  3. 本地DNS服务器如果有缓存,直接响应用户请求
  4. 本地DNS服务器没有,则递归查询DNS服务器,响应用户操作
  5. 浏览器获得DNS解析结果,即url对应的ip地址(dns就是维护域名和ip对应关系的)
  6. 浏览器相对应服务器发出请求
  7. 服务器将正确响应返回给用户

这样来看,有这么几个地方需要考虑:
请求直接到达服务器上,存在传输距离的问题。
每次直接请求服务器,响应速度可以优化。
流量直接打到服务器上,存在超负荷的可能。

引入cdn之后整个流程如下:

  1. 当用户点击网站页面上的内容URL,经过本地DNS系统解析,DNS系统会最终将域名的解析权交给CNAME指向的CDN专用DNS服务器。
  2. CDN的DNS服务器将CDN的全局负载均衡设备IP地址返回用户。
  3. 用户向CDN的全局负载均衡设备发起内容URL访问请求。
  4. CDN全局负载均衡设备根据用户IP地址,以及用户请求的内容URL,选择一台用户所属区域的区域负载均衡设备,告诉用户向这台设备发起请求。
  5. 区域负载均衡设备会为用户选择一台合适的缓存服务器提供服务,选择的依据包括:根据用户IP地址,判断哪一台服务器距用户最近;根据用户所请求的URL中携带的内容名称,判断哪一台服务器上有用户所需内容;查询各个服务器当前的负载情况,判断哪一台服务器尚有服务能力。基于以上这些条件的综合分析之后,区域负载均衡设备会向全局负载均衡设备返回一台缓存服务器的IP地址。
  6. 全局负载均衡设备把服务器的IP地址返回给用户。
  7. 用户向缓存服务器发起请求,缓存服务器响应用户请求,将用户所需内容传送到用户终端。如果这台缓存服务器上并没有用户想要的内容,而区域均衡设备依然将它分配给了用户,那么这台服务器就要向它的上一级缓存服务器请求内容,直至追溯到网站的源服务器将内容拉到本地。

CDN术语详解

源站

提供内容的原始站点,也就是我们的服务器

中心接点

包括CDN网管中心和全局负载均衡DNS重定向解析系统,负责整个CDN网络的分发及管理。
主要作为内容分发和边缘未命中时的服务点

边缘节点

主要指异地分发节点,由负载均衡设备、高速缓存服务器两部分组成。
简单概括就是离用户最近的节点。主要作为直接向用户提供服务的节点。

CDN缓存

CDN边缘节点缓存策略因服务商不同而不同,但一般都会遵循http标准协议,通过http响应头中的 Cache-control: max-age的字段来设置CDN边缘节点数据缓存时间。

当用户向CDN发出请求时,CDN阶段会判断资源是否过期,未过期直接使用缓存(这也就提升了响应速度)。如果认为资源过期,那么就会向实际服务器去请求新的资源,即发生回源。

回源

CDN从源站获取最新资源的过程即为回源,该过程会同时更新本地缓存资源,并将新的资源返回给用户。
当然对于回源我们是要不推荐的,搭建CDN除了必要情况下,当然希望都走节点缓存。如果回源率过高可以参考这里看看CDN 命中率、回源率常见问题

刷新CDN缓存

对于新资源上线,为了确保所有节点都能访问最新资源,需要主动失效CDN缓存。CDN运营商都会暴露主动刷新的接口,一般公司运维也会暴露出刷新CDN的接口的,已解决CDN缓存不主动更新问题。

流量劫持

什么叫流量劫持,比较笼统的说只要是对请求及数据进行篡改、转发的都可以认为是流量劫持。
其实CDN也是一种流量劫持,其通过DNS解析将域名匹配到最近的服务器上。
不过这是一种主动已知的劫持,目的为更好的用户体验。
恶意的劫持一般分为两类:

DNS劫持

又称域名劫持,是指在劫持的网络范围内拦截域名解析的请求,分析请求的域名,把审查范围以外的请求放行,否则返回假的IP地址或者什么都不做使请求失去响应,其效果就是对特定的网络不能反应或访问的是假网址。
常见实现也是通过污染路由器等中间链路,将解析请求进行篡改。

数据劫持

数据劫持是指针对明文传输的内容发生。
用户发起HTTP请求,服务器返回页面内容时,经过中间的运营商网络,页面内容被篡改或加塞内容,强行插入弹窗或者广告。
如何预防?
行业内解决的办法即是对内容进行HTTPS加密,实现密文传输,彻底避免劫持问题。

CDN劫持

理想情况下,CDN 的安全性应该和我们的服务器一致,但如果,CDN 和用户之间、CDN服务器之间,走明文的htttp协议也是会出现数据劫持的现象。

结束语

参考文章

http://book.51cto.com/art/201205/338756.htm
https://www.zhihu.com/question/36514327?rf=37353035
http://hpoenixf.com/DNS%E4%B8%8ECDN%E7%9F%A5%E8%AF%86%E6%B1%87%E6%80%BB.html
https://segmentfault.com/a/1190000010631404
https://zhuanlan.zhihu.com/p/40682772
本着学习的态度,从上面各种大神的文章中受益匪浅,再次感谢上述文章作者。汇总一下作为自己的解惑笔记,希望也能对其他人有所帮助。

CDN拾遗的更多相关文章

  1. Azure中国CDN全球覆盖功能初探

    在不久前的4月初,Azure中国官网上简短地发布了其CDN中“标准版 Zone 2”功能.一开始笔者尚有些摸不着头脑,这个“Zone 2”具体指的是什么呢?好在后来官网更新了信息描述如下: 这下就比较 ...

  2. 百度MIP移动页面加速——不只是CDN

    MIP是用CDN做加速的么?准确答案是:是,但不只是. MIP全称Mobile Instant Pages,移动网页加速器,是百度提出的页面加速解决方案.MIP从前端渲染和页面网络传输两方面进行优化, ...

  3. 【初码干货】使用阿里云对Web开发中的资源文件进行CDN加速的深入研究和实践

    提示:阅读本文需提前了解的相关知识 1.阿里云(https://www.aliyun.com) 2.阿里云CDN(https://www.aliyun.com/product/cdn) 3.阿里云OS ...

  4. 阿里云系列——6.给你的域名使用CDN加速(详细步骤+简单配置)

    网站部署之~阿里云系列汇总 http://www.cnblogs.com/dunitian/p/4958462.html 进入管理页面:https://home.console.aliyun.com/ ...

  5. Signalr系列之虚拟目录详解与应用中的CDN加速实战

    目录 对SignalR不了解的人可以直接移步下面的目录 SignalR系列目录 前言 前段时间一直有人问我 在用SignalR 2.0开发客服系统[系列1:实现群发通讯]这篇文章中的"/Si ...

  6. Redis命令拾遗二(散列类型)

    本文版权归博客园和作者吴双共同所有,欢迎转载,转载和爬虫请注明原文地址 :博客园蜗牛NoSql系列地址  http://www.cnblogs.com/tdws/tag/NoSql/ Redis命令拾 ...

  7. CDN模式介绍

    body{ font: 16px/1.5em 微软雅黑,arial,verdana,helvetica,sans-serif; }        CDN(content delivery networ ...

  8. 基础拾遗------redis详解

    基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...

  9. 前端CDN公共库

    通过使用公共的CDN脚本和样式库,可以在一定程度上加速访问.节省服务器流量.提升你的网站用户体验.本文将介绍国内比较常用的几种免费的CDN库,包括百度.新浪.360.又拍和七牛等. 百度CDN公共库 ...

随机推荐

  1. ios蓝牙详解

    最近这段时间在研究蓝牙,也研究了一段时间了现在在下面做个总结 1 其实蓝牙连接只要明白了整体原理,其实挺简单的  2 大部分情况下,手机作为中心管理者,而连接的设备被称为外设,外设的结构有点像一颗大树 ...

  2. 【DOS】文件统计命令

    1. 统计当前文件夹下文件的个数 ls -l|grep "^-"|wc -l 2. 统计当前文件夹下目录的个数 ls -l|grep "^d"|wc -l 3. ...

  3. java多线程机制中的Thread和Runnable()区别

    1.java语言使用Thread类及其子类对象来表示线程,新建的一个线程声明周期中经历 新建.(声明一个线程,此时他已经有了相应的内存空间和其他资源),运行(线程创建之久就据用了运行的条件,一旦轮到使 ...

  4. bzoj 2190

    题意:求 题解:这题...数据范围是真小... 研究一下这一表达式,发现gcd(i,j)=1表示i,j互质,那么互质肯定能想到欧拉函数,可是欧拉函数要求j<i,那么我们变化一下:显然原矩阵是对称 ...

  5. 论文阅读笔记二十:LinkNet: Exploiting Encoder Representations for Efficient Semantic Segmentation(CVPR2017)

    源文网址:https://arxiv.org/abs/1707.03718 tensorflow代码:https://github.com/luofan18/linknet-tensorflow 基于 ...

  6. 插件使用一树形插件---zTree一zTree异步加载

    zTree 可以实现异步加载.异步加载可以让初次加载速度快,带来好的用户体验. 异步加载 官方源码中的demo提示了例子.例子是采用php语言. 在java语言中,zTree如何与Servlet结合呢 ...

  7. C#enum使用Attribute求字段名

    用到了一些反射:(自己看吧) public enum UserState { /// <summary> /// 正常 /// </summary> [Remark(" ...

  8. GZipStream 压缩与解压数据

    简介:此类表示 GZip 数据格式,它使用无损压缩和解压缩文件的行业标准算法.这种格式包括一个检测数据损坏的循环冗余校验值.GZip 数据格式使用的算法与 DeflateStream 类的算法相同,但 ...

  9. hadoop集群运行jps命令以后Datanode节点未启动的解决办法

    出现该问题的原因:在第一次格式化dfs后,启动并使用了hadoop,后来又重新执行了格式化命令(hdfs namenode -format),这时namenode的clusterID会重新生成,而da ...

  10. Python_模块介绍

    模块:一组或者一个.py文件实现了某个功能的代码集合 模块分为三种: 自定义模块 内置标准模块(又称标准库):Python自带的模块 开源模块:自己写的模块,有可以供人使用的功能 开源模块的集散地:P ...