《TCP/IP协议详解 卷1》--- DNS:域名系统

域名系统(DNS)是一种用于TCP/IP应用程序的分布式数据库,它提供主机名字和 I P地
址之间的转换及有关电子邮件的选路信息。这里提到的分布式是指在Internet上的单个站点不能拥有所有的信息。每个站点(如大学中的系、校园、公司或公司中的部门)保留它自己的信息数据库,并运行一个服务器程序供Internet上的其他系统(客户程序)查询。 DNS提供了允许服务器和客户程序相互通信的协议。

从应用的角度上看,对DNS的访问是通过一个地址解析器(resolver)来完成的。在Unix主机中,该解析器主要是通过两个库函数gethostbyname(3) 和gethostbyaddr(3)来访问的。前者接收主机名字返回IP地址,而后者接收IP地址来寻找主机名字。解析器通过一个或多个名字服务器来完成这种相互转换。解析器通常是应用程序的一部分。解析器并不像TCP/IP协议那样是操作系统的内核。

在一个应用程序请求TCP打开一个连接或使用UDP发送一个数据报之前。心须将一个主机名转换为一个IP地址。操作系统内核中的TCP/IP协议族对于DNS一点都不知道。

DNS基础
这里写图片描述
顶级域名被分为三个部分:
1) arpa是一个用作地址到名字转换的特殊域(我们将在 1 4 . 5节介绍)。
2) 7个3字符长的普通域。有些书也将这些域称为组织域。
3) 所有2字符长的域均是基于ISO3166中定义的国家代码,这些域被称为国家域,或地理域。
这里写图片描述
一个独立管理的 DNS子树称为一个区域 ( zone )。一个常见的区域是一个二级域,如noao.edu。许多二级域将它们的区域划分成更小的区域。例如,大学可能根据不同的系来划分区域,公司可能根据不同的部门来划分区域。

一旦一个区域的授权机构被委派后,由它负责向该区域提供多个名字服务器。当一个新系统加入到一个区域中时,该区域的 DNS管理者为该新系统申请一个域名和一个IP地址,并将它们加到名字服务器的数据库中。

一个名字服务器负责一个或多个区域。一个区域的管理者必须为该区域提供一个主名字服务器和至少一个辅助名字服务器。主、辅名字服务器必须是独立和冗余的,以便当某个名字服务器发生故障时不会影响该区域的名字服务。

主、辅名字服务器的主要区别在于主名字服务器从磁盘文件中调入该区域的所有信息,而辅名字服务器则从主服务器调入所有信息。我们将辅名字服务器从主服务器调入信息称为区域传送。

当一个名字服务器没有请求的信息时,它将如何处理?它必须与其他的名字服务器联系。(这正是DNS的分布特性)。然而,并不是每个名字服务器都知道如何同其他名字服务器联系。相反,每个名字服务器必须知道如何同根的名字服务器联系。根服务器则知道所有二级域中的每个授权名字服务器的名字和位置(即IP地址)。这意味着这样一个反复的过程:正
在处理请求的名字服务器与根服务器联系,根服务器告诉它与另一个名字服务器联系。

DNS的一个基本特性是使用超高速缓存。

DNS的报文格式
这里写图片描述

标识字段由客户程序设置并由服务器返回结果。客户程序通过它来确定响应与查询是否匹配。

扫描二维码关注公众号,回复: 2412346 查看本文章

DNS查询报文中的问题部分:
这里写图片描述
图14-6显示了如何存储域名gemini.tuc.noao.edu。
这里写图片描述
这里写图片描述
最常用的查询类型是A类型,表示期望获得查询名的IP地址。
查询类通常是1,指互联网地址(某些站点也支持其他非IP地址)。

DNS响应报文中的资源记录部分:
DNS报文中最后的三个字段,回答字段、授权字段和附加信息字段,均采用一种称为资源记录RR(Resource Record)的相同格式。
这里写图片描述
域名是记录中资源数据对应的名字。
类型说明RR的类型码。它的值和前面介绍的查询类型值是一样的。类通常为1,指Internet 数据。
生存时间字段是客户程序保留该资源记录的秒数。资源记录通常的生存时间值为2天。
资源数据长度说明资源数据的数量。该数据的格式依赖于类型字段的值。对于类型1(A记录)资源数据是4字节的I P地址。

一个简单的例子
这里写图片描述
这里写图片描述
第1行中冒号后的字段(30362+)表示标识字段为30362,加号“+”表示RD标志(期望递归)为1。默认情况下,名字解析器要求递归查询方式。

下一个字段为A ?,表示查询类型为A(我们需要一个IP地址),该问号指明它是一个查询(不是一个响应)。待查名字显示在后面:www.baidu.com.。名字解析器在待查名字后加上句点号指明它是一个绝对字段名。

在UDP数据报中的用户数据长度显示为31字节:12字节为固定长度的报文首部;15字节为查询名字,以及用于查询类型和查询类的4个字节。在DNS报文中无需填充数据。

第3行显示的是从名字服务器发回的响应。 30362是标识字段(后面可能有一个星号,星号表示设置AA标志–授权回答,即该服务器的回答在该域内是可相信的,这里没有星号,可能因为这个回答来自名字服务器的高速缓存,而不是来自授权名字服务器。),输出结果3/0/0表示在响应报文中最后 3个变长字段的资源记录数:回答RR数为3,授权RR和附加信息RR数均为0。tcpdump仅显示前2个回答,回答类型为 A(I P地址),值为220.181.111.188,220.181.112.244。因为目的主机时多接口主机,因此得到两个IP地址。

