CDN与DNS知识汇总

在性能优化的时候,比较常见的一个建议是,把资源部署在CDN上,那么问题来了,CDN是什么?这样做有什么好处?

DNS

我们先讲一下域名系统DNS(Domain Name System)吧。

他是一个分布式数据库,功能是联系域名和ip地址。域名与ip的对应关系,被称为记录(record),可分为各种类型

  • A: Address,域名指向的IP地址,一个域名可以有多个A记录。
  • NS:Name Server,保存下一级域名信息的服务器地址
  • MX:Mail eXchange,接受电子邮件的服务器地址
  • CNAME:Canonical Name,返回另一个域名,令当前查询域名挑去该域名,多个域名->服务器的映射。
  • PTR: Pointer Record,只用于ip地址查询域名

DNS由下面三个部分组成

  • 名称解析器(resolver)
  • 域名空间(domain name space)
  • 名称服务器(name server)

假如你要访问baidu.com,需要先通过dns系统查出他的ip地址如220.181.57.216,才能访问。

dns查询的过程

那么问题来了,dns是怎么通过域名来查出ip的呢?我们以浏览器输入www.example.com为例,

  1. 检查浏览器缓存
  2. 检查操作系统缓存,常见的如hosts文件
  3. 检查路由器缓存
  4. 如果前几步都没没找到,会向ISP(网络服务提供商)的LDNS服务器查询
  5. 如果LDNS服务器没找到,会向跟域名服务器(Root Server)请求解析,分为以下几步:
    1. 跟服务器返回顶级域名(TLD)服务器如.com,.cn,.org等的地址,全球只有13台,该例子中会返回.com的地址
    2. 接着向TLD发送请求,然后会返回次级域名(SLD)服务器的地址,本例子会返回.example的地址
    3. 接着向SLD域名服务器通过域名查询目标IP,本例子会返回www.example.com的地址
    4. Local DNS Server会缓存结果,并返回给用户,缓存在系统中。
DNS安全问题
  1. DNS反射/放大攻击

    向大量开放DNS服务器发送大范围域名查询的DNS请求,并将该DNS请求的源IP地址伪造成想要攻击的目标IP地址。由于请求数据比相应数据小得多,攻击者可以利用该技术放大掌握的带宽资源和攻击流量。

  2. DDOS攻击可能造成域名解析瘫痪
  3. DNS/域名劫持
    在劫持的网络范围内拦截域名解析的请求,分析请求的域名,返回假的IP地址或者使请求失去响应。DNS劫持通过篡改DNS服务器上的数据返回给用户一个错误的查询结果来实现的。
  4. DNS污染
    DNS污染是一种让一般用户由于得到虚假目标主机IP而不能与其通信的方法,指的是用户访问一个地址,国内的服务器(非DNS)监控到用户访问的已经被标记地址时,服务器伪装成DNS服务器向用户发回错误的地址的行为。
    dns污染与dns劫持的区别在于,dns劫持修改了dns的解析结果,dns污染是不经过dns服务器,返回错误信息
  5. DNS信息黑客被修改
DNS优化

可以看出,dns解析是一个漫长的过程,如何优化这一过程呢?

  1. DNS Prefetching

    用户在请求某个链接之前,浏览器先尝试解析该链接的域名再将其进行缓存。这样真正请求的时候就不需要进行DNS解析。
    可以在服务器中响应设置X-DNS-Prefetch-Control的值为on启动预解析

或者在HTML中这样配置

<meta http-equiv="x-dns-prefetch-control" content="on">

对特定域名预解析

