主机名到 IP 地址的转换(hostname to IP address translation);
主机别名(host aliasing):一个主机可以有一个规范主机名和多个主机别名,应用程序调用 DNS 获取主机别名对应的规范主机名(canonical hostname)以及主机的 IP 地址;
邮件服务器别名(mail server aliasing);
负载分配(load distribution):繁忙的站点被冗余分布在多台服务器上,每台服务器运行在不同的端系统上,每个都有着不同的 IP 地址。由于这些冗余的 Web 服务器,一个 IP 地址集合对应一个规范主机名。当客户对映射到某处到某地址集合的名字发出一个 DNS 请求时,该服务器用 IP 地址的整个集合进行响应,但在每个回答中循环这些地址次序。因为客户通常总是向 IP 地址排在最前面的服务器发送 HTTP 请求报文,所以 DNS 就在所有这些冗余的 Web 服务器之间循环分配了负载;
Overview of How DNS Works
集中式设计的问题
单点故障(a single point of failure);
通信容量(traffic volume);
远距离的集中式数据库(distant centralized database);
维护(maintenance);
分布式 DNS 服务器的层次结构
Root DNS servers:负责记录顶级域名服务器的信息
Top-Level Domain DNS servers:负责顶级域名 com, org, net, edu, etc, 和所有国家的顶级域名 uk, fr, ca, jp.
Authoritative DNS servers:在因特网上具有公共可访问主机(如 Web 服务器和邮件服务器)的每个组织机构必须提供公共可访问的 DNS 记录,这些记录将这些主机的名字映射为 IP 地址。组织机构的权威 DNS 服务器负责保存这些 DNS 记录。
Local DNS servers:严格来说不属于该服务器的层次结构,每个 ISP(如居民区 ISP、公司、大学)都有一个本地 DNS,也叫默认服务器,当主机发出 DNS 请求时,该请求被发往本地 DNS 服务器,它起着代理的作用,转发请求到层次结构中。
import dns.messageimport dns.query# 创建一个 DNS 查询报文对象query = dns.message.make_query("baidu.com", dns.rdatatype.ANY)# 发送 DNS 查询并接收响应报文,设置DNS服务器的IP地址为202.112.14.21response = dns.query.tcp(query, "202.112.14.21")# 打印输出报文的信息print(f"Identification: {response.id}")print(f"Flags: {response.flags}")print(f"Questions: {response.question}")print(f"Answers: {response.answer}")print(f"Authority: {response.authority}")print(f"Additional information: {response.additional}")[OUTPUT]Identification: 41532Flags: 33152Questions: [<DNS baidu.com. IN ANY RRset: []>]Answers: [<DNS baidu.com. IN A RRset: [<110.242.68.66>, <39.156.66.10>]>, <DNS baidu.com. IN NS RRset: [<ns7.baidu.com.>, <ns2.baidu.com.>, <dns.baidu.com.>, <ns3.baidu.com.>, <ns4.baidu.com.>]>]Authority: []Additional information: [<DNS dns.baidu.com. IN A RRset: [<110.242.68.134>]>, <DNS ns2.baidu.com. IN A RRset: [<220.181.33.31>]>, <DNS ns3.baidu.com. IN A RRset: [<153.3.238.93>, <36.155.132.78>]>, <DNS ns4.baidu.com. IN A RRset: [<111.45.3.226>, <14.215.178.80>]>, <DNS ns7.baidu.com. IN A RRset: [<180.76.76.92>]>, <DNS ns7.baidu.com. IN AAAA RRset: [<240e:bf:b801:1002:0:ff:b024:26de>, <240e:940:603:4:0:ff:b01b:589a>]>]
When a browser in a user’s host is instructed to retrieve a specific video (identified by a URL), the CDN must intercept(截获) the request so that it can
Determine a suitable CDN server cluster(集群) for that client at that time
Redirect the client’s request to a server in that cluster.
许多 CDN 利用 DNS 截获用户请求并将用户重定向到最近的 CDN 服务器。
如下是一个用户访问 NetCinema 网页中视频的过程:
用户访问 NetCinema 的网页。
当用户点击链接http://video.netcinema.com/6Y7B23V时,用户的主机会发送一个寻找video.netcinema.com的 DNS 查询。
用户的本地 DNS 服务器(LDNS)将 DNS 查询转发到 NetCinema 的权威 DNS 服务器,该服务器注意到主机名video.netcinema.com中的字符串 video。为了将 DNS 查询交给 KingCDN,NetCinema 的权威 DNS 服务器不返回 IP 地址,而是返回 KingCDN 域中的主机名,例如a1105.kingcdn.com
DNS 查询进入 KingCDN 的私有 DNS 基础设施;用户的 LDNS 然后发送查询a1105.kingcdn.com的请求;KingCDN 的 DNS 系统指定合适的 KingCDN 内容服务器,将其 IP 地址返回给 LDNS。
LDNS 将提供内容的 CDN 节点的 IP 地址转发给用户的主机。
一旦客户端收到 KingCDN 内容服务器的 IP 地址,它就会与该 IP 地址的服务器建立 TCP 连接,并发出一个 HTTP GET 请求获取视频。如果使用 DASH,服务器会首先向客户端发送一个清单文件,其中包含一个 URL 列表,每个版本的视频对应一个 URL,客户端会动态地从不同的版本中选择块。