DNS: 因特网的目录服务

119 阅读7分钟

参考资料是《计网·自顶向下(第七版)》,第 2.4 节。

前言

人类能以多种方式来标识,在生活中大家喜欢用 “名字” 来标识,在登记酒店的时候用 “身份证号” 来标识...
因特网上的主机和人类一样,有多种(两种)方式来标识:

  1. 主机名 hostname
  2. IP地址 IP_address

DNS提供的服务

在主机的两种标识中,人们喜欢便于记忆的主机名方式,而路由器喜欢 定长的、有层次结构的IP地址。 自然地,我们需要一种能进行主机名到IP地址转换的目录服务,which is 域名解析系统(DNS Domain Name System) 的主要任务!

注意这里是主要任务,而不是全部任务,让我看看是哪个小傻瓜以为这就是DNS的全部功能? ... 这个傻子就是我..

介绍一下DNS

DNS是:

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

DNS是应用层协议: 1. 使用客户-服务器模式运行在通信的端系统之间 2. 在端系统之间通过下面的端到端运输协议来传送DNS报文 与其他应用程序的显著不同是:DNS不是一个直接和用户打交道的应用,相反,DNS为“用户应用”及其他软件提供核心功能——主机名到IP的转换

  1. DNS协议运行在UDP之上,使用53号端口

因特网体系结构的复杂性大多位于网络的 “边缘”。DNS就是这种设计原理的一个典型范例,DNS通过采用位于网络边缘的客户和服务器,实现了关键的名字到IP的转换功能。

所以DNS都有哪些服务

总结放前面:

  1. 主机名到IP的转换
  2. 主机别名
  3. 邮件服务器别名
  4. 负载分配

可以看到,除了“耳朵都听出茧”的主机名到IP的转换外,DNS还提供了一些重要的服务,我将依次展开。

主机别名(host aliasing)

复杂的主机能拥有一个/多个别名。
例如,一台名为 relay1.west-coast.enterprise.com 的主机,可能有两个别名 enterprise.comwww.enterprise.com 。这种情况下,relay1.west-coast.enterprise.com 称为规范主机名。跟规范主机名相比,主机别名更好记忆。
应用程序可以调用DNS来获得主机别名对应的规范主机名以及主机的IP地址

邮件服务器别名(mail server aliasing)

人们也希望电子邮箱地址好记忆,所以跟上面的主机别名差不多的,电子邮箱应用程序可以调用DNs来对别名进行解析,以获得该主机的规范主机名和IP。

负载分配(load distribution)

繁忙的站点会被分布在多台服务器上,每台服务器都有不同的IP,因此同一个规范主机名对应一个IP地址集合,DNS服务器中存储着这些IP。
当用户发出DNS请求的时候,DNS server 用这个IP集合进行响应,但在每个回答中循环这些地址次序。用户通常总是向IP地址排在最前面的地址发送HTTP请求,因此DNS就在这些服务器之间循环分配了负载。

DNS的循环同样可以用于邮件服务器

DNS工作机理概述

我们首先来假设下面这一场景:在因特网上只使用一个DNS服务器,该服务器包含有所有的映射。这种集中式的设计非常简单,但是如今因特网里有着数量巨大的主机,这种集中式设计会有以下四个问题:

  1. 单点故障(a single point of failure)。如果这个服务器崩溃,那么整个因特网都将瘫痪。
  2. 通信容量(traffic volume)。单个DNS服务器处理所有的DNS查询,恐怖的通信容量。
  3. 远距离的集中式数据库(distant centralized database)。肯定会出现的情况是:这个单个的服务器距离一些主机太远(可能是地球的另一侧),这将导致严重的时延。
  4. 维护(maintenance)。这个单个服务器不得不为所有的主机保留记录,导致中央数据库庞大,还要频繁添加新主机。

分布式、层次数据库

为了处理扩展性问题,DNS使用了大量的DNS服务器,它们以层次方式组织,并且分布在全世界范围内。
在DNS服务器的层次结构中,有三类DNS服务器:

  1. 根DNS服务器。有400多个根服务器遍及全世界,由13个不同的组织管理。根服务器提供TLD(顶级域)服务器的IP
  2. 顶级域服务器。对于每个顶级域(com / org / edu /..)和所有国家的顶级域(uk / fr / jp /..),都有TLD服务器。TLD服务器提供了权威DNS服务器的IP
  3. 权威DNS服务器。多数大学和大公司实现和维护它们自己基本和辅助(备份)的权威DNS服务器。

还有一类万万不可忽视的DNS服务器:本地DNS服务器,虽然严格来说不属于服务器的层次结构,但是它对于服务器的层次结构至关重要。每个ISP都有一台本地DNS服务器。

对于某居民ISP来说,本地DNS服务器可能就与主机在同一个局域网中。当主机发出DNS请求时,该请求被发往本地DNS服务器,它起着代理的作用,并将该请求转发到DNS服务器层次结构中。

下面是一个简单的例子:主机 cse.nyu.edu想知道主机gaia.cs.umass.edu的IP地址。请求主机、本地DNS 以及 各DNS服务器层次结构的交互如下图所示:
image.png

在本例中,为了获得一台主机名的映射,一共发送了8份DNS报文: 4份查询报文 + 4份回答报文。 我们假设TLD服务器知道用于主机的权威DNS服务器的IP地址,但这种假设并不总是正确的!如果TLD只是知道中间某个DNS服务器,该服务器依次才能知道权威服务器,那么将多发送起码2份报文。

递归查询: 上个例子里,请求主机和本地DNS服务器之间就是递归查询,即“直接告诉我最后结果”。
迭代查询: 上个例子中的其他请求是迭代查询,即“告诉我下一个DNS服务器的IP地址”。

DNS缓存

为了改善时延性能并减少在因特网上到处传输的DNS报文数量,DNS广泛使用了缓存技术。
例如,还是在上面的例子中,每当本地DNS服务器接收到一个回答,它能够缓存该回答的信息。缓存时常默认为两天,即两天之后将丢弃缓存的信息。

事实上,因为缓存,除了少数的DNS查询以外,根服务器被绕过了。

DNS记录和报文

所有DNS服务器存储了资源记录(Resource Record, RR),RR提供了主机名到IP的映射。
RR是一个包含了如下字段的四元组:( Name, Value, Type, TTL )
TTL是该记录的生存时间,它决定了该记录应当从缓存中删除的时间。
NameValue 的值取决于 Type

  • type = A。name是主机名,value是该主机名对应的IP。(标准的映射)
  • type = NS。name是个域(foo.com),value是知道如何获得该域中主机IP和权威DNS服务器的主机名。该记录用于沿着查询链来路由DNS查询。
  • type = CNAME。value是别名为 Name 的主机对应的规范主机名
  • type = MX。value是别名为 Name 的邮件服务器对应的规范主机名

DNS报文

略(暂时)

在DNS数据库中插入记录

略(暂时)

最后,DNS安全吗? 答案是:安全,十分健壮。(跟DNS的缓存机制关系密切)