深入理解域名解析

DNS介绍

TCP/IP 网络是通过IP地址来确定通信对象的,因此不知道IP地址就无法将消息发送给对方,这和我们打电话的时候必须要知道对方的电话号码是一个道理。因此在委托操作系统发送消息时,必须要先查询好对方的IP地址。
那么又有人问了:既然如此.那干脆不要用IP地址,而是用名称来确定通信对象不就好了吗?
这样的想法其实并不奇怪,不过从运行效率上来看,这并不能算是一个好主意。互联网中存在无数的路由器,它们之间相互配合,根据IP地址来判断应该把数据传送到什么地方。那么如果我们不用P地址而是改用名称会怎么样呢?IP地址的长度为32比特,也就是4字节,相对地,域名最短也要几十个字节,最长甚至可以达到255字节。换句话说、使用IP地址只需要处理4字节的数字,而域名则需要处理几十个到255个字节的字符,这增加了路由器的负担,传送数据也会花费更长的时间。
于是,现在我们使用的方案是让人来使用名称,让路由器来使用IP地址。为了填补两者之间的障碍,需要有一个机制能够通过名称来查询IP地址,或者通过IP地址来查询名称,这样就能够在人和机器双方都不做出牺牲的前提下完美地解决问题。这个机制就是 DNS

DNS: Domain Name System,域名服务系统。将服务器名称和IP地址进行关联是DNS最常见的用法,但 DNS的功能并不仅限于此,它还可以将邮件地址和邮件服务器进行关联,以及为各种信息关联相应的名称

大致流程

在这里插入图片描述
在这里插入图片描述
当控制流程转移到Socket中的解析器后,解析器会生成要发送给 DNS 服务器的查询消息。这个过程与浏览器生成要发送给Web服务器的HTTP请求消息的过程类似,解析器会根据DNS的规格,生成一条表示“请告诉我www.lab.glasscom.com的IP地址”的数据,并将它发送给 DNS服务器(图1.123)。发送消息这个操作并不是由解析器自身来执行,而是要委托给操作系统内部的协议栈来执行。这是因为和浏览器一样,解析器本身也不具备使用网络收发数据的功能。解析器调用协议栈后,控制流程会再次转移,协议栈会执行发送消息的操作,然后通过网卡将消息发送给 DNS服务器(图1.1245)。
当DNS服务器收到查询消息后,它会根据消息中的查询内容进行查询。这个查询的过程有点复杂,我们稍后会进行讲解,这里先不关心具体的方法。
总之,如果要访问的Web服务器已经在DNS 服务器上注册,那么这条记录就能够被找到,然后其IP地址会被写入响应消息并返回给客户端(图1.12 ⑥)。接下来,消息经过网络到达客户端,再经过协议栈被传递给解析器(图1.12⑦⑧),然后解析器读取出消息取出IP地址,并将IP地址传递给应用程序(图1.12 ⑨)。实际上,解析器会将取出的IP地址写入应用程序指定的内存地址中,图1.11用“<内存地址>”来表示,在实际的程序代码中应该写的是代表这一内存地址的名称。

顺带一提,向DNS服务器发送消息时,我们当然也需要知道DNS服务器的IP地址。只不过这个IP地址是作为TCP/IP的一个设置项目事先设置好的,不需要再去查询了。不同的操作系统中TCP/IP的设置方法也有差异,Windows中的设置如图1.13所示,解析器会根据这里设置的DNS 服务器IP地址来发送消息。
在这里插入图片描述

DNS服务器的基本工作

前文介绍了解析器与DNS服务器之间的交互过程,下面来了解一下DNS服务器的工作。DNS服务器的基本工作就是接收来自客户端的查询消息,然后根据消息的内容返回响应。
其中,来自客户端的查询消息包含以下3种信息
(a)域名服务器、邮件服务器(邮件地址中@后面的部分)的名称
(b )Class
在最早设计DNS方案时,DNS在互联网以外的其他网络中的应用
也被考虑到了,而 Class就是用来识别网络的信息。不过,如今除了互联网并没有其他的网络了,因此 Class 的值永远是代表互联网的IN
(c)记录类型
表示域名对应何种类型的记录。例如,当类型为A时,表示域名对应的是IP地址;当类型为MX时,表示域名对应的是邮件服务器。对于不同的记录类型,服务器向客户端返回的信息也会不同
A是Address的缩写
MX:Mail eXchange:邮件交换

在这里插入图片描述

然而,Web 服务器的域名有很多都是像www.lab.glasscom.com这样以www开头的,但这并不是一定之规,只是因为最早设计Web的时候,很多Web服务器都采用了www这样的命名,后来就形成了一个惯例而已。因此、无论是 WebServer1也好,MySrv也好,只要是作为A”记录在 DNS服务器上注册的,都可以作为Web服务器的域名”。

首先,DNS服务器中的所有信息都是按照域名以分层次的结构来保存的。层次结构这个词听起来可能有点不容易懂,其实就类似于公司中的事业集团、部门、科室这样的结构。层次结构能够帮助我们更好地管理大量的信息。
DNS中的域名都是用句点来分隔的,比如 www.lab.glasscom.com,这里的句点代表了不同层次之间的界限,就相当于公司里面的组织结构不用部、科之类的名称来划分,只是用句点来分隔而已”。在域名中,越靠右的位置表示其层级越高,比如 www.lab.glasscom.com这个域名如果按照公司里的组织结构来说,大概就是“com事业集团glasscom部 lab科的 www"这样。其中,相当于一个层级的部分称为域。因此,com域的下一层是glasscom域,再下一层是 lab域,再下面才是www这个名字。

