参考源自GitHub—vue3js

what

域名系统,是互联网一项服务,是进行域名和与之相对应的 IP 地址进行转换的服务器,简单来讲,DNS相当于一个翻译官,负责将域名翻译成ip地址。
它是一个由分层的 DNS 服务器组成的分布式数据库,是定义了主机如何查询这个分布式数据库的方式的应用层协议。能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。

  • IP 地址:一长串能够唯一地标记网络上的计算机的数字
  • 域名:是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时对计算机的定位标识

image.png
作用: 将域名解析为IP地址,客户端向DNS服务器(DNS服务器有自己的IP地址)发送域名查询请求,DNS服务器告知客户机Web服务器的 IP 地址

域名

域名是一个具有层次的结构,从上到下一次为根域名、顶级域名、二级域名、三级域名…

image.png
image.png

根域、顶级域、二级域、子域

域名采用层次化的方式进行组织,每一个点代表一个层级。
一个域名完整的格式为www.baidu.com.

  • 最末尾的点代表根域,常常省略;
  • com即顶级域(TLD);
  • baidu.com即二级域。
  • 依次类推,还有三级域、四级域等等。

子域是一个相对的概念,baidu.com是com的子域,www.baidu.com是baidu.com的子域。
除此之外,还有电脑默认的本地域名服务器

权威DNS

处于DNS服务端的一套系统,该系统保存了相应域名的权威信息。权威DNS即通俗上“这个域名我说了算”的服务器。

递归DNS

又叫local dns。递归DNS可以理解为是一种功能复杂些的resolver,其核心功能一个是缓存、一个是递归查询。收到域名查询请求后其首先看本地缓存是否有记录,如果没有则一级一级的查询根、顶级域、二级域……直到获取到结果然后返回给用户。日常上网中运营商分配的DNS即这里所说的递归DNS。

转发DNS

转发DNS是一种特殊的递归。如果本地的缓存记录中没有相应域名结果时,其将查询请求转发给另外一台DNS服务器,由另外一台DNS服务器来完成查询请求。

公共DNS

公共DNS属于递归DNS。其典型特征为对外一个IP,为所有用户提供公共的递归查询服务。

DNS的查询方式

  • 递归查询:如果 A 请求 B,那么 B 作为请求的接收者一定要给 A 想要的答案

image.png

  • 迭代查询:如果接收者 B 没有请求者 A 所需要的准确内容,接收者 B 将告诉请求者 A,如何去获得这个内容,但是自己并不去发出请求

image.png

查询过程

  • 首先搜索浏览器的 DNS 缓存,缓存中维护一张域名与 IP 地址的对应表
  • 若没有命中,则继续搜索操作系统的 DNS 缓存
  • 若仍然没有命中,则操作系统将域名发送至本地域名服务器,本地域名服务器采用递归查询自己的 DNS 缓存,查找成功则返回结果
  • 若本地域名服务器的 DNS 缓存没有命中,则本地域名服务器向上级域名服务器进行迭代查询
    • 首先本地域名服务器向根域名服务器发起请求,根域名服务器返回顶级域名服务器的地址给本地服务器
    • 本地域名服务器拿到这个顶级域名服务器的地址后,就向其发起请求,获取权限域名服务器的地址
    • 本地域名服务器根据权限域名服务器的地址向其发起请求,最终得到该域名对应的 IP 地址
  • 本地域名服务器将得到的 IP 地址返回给操作系统,同时自己将 IP 地址缓存起来
  • 操作系统将 IP 地址返回给浏览器,同时自己也将 IP 地址缓存起
  • 至此,浏览器就得到了域名对应的 IP 地址,并将 IP 地址缓存起

image.png

域名缓存

在域名服务器解析的时候,使用缓存保存域名和IP地址的映射

计算机中DNS的记录也分成了两种缓存方式:

  • 浏览器缓存:浏览器在获取网站域名的实际 IP 地址后会对其进行缓存,减少网络请求的损耗
  • 操作系统缓存:操作系统的缓存其实是用户自己配置的 hosts 文件

DNS的记录和报文

DNS 服务器中以资源记录的形式存储信息,每一个 DNS 响应报文一般包含多条资源记录。一条资源记录的具体的格式为
其中 TTL 是资源记录的生存时间,它定义了资源记录能够被其他的 DNS 服务器缓存多长时间。

  1. NameValueTypeTTL

常用的一共有四种 Type 的值,分别是 A、NS、CNAME 和 MX ,不同 Type 的值,对应资源记录代表的意义不同:

  • 如果 Type = A,则 Name 是主机名,Value 是主机名对应的 IP 地址。因此一条记录为 A 的资源记录,提供了标准的主机名到 IP 地址的映射。
  • 如果 Type = NS,则 Name 是个域名,Value 是负责该域名的 DNS 服务器的主机名。这个记录主要用于 DNS 链式查询时,返回下一级需要查询的 DNS 服务器的信息。
  • 如果 Type = CNAME,则 Name 为别名,Value 为该主机的规范主机名。该条记录用于向查询的主机返回一个主机名对应的规范主机名,从而告诉查询主机去查询这个主机名的 IP 地址。主机别名主要是为了通过给一些复杂的主机名提供 一个便于记忆的简单的别名。
  • 如果 Type = MX,则 Name 为一个邮件服务器的别名,Value 为邮件服务器的规范主机名。它的作用和 CNAME 是一 样的,都是为了解决规范主机名不利于记忆的缺点

    DNS 服务的常见资源记录类型

  • A记录(主机地址)

  • CNAME记录(别名)
  • MX记录(邮件主机)
  • NS记录(名称服务器)
  • SOA记录(起始授权机构)
  • TR记录(IP反向解析)
  • SRV记录(MS DNS服务器的活动目录)

