CDN和DNS
DNS
域名系统(Domain Name System),提供了主机名到 IP 地址转换的目录服务。
严格来说,DNS 具有两层含义:
- 由分层的 DNS 服务器实现的分布式数据库
- 查询分布式数据库的应用层协议,DNS协议使用 UDP,端口号 53
除了主机名到 IP 地址转换,DNS 还提供了其他服务:
- 主机别名:主机可以拥有多个主机名(一个规范主机名,多个别名),DNS 服务可以获取别名对应的 IP 和规范主机名
- 邮件服务器别名:和主机别名相同,邮件服务器也可以拥有别名便于记忆
- 负载分配:一个规范主机名可以对应多台服务器(多个IP),DNS 可以在这些 IP 地址集合中循环分配负载
域名层次
DNS 也代指由分层的 DNS 服务器实现的分布式数据库,这些 DNS 服务器,它们以层次方式组织并分布在全世界范围
DNS 服务器存储着主机到 IP 的映射,这些映射分布在所有的 DNS 服务器上,每一台都仅存储一部分的映射。
DNS 服务器在层次上分为三种:
- 根 DNS 服务器:根服务器遍及全球,根服务器提供的是 TLD 服务器的 IP
- 顶级域服务器(TLD):每个顶级域都有对应的 TLD 服务器(或集群),TLD 服务器提供的是权威 DNS 服务器的 IP
- 权威 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 记录在本地有两种缓存方式:
- 浏览器缓存
- 浏览器在获取网站域名的实际 IP 地址后会对其进行缓存,减少网络请求的损耗
- 每种浏览器都有一个固定的 DNS 缓存时间,Chrome 的过期时间是 1 分钟
- 操作系统缓存
- 用户自己配置的 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 类型记录:
- NS 类型记录:(umass.edu, dns.umass.edu, NS)
- A 类型记录:(dns,umass.edu, xxx.xxx.xxx.xxx, A)
CDN
CDN 的全称是 Content Delivery Network,即内容分发网络。
CDN 管理分布在多个地理位置上的服务器(CDN节点),服务器中存储着资源的副本,并试图将每个用户的请求定向到一个用户体验最好的 CDN 节点上。
解决因分布、带宽、服务器性能带来的访问延迟问题,适用于站点 加速、点播、直播等场景。
主要原理
当用户主机请求一个地址时,CDN 必须截获该请求并执行操作:
- 确定此时适合用于该客户的 CDN 服务器集群
- 将客户的请求重定向到该集群的某台服务器
所以 CDN 需要截获和重定向请求,大多数 CDN 利用 DNS 来截获和重定向请求。
CDN 对域名解析过程进行了调整,对应的权威 DNS 服务器返回的不是 IP 地址而是某个 CDN 域的主机名(CNAME 记录)
本地服务器会对该服务器发起 DNS 请求,这时就进入了 CDN 专用 DNS 基础设施,此时会返回最适合的服务器的 IP 地址。
CNAME
CNAME:别名记录,也称为规范主机名,这种记录允许将多个名字映射到同一台计算机
例如,有一台服务器的主机名为 host.mydomain.com
,它需要同时提供WWW和MAIL服务,为了用户的方便,可以为该计算机设置两个别名:www.mydomain.com
和 mail.mydomain.com
所以在 DNS 服务中会有这样的记录:
- A类型:
host.mydomain.com
指向 xxx.xxx.xxx.xx - CNAME类型:
www.mydomain.com
指向host.mydomain.com
- CNAME类型:
mail.mydomain.com
指向host.mydomain.com
wiki 中描述当一个DNS解析服务器在查询各类记录时遇到一则CNAME记录时,它会立即重启查询,查询所映射到域名的对应记录。
但是使用 dig 测试查看,会有一个 query 两个 answer
实现CDN
最简单的 CDN 网络由一个 DNS 服务器和几台缓存服务器组成:
- 当用户发起请求时,DNS 系统将域名的解析权交给 CNAME 指向的 CDN 专用 DNS 服务器
- CDN 的 DNS 服务器将 CDN 的全局负载均衡设备地址返回用户
- 用户向 CDN 的全局负载均衡设备发起请求
- CDN 全局负载均衡设备根据用户 IP 地址等信息,将最适合的 CDN 节点地址回应给本地 DNS
- 本地 DNS 将该地址返回给客户端