DNS
什么是 DNS
DNS,Domain Name System,域名系统,其主要任务是进行从主机名到 IP 地址的转换。DNS也属于应用层的协议,然后DNS不同于 web 应用,文件传输应用以及电子邮件应用等独立应用,DNS通常是作为其他网络应用程序绑定提供的一种核心功能。
DNS由两部分组成:
- 一个由分层的
DNS服务器实现的分布式数据库 - 一个使得主机能够查询分布式数据库的应用层协议,用于定义
DNS报文等内容
DNS建立在运输层UDP协议的基础上,运行端口为53,在【RFC1035】中定义协议内容。
DNS 提供的服务
- 根据主机名获取
IP地址 - 根据主机别名获取主机名以及对应的
IP地址,这里要清楚一个概念是规范主机名:规范主机名往往比主机别名要难记,所以一般网站会采用配置别名来处理请求,例如www.baidu.com和baidu.com可以称为别名,但是规范主机名往往比这些要长要难记忆,所以 DNS 需要从用户请求的别名获取规范主机名和IP地址 - 邮件服务器别名,邮件地址一般形如
[email protected]等,但是真正的邮件服务器的主机名却不是这样,电子邮件程序可以调用DNS对提供的主机名进行解析,以获得其规范主机名和对应的IP地址 - 负载均衡,大型网站往往采用多台服务器部署的方式来均衡访问负载,每台服务器都对应一个
IP地址,在这种情况下,一个主机域名对应n个IP地址的集合。当客户端发起请求时,DNS会循环整个IP地址的集合来进行分配,从而达到负载均衡的效果。
分布且分层的 DNS 服务
由于全世界庞大且永远在持续增长的域名数量,所以DNS不可能采用单一的服务器来运行服务,其使用分布式其分层次的DNS服务器架构。
分布式也就是DNS服务器遍布全球各地具有互联网的地方,分层次是指DNS服务器大致可分为三种类型:
- 根
DNS服务器:或者叫根域名服务器,负责返回顶级域的权威域名服务器地址 TLD(Top Level Domain)顶级域名服务器:负责返回权威域名的服务器地址- 权威
DNS服务器:负责返回请求域名的IP地址,可能包含主机别名的IP地址

本地 DNS 服务器
还有一种属于ISP(Internet Service Provider,电信,联通等都属于互联网服务提供商)提供的本地DNS服务器,为日常入网家庭提供的服务。本地DNS服务器通常与家庭用户的主机相隔不到几个路由器,它主要起代理转发的作用,将用户请求解析的主机名首先转发到根域名服务器,获取顶级域名服务器的地址;然后本地DNS服务器再次请求顶级域名服务器以获取权威域名服务器的地址,最后本地DNS服务器再次向权威域名服务器请求以获取真正的IP地址(考虑主机别名的情况),并把这个地址返回给用户主机。
本地DNS服务器也可以设置为一些慈善机构提供的公用 DNS,例如 Google Cloud DNS,114 等
DNS 客户端
DNS客户端,也叫域名解析服务器客户端,通常是操作系统内置的客户端程序,例如在 Windows 中,具有 ipv4,ipv6 的本地DNS服务器配置程序,用于引导 DNS 客户端向具体的本地DNS服务器发送第一个 DNS 请求。
DNS 缓存
从上文了解到,在DNS分层服务器之间请求获取域名的最终IP地址,往往需要多次请求,考虑到服务器物理路径上的距离以及网络时延,这种请求延时是一个不小的开销,所以DNS中还具有缓存功能。
DNS缓存非常的简单,在一个获取主机名对应IP地址的请求链中,当某个DNS服务器接收到一个DNS应答以后,会将请求的主机名和获取的IP地址映射保存在服务器存储空间中,通常会保存2天时间。这样当相同主机名的请求到达该域名服务器后,就可以直接从本地存储中获取对应的IP地址并响应,避免了后续的请求查询。
DNS 服务流程
下面让我们来梳理一下DNS解析主机名并返回IP地址的主要流程:
-
用户输入
URL -
浏览器获取
URL中的主机名,也就是域名 -
浏览器调用系统的
DNS客户端向本地DNS服务器发送DNS查询报文,所有的DNS请求和响应报文都通过53端口使用 UDP 协议传输 -
本地
DNS服务器收到请求后向根域名服务器发送请求并获取顶级域名服务器的地址 -
本地
DNS服务器向顶级域名服务器的地址发送请求并获取权威域名服务器的地址,如果是权威域名则到这里结束,如果是主机别名则继续请求权威域名服务器,以获取主机别名对应的主机规范名和IP地址 -
本地
DNS服务器向用户电脑的DNS客户端发送响应,其中包含浏览器请求的主机名对应的IP地址 -
浏览器获取
DNS客户端提供的IP地址,就能够向该IP地址的80端口的HTTP服务器发起建立 TCP 连接的请求

DNS 服务的资源记录
所有DNS服务器都存储了资源记录,其提供主机名到IP地址的映射,每个DNS响应报文都包含一条或者多条资源记录。资源记录包含以下信息:
TTL,表示资源记录的缓存时间Name、Value以及Type,其中Name、Value的值取决于Type
- 如果
Type = A,则Name是主机名,Value是主机名对应的IP地址 - 如果
Type = NS(Name Server,域名服务器),则Name是一个域名,Value是知道如何获取该域名的IP地址的权威DNS服务器的主机名 - 如果
Type = CNAME(Canonical Name,真实名称),则Value是别名为Name的主机对应的规范主机名 - 如果
Type = MX,则Value是别名为Name的邮件服务器的规范主机名
这里重点需要关注的是Type = NS和Type = CNAME的情况,Type = NS尝尝用于CDN服务配置,而Type = CNAME则用于主机别名的配置。
以个人站点使用 Cloudflare 提供的免费 CDN 为例,需要在域名商处配置以下两个 Cloudflare 提供的 CDN 服务器的域名

CNAME此时需要在 Cloudflare 的 CDN 处配置解析到 GitHub Pages 的免费域名,也就对应了网站的规范主机名,也就是网站实际资源所在的服务器域名。
