相关概念

DNS

Domain name Service: 使用特定的应用层一种协议,默认端口使用 tcp 53 和udp 53端口
FQDN:full qualified domain name : 是一个主机名(不是域名),比如 www.xxx.com
DNS名称解析过程

  1. 当浏览器输入一个主机的主机名时,系统标准库中提供了 dns解析的库(如getIpByHostname这种调用,也可提供反向解析调用,而这个库调用通常是找/etc/hosts
  2. 当互联网主机名太多了,访问/etc/hosts就不可行了,因为内存无法加载过大的文件,而文件更新也比较麻烦。**所以当系统库调用访问/etc/hosts 无法得到结果时,就会访问dns服务器。**主机作为dns客户端,通过特定协议发往dns的udp 53端口 域名解析请求,dns server收到请求后,根据请求内容查找数据库,响应查询结果跟客户端。
  3. dns服务使用倒置的树状结构,来层次化主机名。 比如给一个机构颁发了xxx.com 的域名,那么www.xxx.com,edu.xxx.com 都是归这个机构所有。

任何组织和个人,需要向顶级域的维护者进行申请,而顶级域需要由国际地址名称分配机构按需增加
常用顶级域:
.com,.net,.org, .edu,.mil(组织域)
.cn,.tw,.jp(国家域)

二级域名是需要个人在顶级域下进行个性化申请的,先到先得。
实际上现在互联网上的Dns服务器非常多,所以需要将dns服务器的地址配置在当前操作系统的某个配置文件上。而每次dns解析回来的地址,会在本地缓存一份,以降低dns的解析时延。Dns的缓存失效时间由dns解析服务器定义,以此来告诉客户端多久可以刷新缓存

而我们通常连接的运营商DNS服务器,其不提供DNS服务,它只是代替客户端做DNS查询,完成递归查询,而域名解析的结果在 其上面也会有缓存,从而加速客户端访问,所以它是一个DNS缓存。

标题为什么DNS服务器可以有多台

如果多台DNS服务器,如果每个服务器都保存全量数据,那么数据一致性有问题,同时写可能会有的服务器失败

所以解决方案是,每个DNS服务器只负责DNS解析树的一部分

  • 根域名服务器只负责管理顶级域,所以xxx.com的请求到顶级域的时候,会被重定向的.com这个顶级域名服务器
  • xxx.com 请求到达 .com 这个顶级域名服务器时,顶级域名服务器负责将请求转发到 .xxx 这个二级域名服务器。
  • 最终xxx.com 到达二级域名服务器xxx,二级域名服务器看到www.xxx.com 确实在自己这有记录,就将记录返回给客户端
  • 所以DNS算是个分布式数据库,如果更新数据的话只是在域名解析树的一个分支上进行上溯更新。比如有个www.yyy.com,会在对应的服务器上进行记录(最低级域名服务器,完成全域名解析)和跳转地址的更新(上层服务器,指导跳转到下一级域名解析服务器)

DNS查询类型

(1)递归查询
递归查询是一种DNS 服务器的查询模式,在该模式下DNS 服务器接收到客户机请求,必须使用一个准确的查询结果回复客户机。如果DNS 服务器本地没有存储查询DNS 信息,那么该服务器会询问其他服务器,并将返回的查询结果提交给客户机。(也就是客户端调用本地Dns的过程中递归了 本地Dns调用其他Dns服务器的过程
(2)迭代查询
DNS 服务器另外一种查询方式为迭代查询,DNS 服务器会向客户机提供其他能够解析查询请求的DNS 服务器地址,当客户机发送查询请求时,DNS 服务器并不直接回复查询结果,而是告诉客户机另一台DNS 服务器地址,客户机再向这台DNS 服务器提交请求,依次循环直到返回查询的结果
为止。

DNS解析类型

DNS详解以及Bind使用(一)---概述
正向解析(hostname---->IP 通过域名解析树可以完成
反向解析 ,通过IP树进行解析。按照IP地址的分段进行划分树。
反向解析树的root 名也为.,而下属的第一个节点为 in-addr.arpa,其实相当于事实上的根、这里使用.作为root 是为了和正向解析树统一根节点,而根下是两颗完全不同的树。
比如要查询1.2.3.4 这个ip,可能1 是一个服务器(访问1开头的都来这儿),2是一个服务器(访问1.2开头的来这儿),3是一个服务器(访问1.2.3.x的都来这),上面定义了一个库,也就是存储了1.2.3.x所有的主机的主机名。 最终写的格式却是自下往上走,最终的记录形式为 4.3.2.1.in-addr.arpa,其网段是3.2.1.in-addr-arpa,其下面有多个条目,保存了IP和主机名的映射。

所以正向解析和反向解析的名称空间不同,使用的解析树也不同,解析数据库也不同

国内万网是域名服务的代理商(工信部备案),国际上著名的是godaddy,负责接收域名注册服务

其实注册域名是注册一个二级域的名称,也就是注册顶级域下的二级域,比如magedu.com 这个域名,这个域内所有的主机都可以用,所以这是域的概念,下面任何的主机都可以使用,比如www.magedu.com,都是可以被域管理员进行编辑。其实就是获得了DNS解析树上一个二级域的数据库的管理权力),所以需要一个服务器来负责管理这个二级域的所有解析(也就是注册了二级域之后,需要有一个地方来存储之下的所有记录),这个主机就是这个域名的DNS服务器。

在这个主机上需要安装DNS 程序以及数据库。

代理商通常用来提供二级域名解析服务器(为很多个域提供解析,也就是无论访问xxx.com还是aaa.com都会定向到同一个代理商的域名解析服务器。)

DNS服务器类型:

  • 负责解析域(一个或多个)
    • 主名称服务器
    • 辅助名称服务器(作为主域名解析服务器的备份)
  • 缓存DNS服务器(没有解析库,只有DNS缓存)

一次完整的查询请求

client —> hosts 文件 ----> 本地的DNS local cache ---->对本地指向的DNS Server请求(可能是负责解析域的DNS server,也可以是DNS Cache Server)

​ 如果当前DNS server 发现请求的就是自己负责的域,那么直接查询数据库并返回答案(权威答案

​ 如果不是自己负责解析的域,那么就自己找缓存(非权威答案),如果缓存未命中,那么就迭代查询 root DNS Server

DNS 返回的解析答案:

  1. 肯定答案,有对应的IP解析结果
  2. 否定答案:不存在查询的键,或者不存在查询键对应的值(否定答案也可以有缓存,避免恶意攻击)

区域和域(zone & domain)

区域(zone)和域(domain) 的含义: 区域是物理概念,域是逻辑概念

  1. 域指的是申请的域名,比如taobao.com,一个域下有两棵树,分别是正向解析和反向解析树,所以数据库也有两个
  2. 而每个数据库就是一个区域

申请了一个域之后,也可以在这个域下面划分子域名,每个子域都可以有一个DNS服务。

任何一个DNS服务器,如果要在互联网上提供DNS服务,必须要配置根域名服务器,用于当前DNS无法返回客户端答案时,从根服务器开始递归一次查询

全球的根节点服务器 共有 13 台 ,11个在美国,1个在日本,1个在瑞士,中国只有镜像。

资源记录

在区域数据库文件中存储的叫做DNS资源记录resource record ,简称 rr

资源记录的类型:

  1. A Address: 地址记录,从FQDN --> IP 的解析,是IPV4 (对于有多个后端IP的hostname,可以DNS轮询
  2. AAAA : IPV6 的 FQDN—> IP
  3. PTR : IP—>FQDN 用来实现反向解析
  4. SOA:start of authority 起始授权记录:一个区域解析库只有一个SOA记录,必须为第一条记录,用于标记是当前的DNS负责的具体域
  5. NS: Name Service 域名服务记录,可以有多个,指定到底哪个是主那个是从,用于指定具体负责DNS解析服务的服务器地址
  6. CNAME: 别名记录,一个主机可以有多个名字,就是有一个别名主机名
  7. MX Mail Exchanger 邮件交换器 (通常[email protected],这是一个二级域名,但是难道126下的所有对外主机都是邮件服务器?所以在这个域内通常有一个服务器是专门用来收发邮件的,MX用于指定哪个服务器是邮件服务器。

主机名和IP,并不是一一对应的,可以一个主机名对多个Ip,也可以一个IP对外有多个主机名

资源记录的定义格式:

语法:

name (也就是key,可以是fqdn 作为正向解析, 也可以是ip 作为反向解析) [TTL] IN RR_TYPE value (结果)

SOA:

  • name: 当前区域的名字,例如 "taobao.com." 或者 2.3.4.in-addr.arpa.(4.3.2.x这个Ip段都可以反向解析)

  • value:有多部分组成

    • 当前区域的区域名称,也可以使用主DNS服务器名称

    • 当前区域 admin 邮箱地址,但是地址中不可以使用@符号,使用.替代

    • (主从服务协调属性定义,以及否定答案的TTL)

    • 例如 magedu.com 86400(ttl) IN SOA magedu.com.(区域名) admin.magedu.com.(邮箱) (

      20191120;serial

      2H ; refresh

      10M ; retry

      1W ; expire

      1D ; negative answer ttl

      )

NS:
即当前服务器可能不知道一些 域名的A记录,但是可以指定某个域名对应的NS,相当于转发到对应的NS来找答案

  • name :当前区域的名称
  • value: 当前区域的某DNS服务器(代表一个具体负责这个域解析的DNS服务)的名字,例如ns.megedu.com
    • 可以有多个ns记录。
  • 例如 : magedu.com. 86400 In NS ns1.magedu.com //代表当前DNS 上指定了一个NS 是ns1.magedu.com,其负责解析magedu.com 这个域,通常一个上级DNS可以返回 其某个子域的多个NS(也就是magedu.com 这个域可以由多个NS 服务器来解析),查询 . 域名服务器的地址的时候也可以返回多个NS,如 DNS详解以及Bind使用(一)---概述

即便是自己搭建的缓存dns和解析本地域的dns,也必须有一个ns指向自身,指明自己是NS服务的身份

MX :

  • name 当前区域的区域名
  • value 当前区域 邮件交换器的主机名,MX记录可以有多个,但是每个记录的value之前应该有数字来表示其优先级
  • 例如 magedu.com. IN MX 10(优先级) mx1.magedu.com.

A:

  • name: 某FQDN 例如 www.magedu.com.
  • value :某IPV4 地址
  • 例如 www.magedu.com. In A 1.1.1.1
  • 或者 www.magedu.com. In A 1.1.1.2
  • 或者 bbs.magedu.com. IN A 1.1.1.1

PTR:

  • name: IP反过来写,加特定后缀,比如要反向解析1.2.3.4 ,则应写为 4.3.2.1.in-addr-arpa.
  • value: FQDN
  • 例如 4.3.2.1.in-addr-arpa. IN PTR www.magedu.com.

CNAME:

  • name: FQDN 格式的别名
  • value: FQDN的正式名字
  • 例如 web.magedu.com. IN CNAME www.magedu.com.

"根域名服务器"的NS记录和IP地址一般是不会变化的,所以内置在DNS服务器里面(运营商提供或者自建?如果客户端指向的DNS中没有相关记录,则返回根域名服务器的NS和A记录)
可以看到所有记录的TTL值是3600000秒,相当于1000小时。也就是说,每1000小时才查询一次根域名服务器的列表。
目前,世界上一共有十三组根域名服务器,从A.ROOT-SERVERS.NET一直到M.ROOT-SERVERS.NET

  1. 从"根域名服务器"查到"顶级域名服务器"的NS记录和A记录(IP地址
  2. 从"顶级域名服务器"查到"次级域名服务器"的NS记录和A记录(IP地址)
  3. 从"次级域名服务器"查出"主机名"的IP地址

相关文章: