声明:本博客参考自《TCP/IP详解卷一:协议》
1. 概述
域名系统(DNS)是一种用于TCP/IP应用程序的分布式数据库。它提供主机名和IP地址之间的转换及有关电子邮件的选路信息。互联网上的单个站点(大学、公司等)不能用于所有信息,它们只保留它自己的信息数据库,并运行一个服务器程序供互联网上的其它客户系统访问。
从应用的角度来说,DNS包括两个部分:地址解析器和名字服务器。地址解析器在本地完成,名字服务器就是上面提到的分布式数据库。在linux主机中解析器通过两个函数来访问:gethostbyname()-通过主机名返回IP。gethostbyaddr()-通过IP返回主机名。解析器是应用程序的一部分,跟操作系统的内核无关。内核中的TCP/IP协议族是不知道解析器的。
2. DNS
2.1 基础
DNS的名字空间和linux的文件系统类似,也具有层次结构。每个结点有一个至多63个字符长度的标识。树根是没有任何标识的特殊结点。命名标识中一律不区分大小写。命名树上任何一个结点的域名就是将从该结点到最高层的域名串连起来,中间使用一个点“.”分隔这些域名。域名树中的每个结点必须有唯一的域名,但域名树中的不同结点可使用相同的标识。
以点"."结尾的域名称为绝对域名或完全合格域名FQDN(Full Qualified Domain Name),例如sun.tuc.noao.edu.
顶级域名被分为三个部分:
①arpa是一个用作地址到名字转换的特殊域,涉及到IP到域名的转换。
②7个3字符长的普通域,也称为组织域。
③所有2字符的域称为国家域或者地理域。
一个独立管理的DNS子树称为一个区域(zone)。一个常见的区域是二级域,如nano.edu。许多二级域将它们的区域划分成更小的区域。一旦一个区域的授权机构被委派后,由它负责向该区域提供多个名字服务器。当一个新系统加入到一个区域中时,该区域的 D N S管理者为该新系统申请一个域名和一个 I P地址,并将它们加到名字服务器的数据库中。
一个名字服务器负责一个或多个区域。一个区域的管理者必须为该区域提供一个主名字服务器和至少一个辅助名字服务器。主、辅名字服务器必须是独立和冗余的,以便当某个名字服务器发生故障时不会影响该区域的名字服务。主、辅名字服务器的主要区别在于主名字服务器从磁盘文件中调入该区域的所有信息,而辅名字服务器则从主服务器调入所有信息。我们将辅名字服务器从主服务器调入信息称为区域传送。
当一个新主机加入一个区域时,区域管理者将适当的信息(最少包括名字和 I P地址)加入到运行在主名字服务器上的一个磁盘文件中,然后通知主名字服务器重新调入它的配置文件。辅名字服务器定时(通常是每隔 3小时)向主名字服务器询问是否有新数据。如果有新数据,则通过区域传送方式获得新数据。
当一个名字服务器没有请求信息时,它会请求根服务器(每个主名字服务器都存有根服务器的IP地址),以完成它需要提供的服务。
DNS中有一个超高速缓存,当一个名字服务器收到有关主机名到IP地址的映射之后,它会将信息放入高速缓存中,这样以后遇到相同的请求就可以之间访问。
2.2 DNS报文格式
这个报文(查询和响应)由12字节长的首部和4个长度可变的字段组成。
标识字段用客户设置并由服务器返回。客户通过它可以来确认响应和查询是否匹配。
16bit的标志字段的划分如下:
①QR:0-查询报文。1-响应报文
②opcode:0-标准查询,1-反向查询,2-服务器状态请求
③AA:表示“授权回答”。该名字服务器是授权于该域的。
③TC:表示“可截断的(truncated)”。使用UDP时,它表示应答的总长度超过512字节时,只返回前512字节。
④RD:表示"期望递归(recursion desired)"。该比特能在一个查询中设置,并在响应中返回。这个标志告诉名字服务器必须处理这个查询,也称这种查询为递归查询。如果该位置0,并且被请求的名字服务器没有一个授权回答,它就返回一个能解答该查询的
其他名字服务器列表,这称为迭代查询。
⑤RA:表示"可用递归"。如果名字服务器支持递归查询,则在响应中将该比特置1。
⑥rcode:4bit的返回码字段。0-没有差错。3-名字差错。
查询报文中,问题数通常为1,其它三项则为0。类似地,在应答报文,回答(资源记录)数至少为1,剩下的两项可以是0或非0。
2.2.1 DNS查询报文中的问题部分
问题部分的格式如下
①查询名是要查找的名字,它是一个或多个标识符的序列。每个标识符以首字节的计数值来说明随后标识符的字节长度,每个名字以最后字节为 0结束,长度为0的标识符是根标识符。计数字节的值必须是 0 ~ 6 3的数,因为标识符的最大长度仅为 6 3。不像我们已经看到的许多其他报文格式,该字段无需以整32 bit边界结束,即无需填充字节。下图是gemini.tuc.noao.edu的储存方式:
②查询类型。每个问题有一个查询类型,而每个响应也有一个类型。查询类型是类型的超集。
最常见的查询类型为A和PTR,分别对应与域名到IP地址和IP地址到域名的转换。
③查询类。这个值通常为1,指互联网的地址。
2.2.2 DNS响应报文中的资源记录数
DNS报文中最后的三个字段:回答字段、授权字段、附加信息字段,均采用一种称为资源记录RR(Resource Record)的相同格式。具体的格式如下图所示:
①域名是记录中资源数据对应的名字。它的格式和前面介绍的查询名字段格式相同。
②类型字段。说明RR的类型码。与查询类型值是一样的。
③类。通常为1,指Internet数据。
④生存时间。指客户端保留该记录的秒数。通常为2天。
⑤资源数据长度。说明资源数据的数量。对于A记录(IP地址),资源数据长度为4,资源数据为4字节的IP地址。
指针查询-给定一个IP地址,返回该地址对于的域名。
2.3 资源记录说明
①A:一个A记录定义一个IP地址,它存储32bit的二进制数。
②PTR:指针记录用于指针查询。通过IP地址获得域名。
③CNAME:表示“规范域名”。它用来表示一个域名,而有规范名字的域名通常称为别名(alias)。某些FTP服务器使用它向其它的系统提供一个易于记忆的别名。
④INFO:表示主机信息,保存主机CPU和操作系统的两个字符串。
⑤MX:邮件交换记录。
⑥NS:名字服务器记录。它说明一个域的授权名字服务器。
2.4 其它要点
注意DNS可以使用UDP也可以使用TCP,当名字解析器发出一个查询请求,并且返回响应的TC(截断标志)比特被设置为1时,它就意味着响应的长度超过512个字节,而仅返回512个字节。在遇到这种情况时,名字解析器通常使用TCP重发原理的查询请求,它将运行返回的响应超过512字节。此外,辅助名字服务器从主服务器进行区域传输时也会使用TCP。
通过一张图说明DNS的运行过程:
上图是远程登陆协议的DNS运行过程:
(1)首先客户端向名字服务器发出A类型的DNS请求(注意这里没有画出区域的名字服务器)。这个请求一般会被发送到根服务器上。
(2)根服务器返回一个NS回答,可以解析客户端要求域名的名字服务器记录。
(3)客户端向指定名字服务器发送A类型请求,获取Rlogin服务器域名。
(4)名字服务器返回一个A类型的应答。
(5)Rlogin客户端向Rlogin服务器发出TCP连接。
(6)Rlogin服务器需要对Rlogin客户端进行检查。它向自己所在网络的根名字服务器发出一个PTR类型请求,以获取域名。TCP连接已经获得Rlogin客户端IP地址。
(7)根名字服务器返回NS回答,返回可以解析客户端要求域名的名字服务器。
(8) Rlogin服务器向指定名字服务器发出PTR类型的请求。
(9)名字服务器返回指定的域名给Rlogin服务器。
(10)Rlogin服务器通过返回的域名,再次发出A类型的查询获取IP地址。
(11)名字服务器返回A类型的应答。Rlogin服务器对比域名和IP,通过检查,允许客户端的连接。
3. 小结
DNS是任何与互联网相连主机必不可少的一部分,同时它也广泛用于专用的互联网。层次树是组成DNS域名空间的基本组织形式。应用程序通过名字解析器将一个主机名转换为一个 IP地址,也可将一个IP地址转换为与之对应的主机名。名字解析器将向一个本地名字服务器发出查询请求,这个名字服务器可能通过某个根名字服务器或其他名字服务器来完成这个查询。所有的DNS查询和响应都有相同的报文格式。这个报文格式中包含查询请求和可能的回答资源记录、授权资源记录和附加资源录。