DNS解析
一、什么是 DNS?
连接到 Internet 的每个设备都有一个唯一 IP 地址,用户可使用该 IP 地址查找此设备,但ip地址记忆起来比较困难,域名系统 (DNS)
相当于互联网的电话簿,使人们通过例如 google.com
等域名在线访问信息,而无需存储例如 192.168.1.1
等 IP 地址
对于 Web 浏览器而言,DNS 查询是在后台发生的,除了初始请求外,不需要从用户的计算机进行任何交互
二、DNS服务器分类
递归解析器
递归解析器(也称为 DNS 解析器)是 DNS 查询中的第一站。递归解析器将使用缓存的数据响应,或者将向根域名服务器发送请求。收到来自包含已请求 IP 地址的响应后,递归解析器将向客户端发送响应。
在此过程中,递归解析器将缓存从权威性域名服务器收到的信息。
根域名服务器
根域名服务器是递归解析器搜寻 DNS 记录的第一站。根域名服务器有 13 种类型,.com、.net、.org
等。但这并不意味着根域名服务器系统中只有 13 台计算机,在世界各地每个类型都有多个副本,它们使用 Anycast 路由来提供快速响应。如果将根域名服务器的所有实例加在一起,有 600 台不同的服务器
TLD 域名服务器
TLD
(Top-Level Domain
)意思是“顶级域名”,代表域名最后一个点后面的内容,比如.com
。
TLD
服务器主要有两个分类:
- 通用顶级域:这些是非特定国家/地区的域,一些最知名的通用 TLD 包括
.com、.org、.net、.edu 和 .gov
。 - 国家/地区代码顶级域:这些包括特定于某个国家/地区或州的任何域。例如,
uk、.us、.ru 和 .jp
等。
对于基础设施域实际上存在第三个类别,但该类别几乎从不使用。此类别是为 .arpa 域创建的,该域是在创建新式 DNS 时使用的过渡域;其当今主要是具有历史意义。
权威性域名服务器
权威性域名服务器通常是解析器查找 IP 地址过程中的最后一步,其中包含特定域名的信息,例如,google.com的服务器的 IP 地址
如果该域在解析的时候配置了 CNAME 记录(别名),它将为递归解析器提供一个别名域,这时递归解析器将必须执行全新 DNS 查找,以便从权威性域名服务器获取记录(通常为包含 IP 地址的 A 记录)。Cloudflare DNS 分发权威性域名服务器,这些域名服务器带有 Anycast 路由,可使其变得更可靠。
在查询对象为子域(例如 foo.example.com 或 blog.cloudflare.com)的情况下,将向权威性域名服务器之后的序列添加一个附加域名服务器,其负责存储该子域的 CNAME 记录。
三、DNS查找过程
DNS 查找通常有 8 个步骤。缓存 DNS 信息时,将从 DNS 查找过程中跳过一些步骤,从而使该过程更快。以下示例概述了不缓存任何内容时的所有 8 个步骤。
- 用户输入域名,比如“
google.com
”,web浏览器发起解析请求,被递归解析器接收 - 解析器向根域名服务器(
.
)发起查询请求 - 根域名服务器返回TLD域名服务器(
.com
)的地址 - 解析器向TLD域名服务器(
.com
)发起查询请求 - TLD域名服务器返回权威性域名服务器(
google.com
)的地址 - 解析器向权威性域名服务器(
google.com
)发起查询请求 - 权威性域名服务器(
google.com
)返回google.com
的ip地址 - 然后 DNS 解析器使用最初请求的域的 IP 地址响应 Web 浏览器
四、性能优化
DNS作为互联网基础协议,解析速度很容易被网站优化人员忽略,一般一次解析需要耗费100ms左右,是可以忽略不计的,但是网站中使用的资源如果依赖多个不同域,时间就会成倍增加,这种情况就需要进行DNS优化,与前端有关的优化主要有两点
DNS缓存,减少DNS的请求次数
- 在服务器设置DNS缓存的时间,不经常变更的 IP 建议设置的时间长一些
- 尽可能使用A或者AAAA代替CNAME,使用CND加速域名
- 自己搭建DNS服务
DNS预解析(要慎用,不要每个页面都添加,会造成资源浪费)
隐式解析 浏览器会默认对页面中所有出现的域名进行预解析
显式解析 可以通过
link
标签实现html<link rel="dns-prefetch" href="https://fonts.googleapis.com" />