精读-DNS服务器如何寻找IP地址

307 阅读10分钟

写在前面

在面试中,经常遇到面试官这样问到:输入网址到浏览器中发什么了什么,于是我开始拿出了“老三样”,DNS解析、TCP链接叭叭叭一堆,当我反问自己究竟对DNS服务器到底是怎样将域名解析成IP的时候我开始慌了。首先先列出来我对DNS服务器的疑问。

  • DNS在网络传输中担任什么角色?
  • DNS是怎样将域名解析成IP地址的?
  • 为什么不在网址中写IP地址,这样不就不需要DNS服务器了嘛?
  • 为什么不能用网址来确定通讯对象。而要用IP?...

1 DNS在网络传输中担任什么角色

1.1 IP的基本知识

所有的互联网公司的局域网都是基于TCP/IP思路来设计的,TCP/IP的设计思路就是由一些小的子网,通过路由器连接起来组成一个大的网络,子网可以理解为用集线器(对包进行转发的设备,某些路由器中已经自带了集线器,他们在路由器内部已经连接起来了)连接起来的计算机,将子网通过路由器连接起来就形成了一个网络。

所有的设备都会被分配一个地址,就像是身份证上的地址 xx路xx小区xx室,xx小区对应的是子网,xx区对应的就是某一台计算机,这个地址在网络中就称为IP地址,通过IP地址就可以找到对应的计算机,从而将消息发送到服务器。现在用的是IP协议的第四版简称IPv4,是由一串32Byte的数组组成,按照8位一组分成4组,再用十进制表示并且用圆点隔开,这就是IP地址了。其中对于主机号网络号表示不固定,需要另外附加信息详情参考阮一峰-互联网协议入门

1.2 DNS服务器的作用

DNS(Domain Name System,域名系统),将服务器与IP地址关联是DNS常见用法,想要进行网络传输,必须要明确IP地址,就像快递员送快递,如果他不知道详细的地址,就无法将快递准确的送到客户的手里,所以在委托操作系统发消息之前必须先查询IP地址

既然如此为何不用服务器名字去确定通信对象呢,从运行效率上看,由于域名的长短差距较大,处理长短不一的数据比处理固定数据要复杂,造成了效率低下,也无形中增加了路由起的负担。为了弥补其中的不足,DNS完美的解决了这件事情,这个时候我们访问网站输入网站域名,DNS服务器就解析我们的域名为IP样我们实际访问的就是对应的IP地址。

2 客户端如何发出向DNS服务器查询的请求

调用socket库中的解析器向DNS发出查询

socket库是用于调用网络功能的程序组件集合,包含很多用于发送和接收数据的程序组件,其中就包含解析器。是网络开发中的一种标准库。 对于DNS服务器,我们的计算机上有相应的DNS客户端,称为解析器。具体来说就是只要写上解析器的程序名称,以及web服务器的域名,就完成了对解析器的调用。调用解析器后,解析器会向DNS服务器发送查询消息,然后DNS服务器返回响应消息。响应消息中包含查询到的IP地址,解析器会取出IP地址并写到指定的内存中,接下来就可以在向web服务器发送消息时一起交给操作系统,到此DNS解析域名就完成了。

上图即为整个查询DNS服务器的过程,和浏览器一样,解析器也不具备收发数据的功能,传输层需要解析器调用协议栈,协议栈会执行发送消息的操作。然后通过网卡将消息发送到DNS服务器。如果要访问的web服务器已经在DNS服务器上注册,那这条记录就会被找到,IP地址便随着响应消息返回给客户端,通过协议栈再传递给解析器,解析器会将取出的IP写入指定程序的应用内存地址中。应用层序此时就可以使用IP地址了。

实际上向DNS服务器发送消息时也是需要知道DNS服务器的IP地址的,只不过整个IP地址是事先设置好的,不需要再去查询。

3 DNS服务器的功能

3.1客服端的查询消息

DNS就是根据客户端的查询消息然后返回对应的信息,那消息中包含哪些信息呢? 包含一下三种消息

  • 域名:服务器的名称
  • Class:用来识别网络类型,如今出来互联网也没有其他类型的网络了,所以Class目前是IN
  • 记录类型:表示域名对应何种类型的记录,对于不同的记录类型也会有不同的消息返回。
记录类型 解释
A 域名对应IP
MX 域名对应邮件服务器
NS 解析服务器记录。用来表明由哪台服务器对该域名进行解析,这里的NS记录只对子域名生效(优先级高于A)
TXT 为某个主机或域名设置联系信息
AAAA 是用来将域名解析到IPv6地址的DNS记录。用户可以将一个域名解析到IPv6地址上,也可以将子域名解析到IPv6地址上。
SRV 一般是为Microsoft的活动目录设置时的应用。
CNAME 解析域名到域名
URL转发 是URL到URL的映射,把某一个URL地址指向另一个URL地址

