域名系统简介

DNS的由来

在计算机网络中,是使用ip地址来唯一标识主机的,但是这些ip地址对于人类来说却是非常难以记忆的,并且一台主机的ip地址也可能会发生改变。因此,为了方便人类理解和记忆,还是使用了主机名,如:www.google.com 来标识这台主机。但是主机名可能由不定长的字母数字组成,路由器难以处理,路由器只能处理格式固定的ip地址。而这时候就需要一个系统支持从主机名到ip地址的转换,而这个系统就是域名系统(DNS),前面提到的主机名就是一个域名。

DNS提供的服务

  • DNS是由分层的DNS服务器实现的分布式数据库
  • DNS是一个使得主机能够查询分布式数据库的应用层协议,DNS协议运行在UDP之上,使用53号端口

而DNS最重要的一个服务就是提供主机名像ip地址的映射。比如为了使得客户端的主机能够将一个HTTP请求报文发送到Web服务器www.someschool.edu,该客户端必须通过DNS获取到这个主机ip地址。除了主机名到ip地址的转换外,还提供了一些比较重要的服务:

  • 主机别名:有着复杂主机名的主机能拥有一个或者多个别名。比如一台名为relay1.west-coast.enterprise.com的主机,可能还有两个别名enterprise.com和www.enterprise.com。在这种情况下,relay1.west-coast.enterprise.com叫做规范主机名,应用程序可以调用DNS来获得主机别名对应的规范主机名以及主机的ip地址。
  • 邮件服务器别名:DNS允许一个公司的邮件服务器和Web服务器使用相同的主机名,例如:一个公司的Web服务器和邮件服务器都能叫做enterprise.com。
  • 负载分配:DNS也用于在冗余的服务器之间进行负载分配,繁忙的站点通常集群分布在多台服务器上面,每台服务器运行在不同的端系统,有着不同的ip地址。而这些集群分布的ip地址集合可以和同一个规范主机名相关联,在DNS数据库中也存储着这些ip地址集合。

    域名结构

    image.png
    域名结构就是一棵树,最上面的是根,它没有名字。因为根没有名字,所以根下面的一级节点就是顶级域名,往下同理。以 www.baidu.com/ 为例,www 是三级域名,baidu 是二级域名,com 是顶级域名,各级域名之间通过 . 相连。每个互联网上的主机域名都对应一个 IP 地址,并且这个域名在互联网中是唯一的。
    image.png
    根据域名服务器所起到的作用,可以把域名服务器分为三种不同的类型:
    image.png

  • 根域名服务器(root name server)是最高层次的域名服务器,也是最重要的域名服务器,全球共设有 13 个根域名服务器。所有的根域名服务器都知道所有的顶级域名服务器的域名和 IP 地址。当其他的域名服务器无法解析域名时,会首先求助于根域名服务器。假如所有的根域名服务器都挂了,那么整个互联网的 DNS 系统就无法工作了,因为采取的分布式结构,所以只要有一台能够正常工作,互联网的 DNS 系统就不会受到影响。

  • 顶级域名服务器(top-level-domain) 负责管理在该顶级域名服务器上注册的所有二级域名,当收到 DNS 查询请求时,就给出相应的回答。
  • 权限域名服务器,有时候也称为权威域名服务器,它是负责一个区的域名服务器,当一个权限域名服务器没有给出最后的查询结果时,就会告诉发出查询请求的 DNS 客户,下一步应当查询哪一个权限域名服务器。

image.png

注意: 除了上面的三种类型的DNS服务器,还有本地域名服务器(Local Name Server),它并不属于上面图示的服务器层次结构,但是它在域名服务系统却发挥着至关重要的作用。当一台主机发出 DNS 查询请求时,这个查询请求报文就会发送给本地域名服务器。每一个互联网提供者,或者一个大学,甚至小到一个学院,都可以拥有一台本地域名服务器,这种域名服务器也被称为默认域名服务器。我们本地网络服务连接的域名服务器指的就是本地域名服务器。 这个本地域名服务器,也被称作为域名解析器(DNS recursor)。

域名系统工作原理

域名解析过程

在不考虑DNS缓存的情况下,以客户端访问域名“example.com”为例子说明:
image.png
执行步骤顺序:

  1. 客户端(浏览器)像域名解析器(即本地域名服务器)发起获取example.com的ip地址请求
  2. 域名解析器查询根域名服务器
  3. 根域名服务器返回对应的顶级域名服务器的ip
  4. 域名解析器根据上面获取的顶级域名服务器的ip去顶级域名服务器查询
  5. 顶级域名服务器器返回对应的权威域名服务器的ip
  6. 域名解析器根据ip查询上述获得的权威域名服务器
  7. 权威域名服务器返回exampl.com服务器的ip地址
  8. 域名解析器返回目标服务器的ip地址给浏览器
  9. 浏览器和目标服务器建立TCP链接并发送请求报文
  10. 浏览器接收目标服务器的响应报文