在查询结果中的UDP数据长度:90字节。
1) 在返回的结果中包含查询问题。
2) 在返回的结果中会有许多重复的域名,因此使用压缩方式。

指针查询
指针查询方式,即给定一个IP地址,返回与该地址对应的域名。
DNS名字是由DNS树的底部逐步向上书写的。这意味着对于IP地址为140.252.13.33的sun主机,它的DNS名字33.13.252.140.in-addr.arpa。
这里写图片描述
这里写图片描述
第1行显示标识符为1,期望递归标志设置为 1(加号“+”),查询类型为PTR(应注意:问号“?”表示它是一个查询而不是响应)。44字节的数据包括12字节的DNS报文首部、28字节的域名标识符和4字节的查询类型和查询类。
查询结果包含一个回答RR,且为授权回答比特置1(带星号)。RR的类型是PTR,资源数据中包含该域名。
从名字解析器传递给名字服务器的指针查询不再是32 bit的 I P地址,而是域名34.13.252.140.in-addr.arpa。

资源记录
现有大约20种不同类型的资源记录(RR),如IP地址查询为A类型,指针查询为类型PTR。

高速缓存
为了减少Internet上DNS的通信量,所有的名字服务器均使用高速缓存。在标准的Unix实现中,高速缓存是由名字服务器而不是由名字解析器维护的。
在默认情况下,名字解析器将在本地主机上( UDP端口号为53或TCP端口号为5 3)寻找名字服务器。

用UDP还是用TCP
DNS名字服务器使用的熟知端口号无论对UDP还是TCP都是53。这意味着DNS均支持UDP和TCP访问,但用tcpdump观察的所有例子都是采用UDP。

当名字解析器发出一个查询请求,并且返回响应中的TC(删减标志)比特被设置为1时,意味着响应的长度超过了512个字节,而仅返回前512个字节。这时,名字解析器通常使用TCP重发原来的查询请求,TCP能将用户的数据流分为一些报文段,能用多个报文段来传送任意长度的用户数据。

此外,当一个域的辅助名字服务器在启动时,将从该域的主名字服务器执行区域传送。辅助服务器将定时(通常是 3小时)向主服务器进行查询以便了解主服务器数据是否发生变动。如果有变动,执行一次区域传送。区域传送将使用TCP,因为传送的数据远比一个查询或响应多得多。

DNS主要使用UDP,无论是名字解析器还是名字服务器都必须自己处理超时和重传。此外,不像其他的使用UDP的Internet应用(TFTP、BOOTP和SNMP),大部分操作集中在局域网上,DNS查询和响应通常经过广域网。分组丢失率和往返时间的不确定性在广域网上比局域网上更大。这样对于DNS客户程序,一个好的重传和超时程序就显得更重要了。

综合性例子
先启动Rlogin客户程序,然后连接到一个位于其他域的 Rlogin服务器。图14-16显示了发生的分组交换过程。
这里写图片描述
下面发生的11个步骤都假定客户和服务器的高速缓存中没有任何信息。
1) 客户程序启动后,调用它的名字解析器函数将我们键入的主机名转换为一个IP地址。一个A类型的查询请求被送往一个根服务器。
2) 由根服务器返回的响应中包含为该服务器所在域服务的名字服务器名。
3) 客户端的名字解析器将向该服务器的名字服务器重发上述A类型查询,这个查询通常是将期望递归标志设置为1。
4) 返回的应答中包含Rlogin服务器的IP地址。
5) Rlogin客户和Rlogin服务器建立一个TCP连接。客户和服务器的TCP模块间将交换3个分组。
6) Rlogin服务器收到来自客户的连接请求后,调用它的名字解析器通过TCP连接请求中的IP地址获得客户主机名。这是一个 PTR查询请求,由一个根名字服务器处理。这个根名字服务器可以不同于步骤1中客户使用的根名字服务器。
7) 这个根名字服务器的响应中含有为客户的in-addr.arpa域的名字服务器。
8) 服务器上的名字解析器将向客户的名字服务器重传上述 PTR查询。
9) 返回的PTR应答中含有客户主机的FQDN。
10) 服务器的名字解析器向客户的名字服务器发送一个A类型查询请求,查找前一步返回的名字对应的IP地址。这可能由服务器中的gethostbyaddr函数自动完成,否则 Rlogin服务器将完成这一步。此外,客户的名字服务器常常就是客户的in-addr.arpa名字服务器,但这不是必需的。
11) 从客户的名字服务器返回的响应含有客户主机的A记录。Rlogin服务器将客户的TCP 连接请求中的IP地址与A记录作比较。
高速缓存将减少这个图中交换的分组数目。

小结
层次树是组成DNS域名空间的基本组织形式。
应用程序通过名字解析器将一个主机名转换为一个IP地址,也可将一个IP地址转换为与之对应的主机名。名字解析器将向一个本地名字服务器发出查询请求,这个名字服务器可能通过某个根名字服务器或其他名字服务器来完成这个查询。
所有的DNS查询和响应都有相同的报文格式。这个报文格式中包含查询请求和可能的回答资源记录、授权资源记录和附加资源记录。通过许多例子了解了名字解析器的配置文件以及DNS的优化措施:指向域名的指针(减少报文的长度)、查询结果的高速缓存、in-addr.arpa域(查找IP地址对应的域名)以及返回的附加资源记录(避免主机重发同一查询请求)。

猜你喜欢

转载自blog.csdn.net/u012319493/article/details/80955465