乐趣区

关于java:网络协议之Domain-name-service-DNS详解

简介

当初是互联网的世界,大家从各种网站中获取各类资源和信息,通常咱们只须要牢记一个网站地址即可,至于这个网站后盾的服务器在什么中央,咱们并不需要关怀。当咱们的申请指向这个网址之后,接下来就只须要期待申请被转发到该网址的后端服务器上,失去返回的处理结果即可。

这个将网站名称解析成为服务 IP 地址的服务就是 DNS 服务,它的全称是 Domain Name System, 也就是域名解析服务。

那么 DNS 到底是怎么工作的呢?

有聪慧的小伙伴可能会说了,那还不简略,搞一个对立的服务器,把世界上所有的域名对应的 IP 都存起来,每次须要解析的时候从这个服务去取就行了。的确,在互联网的初期就是这么干的,那时候网站还不多,域名保护的老本还不高, 并且最开始还没有域名零碎。

作为互联网的技术根底的 ARPANET(The Advanced Research Projects Agency Network)是第一个具备分布式管制的广域分组替换网络,也是最早利用 TCP/IP 协定的网络设施。

在 ARPANET 网络中,每个主机都有一个数字地址,然而这个数字地址显著是反人类记忆模式的,所以科学家们心愿可能给这些主机起一些好记的名字,那么就须要保护这些名字和主机之间的映射关系,在这个时候斯坦福研究所 (当初被称为 SRI International) 接下了这个工作,他们保护了一个 HOSTS.TXT 的文本文件, 在这个文件中形容了主机地址和主机名字之间的映射关系。

如果有人想要更新这个 HOST 文件,那么须要在工作工夫打电话给 SRI 网络信息中心, 由信息中心的工作人员将主机名和地址增加到 HOSTS.TXT 文件中。当然这样的操作对大量的数据更新来说还能够,然而如果数据量太大的状况下就有问题了。

前面一个叫做 Elizabeth Feinler 的人在 SRI 网络信息中心的根底上搭建了 WHOIS 目录,用于检索无关资源、联系人和实体的信息,并且提出了域名的概念.

最开始的保护都是在一个繁多的服务器上进行集中式治理,然而这种保护形式曾经不可能满足日益增长的网络需要,于是在 1983 年 Paul Mockapetris 在南加州大学创立了 DNS 零碎, 并在 1983 年 11 月于 RFC 882 和 RFC 883 公布了相干的原始标准。

前面 DNS 通过一系列的倒退,于 1987 年 11 月,RFC 1034 和 RFC 1035 取代了 1983 年的 DNS 标准。

DNS 的性能

后面咱们也提过了,DNS 最根本的作用就是将用户提供的域名转换成为服务器的地址。

比方咱们当初有个域名叫做 www.flydean.com, 它对应的服务器 IPv4 地址是 42.138.111.201,对应的 IPv6 地址是 fe40::1024:ff:fe10:123f,DNS 要做的工作就是将 www.flydean.com 依据须要疾速的转换成为 IPv4 或者 IPv6 地址。这是 DNS 的第一个性能也是最重要的性能:提供域名的解析服务。

另外,在具体的利用场景中,域名背地对应的服务器 IP 可能是会变动的,那么就须要 DNS 有疾速更新的性能,能够疾速反映网络的变动状况,而不影响具体用户的拜访。

这种操作对用用户来说是敌对的,因为用户不须要晓得底层服务器的变动,他们只须要晓得要拜访的域名即可。

最初,古代的网络应用个别都是分布式的,可能会有多个工作节点,不同的工作节点可能会被部署在不同的中央。用户在拜访一个域名的时候,为了晋升访问速度,应该优先拜访离用户最近的那个节点。这时候 DNS 又承当了优化网络拜访的工作,它负责向用户提供最近的服务器节点,所以在古代网络架构中,DNS 的作用越来越大。

DNS 的组成

解说完 DNS 的性能之后,让咱们来看看 DNS 的组成,作为一个域名服务,DNS 是由域名空间和 Name servers 两局部组成的。

域名空间形容的是域名的构造和命令规定,而 Name servers 则是对域名进行解析的服务。接下来咱们别离进行解说。

域名空间 Domain name space

域名空间,也叫做 Domain name space, 它是所有域名的汇合。上面是维基百科上的域名空间的示意图:

<img src=”https://img-blog.csdnimg.cn/a4ada5191a6d4889aa54edb5a3a2e148.png” style=”zoom:67%;” />