上述查询过程是互联网中最常用的查询方式,当然还有另外一种查询方式:
image.png
上面的两种查询涉及到两个概念:迭代查询和递归查询。
image.png

  • 迭代查询的特点是当根域名服务器收到本地域名服务器发出的迭代查询请求报时,要么给出所要查询的 IP 地址,要么告诉本地域名服务器:“我这里没有你要的查询结果,你需要向哪一台域名服务器进行查询”,然后本地域名服务器进行后续的查询。
  • 递归查询的特点是如果主机所询问的本地域名服务器不知道被查出来的域名的 IP 地址,那么本地域名服务器就以 DNS 客户的身份,向其他根域名服务器继续发出查询请求报文(替代该主机继续查询),而不是主机自己进行下一步的查询。因此,递归查询返回的结果要么是所查询的 IP 地址,要么报错表示无法查到所需要的 IP。

    DNS缓存

    在上述的查询过程中,如果每次HTTP请求都这样进行,显然会导致速度慢、整体网络压力大的情况,而使用缓存就可以改善时延并减少在因特网上到处传输的DNS报文数量,因此在实际中,域名系统其实是大量应用DNS缓存的。DNS缓存应用的原理也很简单,在一次请求链路中,当某DNS服务器接收一个DNS响应报文时,它能够将主机名和ip地址映射关系缓存起来,当下次查询这个映射关系时就会直接返回,无需再经过网络去请求对应的DNS服务器。但是,由于主机名和ip地址的映射关系并不是永久的,DNS服务器在一段时间后(通常为2天)将丢弃缓存信息。举个例子说明,假设a.gdut.edu查询cnn.com的ip地址并缓存了其映射关系,假设几个小时后b.gdut.edu也要查询cnn.com的ip地址,这时候b.gdut.edu就不许要去访问任何DNS服务器了,直接返回缓存即可。当然,本地DNS服务器也能够缓存TLD服务器的ip地址,这时候就可以绕过根服务器了,其它类型的DNS服务器缓存原理类似。

    DNS记录和报文

    DNS资源记录

    共同实现DNS分布式数据库的所有DNS服务器存储了资源记录(Resource Record),资源记录提供了主机名到ip地址的映射。每个DNS回答报文包含一条或多条资源记录,资源记录是一个包含下列字段的4元组:“(Name,Value,Type,TTL)”。其中,TTL是该资源记录缓存的生成时间,它决定了资源记录应当从缓存中删除的时间。而Name和Value所代表的意义则由Type来决定:

  • Type=A:Name就是主机名,Value就是主机的IP 地址。因此,一个A类型的记录提供了一个标准的hostname-to-IP地址的映射

  • Type=NS:Name是个域(如:foo.com),而Value则是个知道如何获得该域中主机ip地址的权威DNS服务器的主机名,如:(foo.com, dns.foo.com, NS)
  • Type=CNAME,Value是规范主机名,而Name则是对应的别名,该记录能够向查询的主机提供一个主机名对应的规范主机名
  • Type=MX:Value是规范主机名,而Name则是对应的邮件服务器。

    这些资源记录是由专门的组织机构来为维护的,这些机构通常是域名注册登记机构。

DNS报文

image.png

头部

  • 会话标识(2字节):是DNS报文的ID标识,对于请求报文和其对应的应答报文,这个字段是相同的,通过它可以区分DNS应答报文是哪个请求的响应
  • 标志(2字节):

image.png

QR(1bit) 查询/响应标志,0为查询,1为响应
opcode(4bit) 0表示标准查询,1表示反向查询,2表示服务器状态请求
AA(1bit) 表示授权回答
TC(1bit) 表示可截断的
RD(1bit) 表示期望递归
RA(1bit) 表示可用递归
rcode(4bit) 表示返回码,0表示没有差错,3表示名字差错,2表示服务器错误(Server Failure)
  • 数量字段(总共8字节):Questions、Answer RRs、Authority RRs、Additional RRs 各自表示后面的四个区域的数目。Questions表示查询问题区域节的数量,Answers表示回答区域的数量,Authoritative namesversers表示授权区域的数量,Additional recoreds表示附加区域的数量

    正文

  • Queries区域

image.png
查询名:长度不固定,且不使用填充字节,一般该字段表示的就是需要查询的域名(如果是反向查询,则为IP,反向查询即由IP地址反查域名),一般的格式如下图所示:
image.png
image.png


image.png
image.png