Skip to content

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 域名服务器

TLDTop-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 个步骤。

  1. 用户输入域名,比如“google.com”,web浏览器发起解析请求,被递归解析器接收
  2. 解析器向根域名服务器(.)发起查询请求
  3. 根域名服务器返回TLD域名服务器.com)的地址
  4. 解析器向TLD域名服务器.com)发起查询请求
  5. TLD域名服务器返回权威性域名服务器google.com)的地址
  6. 解析器向权威性域名服务器google.com)发起查询请求
  7. 权威性域名服务器google.com)返回google.com的ip地址
  8. 然后 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" />