互联网中有数万台DNS服务器,肯定不能一台一台挨个去找。我们可以采用下面的办法。首先,将负责管理下级域的 DNS服务器的IP地址注册到它们的上级 DNS服务器中,然后上级DNS服务器的IP地址再注册到更上一级的DNS服务器中,以此类推。也就是说,负责管理lab.glasscom.com这个域的 DNS服务器的P地址需要注册到glasscom.com域的DNS服务器中,而glasscom.com域的DNS服务器的IP地址又需要注册到com域的DNS服务器中。这样,我们就可以通过上级 DNS服务器查询出下级DNS 服务器的IP地址,也就可以向下级 DNS服务器发送查询请求了。
在前面的讲解中,似乎com、 jp这些域(称为顶级域)就是最顶层了,它们各自负责保存下级 DNS服务器的信息,但实际上并非如此。在互联网中,com和 jp的上面还有一级域,称为根域。根域不像com. jp那样有自己的名字,因此在一般书写域名时经常被省略,如果要明确表示根域,应该像www.lab.glasscom.com.这样在域名的最后再加上一个句点,而这个最后的句点就代表根域。不过,一般都不写最后那个句点,因此根域的存在往往被忽略,但根域毕竟是真实存在的,根域的DNS服务器中保管着com . jp等的 DNS 服务器的信息。由于上级 DNS服务器保管着所有下级DNS 服务器的信息,所以我们可以从根域开始一路往下顺藤摸瓜找到任意一个域的DNS 服务器。
除此之外还需要完成另一项工作,那就是将根域的DNS服务器信息保存在互联网中所有的 DNS服务器中。这样一来,任何 DNS服务器就都可以找到并访问根域DNS服务器了。因此,客户端只要能够找到任意一台DNS服务器,就可以通过它找到根域DNS 服务器,然后再一路顺藤摸瓜找到位于下层的某台目标 DNS服务器(图1.15)。分配给根域DNS服务器的IP地址在全世界仅有13个",而且这些地址几乎不发生变化,因此将这些地址保存在所有的 DNS服务器中也并不是一件难事。实际上,根域DNS 服务器的相关信息已经包含在 DNS服务器程序的配置文件中了、因此只要安装了DNS 服务器程序,这些信息也就被自动配置好了。
在这里插入图片描述
如图1.16所示,客户端首先会访问最近的一台 DNS服务器(也就是客户端的TCP/P设置中填写的 DNS服务器地址)、假设我们要查询www.lab.glasscom.com这台Web服务器的相关信息(图1.16①)。由于最近的 DNS服务器中没有存放 www.lab.glasscom.com这一域名对应的信息,所以我们需要从顶层开始向下查找。最近的 DNS服务器中保存了根域DNS服务器的信息,因此它会将来自客户端的查询消息转发给根域DNS服务器(图1.16②)。根域服务器中也没有www.lab.glasscom.com这个域名,但根据域名结构可以判断这个域名属于com域,因此根域DNS服务器会返回它所管理的com域中的DNS 服务器的IP地址,意思是“虽然我不知道你要查的那个域名的地址,但你可以去com域问问看”。接下来,最近的 DNS服务器又会向com域的DNS服务器发送查询消息(图1.163)。com域中也没有www.lab.glasscom.com这个域名的信息,和刚才一样,com域服务器会返回它下面的glasscom.com域的DNS服务器的IP地址。以此类推,只要重复前面的步骤,就可以顺藤摸瓜找到目标 DNS服务器(图1.165),只要向目标 DNS服务器发送查询消息,就能够得到我们需要的答案,也就是www.lab.glasscom.com的IP地址了。

通过缓存加快 DNS 服务器的响应

在客户端输入 URL 后,会有一个递归查找的过程,从浏览器缓存中查找->本地的hosts文件查找->找本地DNS解析器缓存查找->本地DNS服务器查找,这个过程中任何一步找到了都会结束查找流程。

图1.16展示的是基本原理,与真实互联网中的工作方式还是有一些区别的。在真实的互联网中,一台 DNS 服务器可以管理多个域的信息.因此并不是像图1.16这样每个域都有一台自己的 DNS服务器。图中,每一个域旁边都写着一台DNS服务器,但现实中上级域和下级域有可能共享同一台DNS 服务器。在这种情况下,访问上级 DNS服务器时就可以向下跳过一级 DNS服务器、直接返回再下一级 DNS服务器的相关信息。
此外,有时候并不需要从最上级的根域开始查找,因为DNS服务器有一个缓存功能,可以记住之前查询过的域名。如果要查询的域名和相关信息已经在缓存中,那么就可以直接返回响应,接下来的查询可以从缓存的位置开始向下进行。相比每次都从根域找起来说,缓存可以减少查询所需的时间。
并且,当要查询的域名不存在时,“不存在”这一响应结果也会被缓存。这样,当下次查询这个不存在的域名时,也可以快速响应。
这个缓存机制中有一点需要注意,那就是信息被缓存后,原本的注册信息可能会发生改变,这时缓存中的信息就有可能是不正确的。因此,DNS服
务器中保存的信息都设置有一个有效期,当缓存中的信息超过有效期后,数据就会从缓存中删除。而且,在对查询进行响应时,DNS服务器也会告知客户端这一响应的结果是来自缓存中还是来自负责管理该域名的 DNS服务器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值