从上图能够看出,域名空间其实是一个树形构造,每个节点或者叶子节点都有一个 label 和 RR(esource records 记录着和域名相干的有用信息), 域名自身由 label 组成,左边是其父节点的名称,用点分隔。

域名空间能够被划分为多个子空间,每个子空间能够独自进行治理,这样的子空间叫做一个域(zone)。

每个 DNS 域又能够被划分为一个域,也可能蕴含许多域和子域,具体取决于域管理器的治理抉择。

大家对域名都很相熟了,然而大家可能不是很明确域名的形成。

事实上域名是由 label 组成的,各个 label 是以点连接起来的,比方:www.flydean.com。

每个 label 都能够看做是域的一个层级,最左边是顶级域名 com, 右边的是左边域名的子域名, 比方 flydean 是 com 的子域名,www 是 flydean.com 的子域名,以此类推,总共能够有 127 个层级构造。

每个 label 能够蕴含 0 到 63 个字符,总共的域名长度不能超过 253 个字符。为什么是 253 个字符而不是 255 个字符呢?那是因为有 2 个字符是用来存储长度值的。

一般来说域名的标签是以 ASCII 字符示意的, 通常应用 a -z,A-Z,0- 9 和连字符来示意, 这种规定简称为 LDH(letters, digits, hyphen)规定。

在域名中,字符串是大小写不敏感的,这就意味着 www.flydean.com 和 WWW.FLYDEAN.COM 是等价的。

留神,标签不能以连字符结尾或者结尾,并且顶级域名不能全为数字。

有敌人可能会问了,不对呀,为什么我听过中文域名呢?

这是因为为了解决域名只能应用 ASCII 编码的问题,ICANN 通过了一个叫做 IDNA 国际化域名的零碎,通过这个零碎,用户应用程序(例如 Web 浏览器)能够应用 Punycode 将 Unicode 字符串映射到无效的 DNS 字符集。

什么是 Punycode 呢?Punycode 是一种应用 ASCII 字符集来示意 Unicode 的编码方式。感兴趣的同学能够自行摸索,这里就不细讲了。

Name servers

name servers 也被称为名称服务器,是用来解析域名的服务器。名称服务器是一种客户端 - 服务器的架构,每个名称服务器用于公布无关该域的信息以及治理从属于它的任何域的名称服务器。

这样的名称管理器就形成了层级构造。为了晋升域名解析的效率,通常会须要应用缓存来存储域名和服务器地址的对应关系,然而有时候咱们须要时效性更高的场景和服务,于是呈现了一种非凡的名称服务器,这种服务器叫做权威名称服务器。

为什么叫权威名称服务器呢? 这是因为权威名称服务器仅从由原始起源配置的数据中给出 DNS 查问的答案,而不是通过对另一个名称服务器的查问取得的后果。它是域名服务器查问中的最初一站,如果权威名称服务器中保留有申请的记录,则其会将已申请主机名的 IP 地址返回到收回初始申请的 DNS 解析器.

DNS 的工作流程

下面讲了那么多概念性的货色,大家可能会有些懵。没关系,这里咱们举一个具体的例子来察看一下 DNS 查问的整个流程。

如果用户在浏览器中输出 www.flydean.com 想拜访这个网站,因为用户输出的是一个域名,所以须要将域名解析成为 IP 地址,从而发送后续的数据申请包。

因为 DNS 自身是一个名称服务,所以须要一个客户端来申请 DNS,这个客户端就叫做 DNS 解析器。

一般来说 DNS 解析器是嵌入在浏览器中的,当用户输出 URL 来拜访网络资源的时候,浏览器会主动调用 DNS 解析器去对这个 URL 进行解析。

那么域名解析的第一站是哪里呢?域名解析的第一站就是根服务器, 也叫 root 服务器。

域名解析的申请由 root 服务器首先响应,然而 root 服务器并不会间接返回用户要解析的域名地址,而是依据用户拜访的域名中的顶级域名的不同,返回顶级域名服务器 (TLD) 的地址。

比方这里咱们要拜访的定义域名是.com,那么 root 服务器会返回.com 的顶级域名服务器的地址。

root 服务器有多少个呢?世界上的 root 服务器 IP 地址只有 13 个,这是因为晚期技术起因的限度导致的。这 13 个 root 服务器的 IP 地址中,1 个为主 root 地址,这个地址是由 ICANN 负责管理的,其余 12 地址中 9 个在美国,2 个在欧洲,1 个在日本。