<link rel=”dns-prefetch” href=”//fonts.googleapis.com”>
  1. 域名收敛

    建议将静态资源只放在一个域名下面,可以有效减少dns的请求

  2. httpdns

    基于Http协议向HTTPDNS服务器发送域名解析请求,替代了基于DNS协议向运营商Local DNS发起解析请求的传统方式,可以避免运营商的域名劫持和进行精准调度。
    这过程分为两步

    1. 客户端直接访问HttpDNS接口,获取业务在域名配置管理系统上配置的访问延迟最优的IP。(基于容灾考虑,还是保留次选使用运营商LocalDNS解析域名的方式)
    2. 客户端向获取到的IP后就向直接往此IP发送业务协议请求。以Http请求为例,通过在header中指定host字段,向HttpDNS返回的IP发送标准的Http请求即可。

CDN

CDN是什么

讲完DNS,现在可以开始讲CDN了,CDN的全称是Content Delivery Network,即内容分发网络,它能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。

典型的CDN系统由下面三个部分组成

  • 分发服务系统

    最基本的工作单元就是Cache设备,cache(边缘cache)负责直接响应最终用户的访问请求,把缓存在本地的内容快速地提供给用 户。同时cache还负责与源站点进行内容同步,把更新的内容以及本地没有的内容从源站点获取并保存在本地。Cache设备的数量、规模、总服务能力是衡 量一个CDN系统服务能力的最基本的指标

  • 负载均衡系统

    主要功能是负责对所有发起服务请求的用户进行访问调度,确定提供给用户的最终实际访问地址。两级调度体系分为全局负载均衡(GSLB)和本 地负载均衡(SLB)。GSLB主要根据用户就近性原则,通过对每个服务节点进行“最优”判断,确定向用户提供服务的cache的物理位置。SLB主要负 责节点内部的设备负载均衡

  • 运营管理系统

    分为运营管理和网络管理子系统,负责处理业务层面的与外界系统交互所必须的收集、整理、交付工作,包含客户管理、产品管理、计费管理、统计分析等功能。

CDN的过程

使用CDN的方法很简单,只需要修改自己的DNS解析,设置一个CNAME指向CDN服务商即可。

用户访问未使用CDN缓存资源的过程为:

  1. 浏览器通过前面提到的过程对域名进行解析,以得到此域名对应的IP地址;
  2. 浏览器使用所得到的IP地址,向域名的服务主机发出数据访问请求;
  3. 服务器向浏览器返回响应数据

使用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. 用户向缓存服务器发起请求,缓存服务器响应用户请求,将用户所需内容传送到用户终端。如果这台缓存服务器上并没有用户想要的内容,而区域均衡设备依然将它分配给了用户,那么这台服务器就要向它的上一级缓存服务器请求内容,直至追溯到网站的源服务器将内容拉到本地。

上面的字太多,有点绕?通俗点就是用户访问的资源原本是存放在你自己的服务器,通过修改DNS让用户根据IP等情况来选择合适的CDN缓存服务器来获取资源。

CDN的优点

这样做有什么好处呢?

  1. 本地Cache加速,加快访问速度
  2. 镜像服务,消除运营商之间互联的瓶颈影响,保证不同网络的用户都能得到良好的访问质量
  3. 远程加速,自动选择cache服务器
  4. 带宽优化,分担网络流量,减轻压力,
  5. 集群抗攻击
  6. 节约成本

最后

本文章为前端进阶系列的一部分,
欢迎关注和star本博客或是关注我的github

引用

    1. 浏览器缓存之DNS
    2. 1.2 CDN的基本工作过程 - 51CTO.COM
    3. CDN技术详解
    4. DNS 预读取

原文地址:https://www.cnblogs.com/fanfuhu/p/12444042.html

时间: 2024-10-10 18:45:06

CDN与DNS知识汇总的相关文章

高负载、高并发网站架构知识汇总-大流量网站架构的几点认识

:硬架构 1:机房的选择: 在 选择机房的时候,根据网站用户的地域分布,可以选择网通或电信机房,但更多时候,可能双线机房才是合适的.越大的城市,机房价格越贵,从成本的角度看可以 在一些中小城市托管服务器,比如说广州的公司可以考虑把服务器托管在东莞,佛山等地,不是特别远,但是价格会便宜很多. 2:带宽的大小: 通常老板花钱请我们架构网站的时候,会给我们提出一些目标,诸如网站每天要能承受100万PV的访问量等等.这时我们要预算一下大概需要多大的带宽,计算带宽大小主要涉及两个指标(峰值流量和页面大小)

