灵魂拷问,你真的了解 DNS 吗?
未来已来,只是不均衡地分布在当下
大家好,我是菜农,欢迎来到我的频道。
都说程序员是面向 Google 编程,殊不知当你输入
www.google.com
地址的时候,是否有想过,在回车的一瞬间浏览器如何将请求发送,如何到达目的地为你取得正确的数据。
遇到问题我们通常会打开浏览器,输入 www.google.com
回车,然后搜索我们的问题,获取到我们想要的内容后,我们又会心满意足的关闭浏览器。
而在这一个请求的过程中,浏览器内部发生了什么?
我们也许会在某个不经意间发现,输入 142.251.43.14
这串 IP 也能够访问 Google 网站,而为了让人觉得高大上一点,你改掉了输入 google.com
的 "臭毛病", 而是每次都会在浏览器输入这串 IP,毕竟在回车之前别人总是难以琢磨你要访问的是哪个网站,除非遇到 "志同道合" 的人。
一开始你使用得不亦乐乎,毕竟敲入这串 IP 也能够熟能生巧,使用速度也不减当年,但某一天你跟往常一样输入这串 IP 的时候发现怎样都访问不到网站了,你开始急了,并寻找问题,怀疑自己的记忆力是否出现了问题,亦或是网站出现了问题,折腾半天后,发现是 Google 网站的 IP 发生了变化,而等待你的就只有两条路,一是继续背下新的 IP 地址,但难保某一天又面临不能访问的情况,二是回归从前,老老实实访问 google.com
。最终你醒悟了,终于发现背诵 IP 进行日常访问真是个 "有病" 的行为。
那么为什么 www.google.com
能够通过 142.251.43.14
进行访问?这里我们先记住两个名词,一个是域名,一个是 IP,www.google.com
是一个域名,而 142.251.43.14
则是一个 IP。概念:域名可以对应有多个 IP 地址。
怎么理解?很简单,打开你的手机通讯录,可以看到 富婆 就是一个 "域名" 的概念,而具体的电话号码就可以对应上 "IP"
我们想要给一个人打电话,我们可以输入富婆,也可以输入具体的电话号码,当然富婆的记忆点低,而电话号码的记忆点高,而为什么与遇到上面所说的一点时间后再次访问 IP 就访问不到网站了,这种情况你可以想象成,富婆换电话了 ~
那么回到我们的内容,将域名解析为 IP 的这个过程就是 DNS(Domain Name System) 域名系统。
DNS 产生背景
Internet 将数量众多的主机连接在一起,要让这些主机能够进行通信,就需要有一套名字标识体系,让主机之间能够彼此找到对方。实际上,在 Internet 上有多种方式可以进行主机标识,既可以用主机名(域名)标识,也可以使用 IP 地址进行标识。主机在互联网上的位置主要靠 IP 地址进行标识,每个 IP 地址都由 4 个字节组成,有这严格的层次结构,以便路由器进行识别和处理。但这种纯数字的标识方式对于人类的记忆来说简直是个噩梦,因此提出了主机名的标识方式,就是上述说到的 www.google.com
,这种名字的好处很直接,就是便于记忆。但是对于喜欢 0 和 1 的计算机来说,肯定更喜欢 IP 的表达方式,因此就出现了计算机喜欢 IP 地址,人喜欢主机名的对立情况,那么就需要一个适配器 来完成两者之间的转换,这就是主机名与 IP 地址的映射关系。
在 DNS 之初,整个网络中只有几百台的主机,所有的主机信息以及主机名与地址的映射记录都存放在一个名为 HOST.TXT 的文件中。 HOST.TXT 从一台名为 SRI-NIC 的主机上分发到整个网络,而维护映射记录的方式也很粗暴,通过将变更信息以电子邮件的方式告知管理员,然后进行定期 FTP 到 SRI-NIC 上,获得最新的 HOST.TXT 文件。
但这种方式长期来看肯定是不合实际的,互联网飞速发展,主机的数量日益暴增,存在问题:
无法进行分散管理
无法及时全网更新与同步
维护困难
为了解决以上问题,1984 年,南加州大学信息科学所的 PaulMockaprtris 发布了描述 DNS 的 RFC 882 和 RFC 883 的规范,简单来说就是 DNS 诞生了。
DNS 工作原理
DNS 实际上是一个应用层协议,但它通常被其他的应用层协议所使用,用于将用户提供的主机名解析为 IP 地址。
当我们在浏览器的地址栏上输入 www.google.com
这样一个 URL 时,实际上我们想要浏览的网页内容都存放在互联网中的某台服务器上,而浏览器的任务就是找到我们想要访问的这台服务器的 IP 地址,然后向它请求内容,而这一整个过程就是 DNS 工作的内容。
如图所示,DNS 地址解析服务是在 HTTP 连接建立之前的一个过程。从用户主机上调用应用程序的角度来看,DNS 是一个提供简单、直接的转换服务的黑盒子,但实际上 DNS 服务系统运转相当复杂,由分布于全球的大量 DNS 服务器以及相关应用层协议共同组成。
域名结构
整个互联网中的域名空间结构就像是一棵倒置的树
我们试着将一个 Google 的域名进行拆分,www.google.com
我们惊奇的发现,之前看似简单的一段域名居然由这么多部分构成。既然上部分说到,域名空间结构就像是一棵倒置的树,那么我们就手动梳理下这棵树的结构。
每个顶级域由对应的顶级域(TLD)服务器负责管理,除了以下 7 个顶级域名,还有各个国家的顶级域名(cn、uk、ca 和 fr 等)也在这一级别进行管理。
每个顶级域再向下展开分支,每个分支域都是一个子域,比如 google.com
是 com
的子域,而 google.com
也可再包含子域,比如 a.google.com
、b.google.com
。一个域就是域名空间中的一棵子树,域的名字也就是这棵子树的顶端节点的域名。
拆分原理
DNS 承载的流量是全球的流量,那么将结构设计为层次结构的原因也很简单,那就是分布承担流量
在每个域中,会有一台或多台服务器用来保存这个域名空间的所有信息,并且响应关于该域名空间的所有请求,这种服务器就叫做这个域的 权威域名服务器(授权域名服务器) 。它拥有这个域的所有的域名信息,每个域都可以分为多个子域,而每个权威域名服务器可以个一个或多个区域进行解析。
google.com 可以被划分为三个子域,a.google.com、b.google.com 和 c.google.com。每个子域都可以自行维护自己的权威域名服务器,一个域可以有多台权威域名服务器,但是只有一台是主域名服务器,这台主域名服务器负责向其他辅域名服务器分发每个域名空间的更新信息。简单理解,域名空间就相当于是一个 小集群
当一个子域被授权出去后,它原本所属的域就不再包含它的数据,而只留下一些指针,这些指针指向相应子域的授权域名服务器。如果有一个请求来询问该子域的信息,那么所返回的应该是该子域权威服务器的列表。
因此,DNS 服务器层由:根 DNS 服务器、顶级域名(TLD)服务器和权威 DNS 服务器共同组成 ,共同维护分布式、层次化的 DNS 数据库。DNS 系统采用树形设计的一个主要目的就是为了分撒管理,而这种分散管理是通过 授权 来实现的。对域进行授权,就是域管理组织把子域授权给其他组织进行管理,由子域管理者来维护子域中的数据,可以自由改动数据,包括对子域的再次划分和授权。
在 DNS 系统中还有一类非常重要的域名服务器,叫做 本地 DNS 服务器(LDNS),是用户所在局域网或 ISP 网络中 的域名服务器,本地 DNS 服务器地址是客户端网络配置的一部分,或者通过 DHCP 方式分配给客户端。
针对 DNS 的分布查询原理如下:
浏览器发出的请求会先发送到本地 DNS 服务器,本地 DNS 服务器收到浏览器的域名解析请求后,会采用递归的方式向 DNS 系统中的其他远程域名服务器提出查询请求。(递归方式指每次查询请求都由本地 DNS 服务器发起,收到答复后再向下一个远程 DNS 服务器提出请求,直到获得结果。迭代查询指本地 DNS 服务器只将自己知道的最合适的答案返回给查询者,帮助它把查询过程继续下去,而它本身不再做其他任何查询)
过程: 本地 DNS 服务器首先会去根 DNS 服务器请求解析(此时条件是本地 DNS 服务器并没有关于这个域名的缓存),根域名服务器中虽然没有www.google.com
这条记录的,但它可以知道这个 URL 属于com 域
,于是就找到 com 域服务器的 IP 地址,然后访问 com 域服务器,重复上面的操作,再找到放了google 域
的服务器是哪个,继续往下,直到找到www.google.com
的那条记录,最后返回对应的IP地址
。
缓存原理
频繁使用 DNS 查询会给使用它的互联网应用带来额外的时延,而时延本身不能确定,有可能大有可能小。那么为了解决这个问题就需要引入 缓存 机制。缓存是指 DNS 查询结果在主机中的缓存,有了缓存就不需要在每次查询的时候都经过复杂的递归过程。当然 DNS 数据有可能过期,因此 DNS 服务器不能把数据永远的存放在缓存中,管理员会为这些数据设置一个生存期(TTL)。超过 TTL 时间的数据会被清除,重新向 DNS 服务器进行查询。
除了 DNS 服务器能够缓存 DNS 响应信息之外,客户端浏览器也可以缓存 DNS 响应信息,当用户请求页面域名解析结果在浏览器自身的 DNS 缓存汇总能够查到时,就不会向 DNS 服务器发起请求了,这样可以加快浏览网页的速度。当消息记录时间超过浏览器设置的 DNS 缓存时间时,会重新向 DNS 服务器发起域名解析请求,用新的解析结果更新缓存。
记录类型与报文格式
域名服务器是根据资源记录来对 DNS 请求进行应答的。在 DNS 系统中,最常见的资源记录是 Internet 类记录,资源记录是一个包含了下列字段的 4 元组:
Name
Value
Type
TTL
其中,TTL 是该记录的生存时间,它决定了资源记录应当从缓存中删除的时间。Name 和 Value 的值取决于 Type,即记录类型。而记录类型分为以下几类:
我这里附上一张阿里云的域名解析配置图,先有一个大致的概念
A / AAAA:Address
A 记录用于描述域名到 IP 地址的映射关系,对同一个域名可以有多条 A 记录,也就是说一次 DNS 查找可以返回多个地址。
CNAME
CNAME 记录用于描述别名与域名的对应关系,这种记录允许你将多个名字映射到同一台计算机。比如我们有个域名是 cbuc.com
,那我可以添加一条 www.cbuc.com
的 CNAME 记录,以便请求 www.cbuc.com
时也能够访问到 cbuc.com
。查找过程也是通过 www.cbuc.com
找到 cbuc.com
,继而找到对应的 IP 地址,这里不再赘诉。
NS:Name Server
NS 记录是域名服务器记录,用于指定该域名由哪个 DNS 服务器来进行解析。每个区域可以有多个域名服务器,因此可以有多条 NS 记录。
SOA:Start Of Authority
SOA 记录用于指定该区域的权威域名服务器。每个区域允许切只允许有一个 SOA 记录,它是资源记录的第一个条目。
PTR:Pointor Record
PTR 记录用于描述 IP 地址到域名的映射关系
DNS 总结
DNS 是域名系统的简称,它是一种用于将域名和 IP 地址相互映射的协议。简单地说,它是一种用于将人类可读的域名(例如 www.google.com)转换为浏览器可以理解的 IP 地址(例如 142.251.43.14)的方法。这样,用户就可以通过输入域名来访问网站,而无需记住网站的 IP 地址。
DNS 的设计原理是使用分层的系统将域名和 IP 地址相互映射。主要包括以下三个部分:
域名服务器(DNS 服务器):DNS 服务器是网络中的一种特殊服务器,它存储了域名和 IP 地址的映射关系。当用户访问一个网站时,浏览器会向 DNS 服务器发出请求,DNS 服务器则会返回该网站的 IP 地址。
域名系统域(DNS 域名空间):DNS 域是用于组织 DNS 服务器的层次结构。它以树型结构组织 DNS 服务器,使得每个服务器都有一个唯一的名称,这样就可以方便地查找到指定的 DNS 服务器。
域名系统数据库(DNS 数据库):DNS 数据库是用于存储域名和 IP 地址映射关系的数据库。它包含了所有域名和 IP 地址的映射关系,以便 DNS 服务器可以根据用户的请求返回正确的 IP 地址。
简而言之,当用户访问一个网站时,浏览器会向 DNS 服务器发出请求,DNS 服务器会查询 DNS 数据库,并根据域名和 IP 地址的映射关系返回正确的 IP 地址
DNS 系统的设计具有以下几个亮点:
可扩展性:DNS 系统的分层结构允许添加新的 DNS 服务器,从而支持更多的域名和 IP 地址。
可靠性:DNS 系统可以通过多台 DNS 服务器进行冗余存储,从而提高系统的可靠性。
灵活性:DNS 系统允许用户随时修改域名和 IP 地址的映射关系,从而使网络更加灵活。
可维护性:DNS 系统可以使用缓存技术,从而减少 DNS 数据库的查询次数,降低系统的维护成本。
好了,以上便是本篇的所有内容,如果觉得对你有帮助的小伙伴不妨点个关注做个伴,便是对小菜最大的支持。不要空谈,不要贪懒,和小菜一起做个吹着牛X做架构
的程序猿吧~ 咱们下文再见!
今天的你多努力一点,明天的你就能少说一句求人的话!
我是小菜,一个和你一起变强的男人。
💋
微信公众号已开启,菜农曰,没关注的同学们记得关注哦!
版权声明: 本文为 InfoQ 作者【菜农曰】的原创文章。
原文链接:【http://xie.infoq.cn/article/1a67c66257e347f864e929900】。文章转载请联系作者。
评论