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 在绝大多数情况下采用 UDP 协议。

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 是什么

讲完 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. 节约成本