【转】ACM博弈知识汇总

博弈知识汇总 转自:http://www.cnblogs.com/kuangbin/archive/2011/08/28/2156426.html 有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可.两个人轮流从堆中取物体若干,规定最后取光物体者取胜.这是我国民间很古老的一个游戏,别看这游戏极其简单,却蕴含着深刻的数学原理.下面我们来分析一下要如何才能够取胜. (一)巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.

JavaScript正則表達式知识汇总

Js 正則表達式知识汇总 正則表達式: 1.什么是RegExp?RegExp是正則表達式的缩写.RegExp 对象用于规定在文本中检索的内容. 2.定义RegExp:var +变量名=new RegExp(); 3.RegExp 对象有 3 个方法: 1)test()检索字符串中的指定值,返回值是true或false. var p1=new Reg("e"); document.write(Reg.test("welcome to China!")); 2)exec

Delphi基础知识汇总

☆Delphi基础数据类型 分类 范围 字节 备注 简单类型 序数 整数 Integer -2147483648 .. 2147483647 4 有符号32位 Cardinal 0 .. 4294967295 4 无符号32位 Shortint -128 .. 127 1 有符号8位 Smallint -32768 .. 32767 2 有符号16位 Longint -2147483648 .. 2147483647 4 有符号32位 Int64 -263 .. 263 8 有符号64位 Byt

动态规划 知识汇总

 Dp状态设计与方程总结 不完全状态记录 <1>青蛙过河问题 <2>利用区间 dp 背包类问题 <1> 0-1 背包,经典问题 <2>无限背包,经典问题 <3>判定性背包问题 <4>带附属关系的背包问题 <5> + -1 背包问题 <6>双背包求最优值 <7>构造三角形问题 <8>带上下界限制的背包问题(012背包) 线性的动态规划问题 <1>积木游戏问题 <2&g

Guava库学习:学习Guava Cache知识汇总

原文地址:Guava库学习:学习Guava Cache知识汇总 至此,我们结束了对Guava Cache 缓存机制的学习,在学习过程中,我们学习了如何简单的通过MapMaker创建最简单的ConcurrentMap缓存,我们也了解了缓存的高级特性,以及强大的LoadingCache,我们也探索和学习了CacheBuilder.CacheLoader这些核心的API,以及CacheStats.RemovalLitener等,下面对这些文章做一些汇总,方便以后的查阅和复习.     Guava库学习

PB编程基础知识汇总

PB编程基础知识汇总 第一章      1.  程序的开始,application的open事件. 退出程序例程:halt为退出函数 int SureQuit SureQuit = 2 SureQuit=Messagebox("退出系统","退出前请确认已保存好数据",Question!,OKCancel!, 2) if SureQuit = 1 then halt 2.  变量定义有效范围: ◎     declare-globe 全局变量,整个程序均有效 ◎  

ACM博弈知识汇总(转)

博弈知识汇总 有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可.两个人轮流从堆中取物体若干,规定最后取光物体者取胜.这是我国民间很古老的一个游戏,别看这游戏极其简单,却蕴含着深刻的数学原理.下面我们来分析一下要如何才能够取胜. (一)巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜. 显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取

JavaScript正则表达式知识汇总

Js 正则表达式知识汇总 正则表达式: 1.什么是RegExp?RegExp是正则表达式的缩写.RegExp 对象用于规定在文本中检索的内容. 2.定义RegExp:var +变量名=new RegExp(); 3.RegExp 对象有 3 个方法: 1)test()检索字符串中的指定值,返回值是true或false. var p1=new Reg("e"); document.write(Reg.test("welcome to China!")); 2)exec