尽管 root 根服务器 IP 只有 13 个,然而基于这 13 个 IP 地址构建了一个服务器集群,能够无效的保障根服务器的运行稳定性。从而不至于呈现根服务器不能拜访导致的大规模网络谬误。

回到咱们的解析过程,root 服务器把.com 顶级域名服务器的地址返回给了 DNS 解析器,DNS 解析会再次向.com TLD 发动解析查问。

.com TLD 会再次返回 flydean.com 的域名服务器地址给 DNS 解析器。

DNS 解析器再次发送申请给 flydean.com 的域名服务器,这里的域名服务器是一个权威域名服务器,因为这里是域名解析的最初一站,寄存着域名的实在 IP 地址,权威域名服务器通过查问失去 www.flydean.com 的实在 IP 地址,并返回给 DNS 解析器。

最初 DNS 解析器将这个 IP 地址返回给浏览器,供后续的浏览申请应用。

能够看到 DNS 解析是一个一直递归解析的过程,所以这样的解析器又被称为 DNS 递归解析器。

从下面的流程能够看到,每次域名的申请都须要通过 root 域名服务器,那么这样 root 域名服务器的压力会很大,为了解决这个问题,事实上咱们在应用的过程中引入了 DNS 缓存。

缓存的目标就是将 DNS 数据放到离本人最近的中央,从而提醒数据的处理速度和展现效率。

常见的 DNS 缓存有浏览器缓存和操作系统 DNS 缓存。

浏览器缓存就是由浏览器负责保护的 DNS 缓存,而操作系统 DNS 缓存是操作系统级的 DNS 缓存。

如果这两个缓存都不存在的话,那么本地的 DNS 客户端会将 DNS 查问产生到 ISP(Internet 服务提供商)外部的 DNS 递归解析器,对于 ISP 来说,它也会存在 DNS 缓存,所以如果新增一个域名或者更改一个 IP 地址,并不是马上失效的,而是须要期待肯定的工夫来让缓存生效或者缓存刷新。

DNS 资源记录

后面咱们提到了 DNS 命名空间中每个节点都是有 label 和 resource records (RR)组成的,RR 存储着资源的形容信息,会在收到 DNS 查问之后返回。

DNS RR 是由一条条的 record 形成的,上面是一条 record 的构造:

字段名 形容 长度 [octets]
NAME 此记录所属的节点的名称 可变
TYPE RR 类型 2
CLASS Class 代码 2
TTL RR 放弃无效的秒数 4
RDLENGTH RDATA 字段的长度 2
RDATA 附加数据字段 可变

其中 NAME 是树中节点的齐全限定域名。

TYPE 是记录类型。它示意数据的格局和用处,比方 A 示意用于将域名转换为 IPv4 地址,NS 示意列出了哪些名称服务器能够响应 DNS 的域查找,MX 示意指定用于解决指定域的邮件的邮件服务器在电子邮件地址中。

RDATA 是特定类型相干的数据,例如地址记录的 IP 地址,或 MX 记录的优先级和主机名。

DNS 音讯的构造

既然有 DNS 查问,那么就会有 DNS 查问的音讯构造,DNS 音讯能够分为两种, 别离是查问音讯和回复音讯。

每一个 message 都蕴含了一个音讯头和四个其余局部:question, answer, authority 和额定空间。

header 负责管制其余的 4 个局部,header 蕴含了这样几个字段:Identification, Flags, Number of questions, Number of answers, Number of authority resource records (RRs)和 Number of additional RRs,如下表所示:

字段名 形容 长度[bits]
QR 音讯是 query (0) 还是 reply (1) 1
OPCODE 查问的类型 QUERY (规范查问, 0), IQUERY (递归查问, 1), 或者 STATUS (服务器状态申请, 2) 4
AA 是否是权威服务器响应 1
TC 示意此音讯因长度过长而被截断 1
RD 是否递归查问 1
RA DNS 服务器是否反对递归 1
Z 保留字段 3
RCODE 响应码,能够是 NOERROR(0),FORMERR(1,格局谬误),SERVFAIL(2),NXDOMAIN(3,不存在的域名) 4

整个头的标记字段长度是 16bits,紧跟着 4 个 16bits,别离示意 4 个其余局部的长度。

总结

以上就是 DNS 的构造和 DNS 工作的根本流程。

本文已收录于 http://www.flydean.com/19-domain-name-service/

最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!

欢送关注我的公众号:「程序那些事」, 懂技术,更懂你!

退出移动版