DNS

域名系统(Domain Name System),提供了主机名到 IP 地址转换的目录服务。

严格来说,DNS 具有两层含义:

  1. 由分层的 DNS 服务器实现的分布式数据库
  2. 查询分布式数据库的应用层协议,DNS协议使用 UDP,端口号 53

除了主机名到 IP 地址转换,DNS 还提供了其他服务:

  1. 主机别名:主机可以拥有多个主机名(一个规范主机名,多个别名),DNS 服务可以获取别名对应的 IP 和规范主机名
  2. 邮件服务器别名:和主机别名相同,邮件服务器也可以拥有别名便于记忆
  3. 负载分配:一个规范主机名可以对应多台服务器(多个IP),DNS 可以在这些 IP 地址集合中循环分配负载

域名层次

DNS 也代指由分层的 DNS 服务器实现的分布式数据库,这些 DNS 服务器,它们以层次方式组织并分布在全世界范围

DNS 服务器存储着主机到 IP 的映射,这些映射分布在所有的 DNS 服务器上,每一台都仅存储一部分的映射。

DNS 服务器在层次上分为三种:

  1. 根 DNS 服务器:根服务器遍及全球,根服务器提供的是 TLD 服务器的 IP
  2. 顶级域服务器(TLD):每个顶级域都有对应的 TLD 服务器(或集群),TLD 服务器提供的是权威 DNS 服务器的 IP
  3. 权威 DNS 服务器:互联网中可访问的主机都需要在权威 DNS 服务器中保存主机名到主机 IP 的映射

本地 DNS 服务器

在 DNS 服务器层次之外存在着一类至关重要的 DNS 服务器:本地 DNS 服务器。

每个 ISP 都会有一台或多台本地 DNS 服务器,当和某个 ISP 相连通过 DHCP 分配 IP 地址时,会提供一台或多台本地 DNS 服务器的 IP。

当我们进行访问某个网站时,会先将主机名发送给本地 DNS 服务器,接着本地 DNS 服务器会依次向根服务器、顶级域服务器、权威 DNS 服务器进行询问,最后将该主机名对应的 IP 返回给我们。

工作原理

DNS 查询的方式有两种:

  • 递归查询
  • 迭代查询

就类似于递归算法和迭代算法一样,递归查询就是我询问你,你得给我答案,你如果不知道的话你得接着问别人

一般来说,域名服务器之间的查询使用迭代查询方式,以免根域名服务器的压力过大

所以通常来说向本地 DNS 服务器的查询是递归查询,本地 DNS 服务器向其他域名服务器的查询是迭代查询

DNS缓存

为了改善时延性能并减少因特网到处传输 DNS 报文,DNS 广泛的使用了缓存技术。

在一个请求链中,当某个 DNS 服务器接收到一个 DNS 回答,则会将该回答缓存在本地,后序查询会直接返回缓存。

因为缓存的存在,很多时候根服务器都被绕过了。

计算机中 DNS 记录在本地有两种缓存方式:

  1. 浏览器缓存
    • 浏览器在获取网站域名的实际 IP 地址后会对其进行缓存,减少网络请求的损耗
    • 每种浏览器都有一个固定的 DNS 缓存时间,Chrome 的过期时间是 1 分钟
  2. 操作系统缓存
    • 用户自己配置的 hosts 文件也属于操作系统的 DNS 缓存

DNS记录

DNS 分布式数据库存储的映射被称为资源记录,每个 DNS 回答报文中包含了一条或多条资源记录。

资源记录一个4元组:(Name, Value, Type, TTL)

TTL 记录的是生存时间,而 Name 和 Value 字段的值和含义取决于 Type 字段:

  • Type = A,表示的这个资源记录提供的是主机名到 IP 地址的映射,Name = 主机名,Value = IP地址
  • Type = NS,则 Name = 域,Value = 能够获得该域中主机 IP 的 DNS 服务器的主机名
  • Type = CNAME,则 Name = 别名,Value = 别名为 Name 的主机对应的规范主机名
  • Type = MX,Name = 别名,Value = 别名为 Name 的邮件服务器的规范主机名

一台权威 DNS 服务器会包含一条用于该(特定)主机名的类型 A 记录,其他的服务器也可能在缓存中包含这样一条记录。

如果服务器不是用于某主机名的权威 DNS 服务器,则该服务器会包含一条类型 NS 记录和一条类型 A 记录:

  • NS 记录:包含该主机名所属的和其该域所对应的 DNS 服务器主机名
  • A 记录:DNS 服务器主机名和其对应的 IP

例如:一台 edu 顶级域 DNS 服务器不是 gaia.cs.umass.edu 的权威 DNS 服务器,则该顶级域服务器会包含一条 NS 类型记录和一条 A 类型记录:

CDN

CDN 的全称是 Content Delivery Network,即内容分发网络。

CDN 管理分布在多个地理位置上的服务器(CDN节点),服务器中存储着资源的副本,并试图将每个用户的请求定向到一个用户体验最好的 CDN 节点上。

解决因分布、带宽、服务器性能带来的访问延迟问题,适用于站点 加速、点播、直播等场景。

主要原理

当用户主机请求一个地址时,CDN 必须截获该请求并执行操作:

  1. 确定此时适合用于该客户的 CDN 服务器集群
  2. 将客户的请求重定向到该集群的某台服务器

所以 CDN 需要截获和重定向请求,大多数 CDN 利用 DNS 来截获和重定向请求。

CDN 对域名解析过程进行了调整,对应的权威 DNS 服务器返回的不是 IP 地址而是某个 CDN 域的主机名(CNAME 记录)

本地服务器会对该服务器发起 DNS 请求,这时就进入了 CDN 专用 DNS 基础设施,此时会返回最适合的服务器的 IP 地址。

CNAME

CNAME:别名记录,也称为规范主机名,这种记录允许将多个名字映射到同一台计算机

例如,有一台服务器的主机名为 host.mydomain.com,它需要同时提供WWW和MAIL服务,为了用户的方便,可以为该计算机设置两个别名:www.mydomain.commail.mydomain.com

所以在 DNS 服务中会有这样的记录:

  1. A类型:host.mydomain.com 指向 xxx.xxx.xxx.xx
  2. CNAME类型:www.mydomain.com 指向 host.mydomain.com
  3. CNAME类型:mail.mydomain.com 指向 host.mydomain.com

wiki 中描述当一个DNS解析服务器在查询各类记录时遇到一则CNAME记录时,它会立即重启查询,查询所映射到域名的对应记录。

但是使用 dig 测试查看,会有一个 query 两个 answer

实现CDN

最简单的 CDN 网络由一个 DNS 服务器和几台缓存服务器组成:

  1. 当用户发起请求时,DNS 系统将域名的解析权交给 CNAME 指向的 CDN 专用 DNS 服务器
  2. CDN 的 DNS 服务器将 CDN 的全局负载均衡设备地址返回用户
  3. 用户向 CDN 的全局负载均衡设备发起请求
  4. CDN 全局负载均衡设备根据用户 IP 地址等信息,将最适合的 CDN 节点地址回应给本地 DNS
  5. 本地 DNS 将该地址返回给客户端