DNS域名解析

200 阅读5分钟

什么是DNS

DNS即域名系统(Domain Name System)。当我们在浏览器输入一个url地址时,浏览器要向这个url的主机名对应的服务器发送请求,就得知道服务器的IP,对于浏览器来说DNS的作用就是将主机名转换成IP地址。下面是摘自《计算机网络:自定向下方法》:

DNS是:

  1. 一个由分层的DNS服务器实现的分布式数据库
  2. 一个使得主机能够查询分布式数据库的应用层协议

DNS是一个应用层协议,我们发送一个请求,其中包含我们要查询的主机名,它就会给我们返回这个主机名对应的IP

其次,DNS是一个分布式数据库,这个DNS系统由分散在世界各地的很多太DNS服务器组成,每台DNS服务器上都保存了一些数据,这些数据可以让我们最终查到主机名对应的IP

所以DNS的查询过程,说白了就是去向这些DNS服务器询问主机名的IP是多少,如果询问的DNS服务器不知道可以继续查询去哪台DNS服务器继续查询,知道查询到对应的IP


分布式、层次数据库

什么是分布式

这个世界上没有一台DNS服务器拥有英特网上所有主机的映射,每台DNS只负责部分映射

什么是层次

DNS服务器有3种类型:根DNS服务器、顶级域(Top-Level Domain,TLD)DNS服务器和权威DNS服务器。它们的层次结构如下图所示:

DNS服务器类型

  • 根DNS服务器

    首先要明确根域名是什么,比如www.baidu.com,有些同学可能会误以为com就是根域名,其实com是顶级域名,www.baidu.com的完整写法是www.baidu.com.,最后这个.就是根域名

    根DNS服务器的作用是什么呢?就是管理它的下一级,也就是顶级域名DNS服务器。通过询问根DNS服务器,我们可以知道一个主机对应的顶级域名DNS服务器的IP是多少,从而继续向顶级域DNS服务器发起查询请求

  • 顶级域DNS服务器

    除了前面提到的com是顶级域名,常见的顶级域名还有cnnetorgedu等。顶级域名DNS服务器,也就是TLD,提供了它的下一级,也就是权威DNS服务器IP地址

  • 权威DNS服务器

    权威DNS服务器可以返回主机->IP的最终映射


本地DNS服务器

严格来说,本地DNS服务器并不属于DNS的层次结构,但它对DNS层次结构是至关重要的。

每个ISP(Internet Service Provider 即“互联网服务提供商”)都有一台本地DNS服务器,比如一个居民区的ISP、一个大学的ISP、一个机构的ISP,都有一台或多台DNS服务器。当主机发出DNS请求时,该请求被发往本地DNS服务器,本地DNS服务器起着代理作用,并负责将该请求转发到DNS服务器层次结构中。


递归查询、迭代查询

如下图,假设主机m.n.com想要获取主机a.b.com的IP地址,会经过一下几个步骤:

  1. 首先,主机m.n.com向他的本地DNS服务器发送一个DNS查询报文,其中包含期待被转换的主机名a.b.com

  2. 本地DNS服务器将该报文转发到根DNS服务器

  3. 该根DNS服务器注意到com前缀,便向本地DNS服务器返回com对应的顶级域DNS服务器(TLD)的IP地址表

    意思是,我不知道a.b.com的IP,不过这些TLD服务器可能知道,你去问他们吧

  4. 本地DNS服务器则向其中一台TLD服务器发送查询报文

  5. 该TLD服务器注意到b.com前缀,便向本地DNS服务器返回权威DNS服务器的IP地址列表

    意思是,我不知道a.b.com的IP,不过这些权威服务器可能知道,你去问他们吧

  6. 本地DNS服务器又向其中一台权威服务器发送查询报文

  7. 终于,该权威服务器返回了a.b.com的IP地址

  8. 本地DNS服务器将a.b.com跟IP地址的映射返回给主机m.n.com就可以用该IP向a.b.com发送请求啦

主机m.n.com向本地DNS服务器dns.n.com发出的查询就是递归查询,这个查询是主机m.n.com以自己的名义向本地DNS服务器请求想要的IP映射,并且本地DNS服务器直接返回映射结果给主机

而后继的三个查询是迭代查询,包括本地DNS服务器向根DNS服务器发送查询请求、本地DNS服务器向TLD服务器发送查询请求、本地DNS服务器向权威DNS服务器发送查询请求,所有的请求都是由本地DNS服务器发出,所有的响应都是直接返回给本地DNS服务器

所有的DNS查询都必须遵循这种递归+迭代的模式吗? 当然不是

从理论上讲,任何DNS查询既可以是递归的,也可以是迭代的。下图的所有查询就都是递归查询,不包含迭代

看到这里,大家可能会有个疑问,TLD一定知道权威DNS服务器的IP地址吗?

还真不一定,有时TLD只是知道中间的某个DNS服务器,再由这个中间DNS服务器去找到权威DNS服务器。这时候,整个查询过程就需要更多的DNS报文。


DNS缓存

为了让我们更快的拿到想要的IP,DNS广泛使用了缓存技术。DNS缓存的原理非常简单,在一个DNS查询的过程中,当某一台DNS服务器接收到一个DNS应答(例如,包含某主机到IP地址的映射)时,它就能够将映射缓存到本地,下次查询就可以直接用缓存里的内容。当然,缓存并非永久的,每一条映射记录都有一个对应的生存时间,一旦过了生存时间,这条记录就应就该从缓存移除。

事实上,有了缓存,大多数DNS查询都绕过了根DNS服务器,需要向根DNS服务器发起查询的请求很少