DNS报文格式

参考csdn
DNS 分为查询请求和查询响应,请求和响应的报文结构基本相同。DNS 报文格式如图所示。
DNS 协议 - 图7
整个 DNS 格式主要分为 3 部分内容,即基础结构部分、问题部分、资源记录部分。下面将详细地介绍每部分的内容及含义。

基础结构部分

DNS 报文的基础结构部分指的是报文首部
DNS 协议 - 图8
该部分中每个字段含义如下。

  • 事务 ID:DNS 报文的 ID 标识。对于请求报文和其对应的应答报文,该字段的值是相同的。通过它可以区分 DNS 应答报文是对哪个请求进行响应的。
  • 标志:DNS 报文中的标志字段。
  • 问题计数:DNS 查询请求的数目。
  • 回答资源记录数:DNS 响应的数目。
  • 权威名称服务器计数:权威名称服务器的数目。
  • 附加资源记录数:额外的记录数目(权威名称服务器对应 IP 地址的数目)。

基础结构部分中的标志字段又分为若干个字段,如图所示。
DNS 协议 - 图9
标志字段中每个字段的含义如下:

  • QR(Response):查询请求/响应的标志信息。查询请求时,值为 0;响应时,值为 1。
  • Opcode:操作码。其中,0 表示标准查询;1 表示反向查询;2 表示服务器状态请求。
  • AA(Authoritative):授权应答,该字段在响应报文中有效。值为 1 时,表示名称服务器是权威服务器;值为 0 时,表示不是权威服务器。
  • TC(Truncated):表示是否被截断。值为 1 时,表示响应已超过 512 字节并已被截断,只返回前 512 个字节。
  • RD(Recursion Desired):期望递归。该字段能在一个查询中设置,并在响应中返回。该标志告诉名称服务器必须处理这个查询,这种方式被称为一个递归查询。如果该位为 0,且被请求的名称服务器没有一个授权回答,它将返回一个能解答该查询的其他名称服务器列表。这种方式被称为迭代查询。
  • RA(Recursion Available):可用递归。该字段只出现在响应报文中。当值为 1 时,表示服务器支持递归查询。
  • Z:保留字段,在所有的请求和应答报文中,它的值必须为 0。
  • rcode(Reply code):返回码字段,表示响应的差错状态。
    • 当值为 0 时,表示没有错误;
    • 当值为 1 时,表示报文格式错误(Format error),服务器不能理解请求的报文;
    • 当值为 2 时,表示域名服务器失败(Server failure),因为服务器的原因导致没办法处理这个请求;
    • 当值为 3 时,表示名字错误(Name Error),只有对授权域名解析服务器有意义,指出解析的域名不存在;
    • 当值为 4 时,表示查询类型不支持(Not Implemented),即域名服务器不支持查询类型;
    • 当值为 5 时,表示拒绝(Refused),一般是服务器由于设置的策略拒绝给出应答,如服务器不希望对某些请求者给出应答。


DNS同时使用TCP和UDP协议?

DNS占用53号端口,同时使用TCP和UDP协议。
(1)在区域传输的时候使用TCP协议

  • 辅域名服务器会定时(一般3小时)向主域名服务器进行查询以便了解数据是否有变动。如有变动,会执行一次区域传送,进行数据同步。区域传送使用TCP而不是UDP,因为数据同步传送的数据量比一个请求应答的数据量要多得多。
  • TCP是一种可靠连接,保证了数据的准确性。

(2)在域名解析的时候使用UDP协议

  • 客户端向DNS服务器查询域名,一般返回的内容都不超过512字节,用UDP传输即可。不用经过三次握手,这样DNS服务器负载更低,响应更快。理论上说,客户端也可以指定向DNS服务器查询时用TCP,但事实上,很多DNS服务器进行配置的时候,仅支持UDP查询包。

DNS在udp / 53 和 tcp / 53上工作。


image.png
DNS只能做到域名到IP的映射,反之不可,因此不应该为“互相映射”

操作系统的DNS缓存

windows DNS缓存的默认值是 MaxCacheTTL,它的默认值是86400s,也就是一天
macOS 严格遵循DNS协议中的TTL。
游览器的DNS缓存

  • chrome对每个域名会默认缓存60s;
  • IE将DNS缓存30min;
  • Firefox默认缓存时间只有1分钟;
  • Safari约为10S。

权威记录

image.png
local DNS返回的也是权威的,但是有可能会被污染