在我们申请到一个域名时,先要进行域名解析,此过程会将解析的内容保存到DNS服务器上,当客户端发送消息时便将符合要求的记录返回。如下图

列如,我要查找www.sina.com.cn这个域名下对应的IP,客户端会发送消息,然后DNS服务器会从已有的记录查找与之匹配的记录,如上图需要查找的消息与DNS服务器记录的第一条一样,则会将123.126.55.41返回给客户端。

3.2域名的分级查询

假如所有的域名信息全部都保存到了一台DNS服务器,那么所有的域名都可以查询到对应的信息,但是全世界有数不清的服务器,将这些服务器保存在一台DNS服务器上是不可能的,那如何将所有的域名信息保存在DNS服务器上呢?答案就是将信息分布保存在多台DNS服务器上,每个部分都是一个域,只有这些域接力查找才会查到想要的信息。比如www.qq.com这个域名,其中.是DNS的命名空间,用来分隔不同的域,其实com后面还有一个.,真正的域名应该是www.qq.com.root,因为是域名系统默认的,所以不用写,这个就根域名。

根域名下是顶级域名,如com、net,再下面就是次级域名,如qq,再下面就是三级域名,是在自己域里面为服务器分配的名称。

所以我们想要查询到web服务器的信息,就要先找到其归哪一台DNS服务器管辖。首先,我们将负责管辖下级域的DNS服务器的IP注册到上级,再将上级注册到更上级。如qq.com这个域的DNS服务器要先将IP注册到.com中,再将.com注册到根域中,这样就可以通过上级DNS服务器查询出下级的IP了。除此之外,根域的DNS服务器信息会保存在所有的DNS服务器中,这样所有的DNS服务器找到并访问根域的DNS服务器了。因此客户端只要找到一台DNS,便可以一路寻到目标DNS服务器。如下图

客户端会访问最近的一台DNS服务器,也就是电脑设置中的DNS服务器,由于最近的DNS中无目标域名信息,所以便会直接访问到根域,再一层一层向下寻找,直到找到目标服务器,向目标服务器发送查询消息后就可以得到我们想要的信息了。

3.3 TTL和缓存

在实际网络中并不是每个域都有对应的DNS服务器,有肯存在上下级共用一个DNS服务器的,在这种情况下,访问上级以后就可以跳过一级,直接访问再下一级的DNS服务器。

此外假如我们每次都发送一次DNS请求,服务器的压力将会很大,所以有时候并不需要每次都从上往下去寻找,因为DNS服务器有缓存功能,可以记住之前查询过的域名,如果信息已经在缓存中了,就可以直接从缓存中得到对应的信息。并且当查询的域名不存在时也会被缓存,当下次查询时可以快速响应。

信息被缓存后,原本的注册信息发送改变,此时缓存中 的信息就是不正确的,所以实际上要设置TTL值把DNS缓存到本地。TTL它就是返回的记录在DNS服务器上保留的时间。DNS会将最终域名解析的结果缓存至本地。分为两种浏览器缓存和操作系统(OS)缓存。在浏览器中访问的时候,会优先访问浏览器缓存,如果访问指定域名,没有命中返回,则访问OS缓存。最后再次访问dns服务器。

4 DNS查询跟踪

虽然只需要返回一个IP地址,但是DNS的查询过程非常复杂,分成多个步骤。 工具软件dig可以显示整个查询过程。

dig qq.com

返回信息的内容,分为5部分,头部HEADER、虚选项部OPT PSEUDOSECTION、查询部分QUESTION SECTION、回复部分ANSWER SECTION、权威机构部分AUTHORITY SECTION、附加部分ADDITIONAL SECTION

QUERY 查询数,1代表1个查询,对应下面的QUESTION SECTION中的记录数,结果表示,查询qq.com的A记录。

ANSWER 结果数,3代表有3项结果,对应下面ANSWER SECTION中的记录数。结果表示有三个A记录,即为3个IP地址,TTL值为110,即110秒内不需要重复查询。

AUTHORITY 权威域名服务器记录数,可供域名解析用。对应下面AUTHORITY SECTION ADDITIONAL 格外记录数,对应下面 ADDITIONAL SECTION。

参考文章

网络是怎样链接的[户根勤/日]
写给前端工程师的DNS基础知识
DNS 原理入门[阮一峰]

文章为读书后对知识点的总结,若有错误之处,还请大佬指出。