您的位置:首页 > 其它

第14章 DNS:域名系统

2018-11-11 22:09 3331 查看

14.1 引言

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

从应用的角度上看,对DNS的访问是通过一个地址解析器(resolver)来完成的。在Unix主机中,该解析器主要是通过两个库函数gethostbyname(3)和gethostbyaddr(3)来访问的,它们在编译应用程序时与应用程序连接在一起。前者接收主机名字返回IP地址,而后者接收IP地址来寻找主机名字。解析器通过一个或多个名字服务器来完成这种相互转换。

图4-2中指出了解析器通常是应用程序的一部分。解析器并不像TCP/IP协议那样是操作系统的内核。该图指出的另一个基本概念就是:在一个应用程序请求TCP打开一个连接或使用UDP发送一个数据报之前。心须将一个主机名转换为一个IP地址。操作系统内核中的TCP/IP协议族对于DNS一点都不知道。

本章我们将了解地址解析器如何使用TCP/IP协议(主要是UDP)与名字服务器通信。我们不介绍运行名字服务器或有关可选参数的细节,这些技术细节的内容可以覆盖整整一本书。(见[Albitz and Liu 1992]标准Unix解析器和名字服务器介绍)。

RFC 1034 [Mockapetris 1987a] 说明了DNS的概念和功能,RFC 1035 [Mockapetris 1987b] 详细说明了DNS的规范和实现。DNS最常用的版本(包括解析器和名字服务器)是BIND—伯克利Internet域名服务器。该服务器称作named。[Danzig、Obraczka和Kumar 1992]分析了DNS在广域网中产生的通信量。

14.2 DNS基础

DNS的名字空间和Unix的文件系统相似,也具有层次结构。图14-1显示了这种层次的组织形式。

每个结点(图14-1中的圆圈)有一个至多63个字符长的标识。这颗树的树根是没有任何标识的特殊结点。命名标识中一律不区分大写和小写。命名树上任何一个结点的域名就是将从该结点到最高层的域名串连起来,中间使用一个点“.”分隔这些域名(注意这和Unix文件系统路径的形成不同,文件路径是由树根依次向下的形成的)。域名树中的每个结点必须有一个唯一的域名,但域名树中的不同结点可使用相同的标识。

以点“.”结尾的域名称为绝对域名或完全合格的域名FQDN(Full Qualified DomainName),例如sun.tuc.noao.edu.。如果一个域名不以点结尾,则认为该域名是不完全的。如何使域名完整依赖于使用的DNS软件。如果不完整的域名由两个或两个以上的标号组成,则认为它是完整的;或者在该域名的右边加入一个局部后缀。例如域名sun通过加上局部后缀.tuc.noao.edu.成为完整的。

第14章 DNS:域名系统143

图14-1 DNS的层次组织

顶级域名被分为三个部分:

  1. arpa是一个用作地址到名字转换的特殊域(我们将在14.5节介绍)。
  2. 7个3字符长的普通域。有些书也将这些域称为组织域。
  3. 所有2字符长的域均是基于ISO3166中定义的国家代码,这些域被称为国家域,或地理域。

图14-2列出了7个普通域的正式划分。

图14-2 3字符长的普通域

在DNS中,通常认为3字符长的普通域仅用于美国的组织机构,2字符长的国家域则用国际组织美国军事网点于每个国家,但情况并不总是这样。许多非美国的组织机构仍然使用普通域,而一些美国的其他组织组织机构也使用.us的国家域(RFC 1480 [Cooper and Postel 1993] 详细描述了.us域)。普通域中只有.gov.mil域局限于美国。

许多国家将它们的二级域组织成类似于普通域的结构:例如,.ac.uk是英国研究机构的二级域名,.co.uk则是英国商业机构的二级域名。

DNS的一个没在如图14-1中表示出来的重要特征是DNS中域名的授权。没有哪个机构来管理域名树中的每个标识,相反,只有一个机构,即网络信息中心NIC负责分配顶级域和委派其他指定地区域的授权机构。

144TCP/IP详解,卷1:协议

图14-3 DNS查询和响应的一般格式

这个报文由12字节长的首部和4个长度可变的字段组成。

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

16 bit的标志字段被划分为若干子字段,如图14-4所示。

图14-4 DNS报文首部中的标志字段

我们从最左位开始依次介绍各子字段:

  1. QR是1bit字段:0表示查询报文,1表示响应报文。
  2. opcode是一个4bit字段:通常值为0(标准查询),其他值为1(反向查询)和2(服务器状态请求)。
  3. AA是1bit标志,表示“授权回答(authoritative answer)”。该名字服务器是授权于该域的。
  4. TC是1bit字段,表示“可截断的(truncated)”。使用UDP时,它表示当应答的总长度超过512字节时,只返回前512个字节。
  5. RD是1bit字段表示“期望递归(recursion desired)”。该比特能在一个查询中设置,并在响应中返回。这个标志告诉名字服务器必须处理这个查询,也称为一个递归查询。如果该位为0,且被请求的名字服务器没有一个授权回答,它就返回一个能解答该查询的其他名字服务器列表,这称为迭代查询。在后面的例子中,我们将看到这两种类型查询的例子。
  6. RA是1bit字段,表示“可用递归”。如果名字服务器支持递归查询,则在响应中将该比特设置为1。在后面的例子中可看到大多数名字服务器都提供递归查询,除了某些根服务器。
  7. 随后的3bit字段必须为0。
  8. rcode是一个4bit的返回码字段。通常的值为0(没有差错)和3(名字差错)。名字差错只有从一个授权名字服务器上返回,它表示在查询中制定的域名不存在。

146TCP/IP详解,卷1:协议

图14-5 DNS查询报文中问题部分的格式

查询名是要查找的名字,它是一个或多个标识符的序列。每个标识符以首字节的计数值来说明随后标识符的字节长度,每个名字以最后字节为0结束,长度为0的标识符是根标识符。计数字节的值必须是0~63的数,因为标识符的最大长度仅为63(在本节的后面我们将看到计数字节的最高两比特为1,即值192~255,将用于压缩格式)。不像我们已经看到的许多其他报文格式,该字段无需以整32 bit边界结束,即无需填充字节。

图14-6显示了如何存储域名gemini.tuc.noao.edu

图14-6 域名gemini.tuc.noao.edu的表示

每个问题有一个查询类型,而每个响应(也称一个资源记录,我们下面将谈到)也有一个类型。大约有20个不同的类型值,其中的一些目前已经过时。图14-7显示了其中的一些值。查询类型是类型的一个超集(superset):图中显示的类型值中只有两个能用于查询类型。

图14-7 DNS问题和响应的类型值和查询类型值

第14章 DNS:域名系统147

图14-12 一个指针查询的tcpdump输出

第1行显示标识符为1,期望递归标志设置为1(加号“+”),查询类型为PTR(应注意:问号“?”表示它是一个查询而不是响应)。44字节的数据包括12字节的DNS报文首部、28字节的域名标识符和4字节的查询类型和查询类。

查询结果包含一个回答RR,且为授权回答比特置1(带星号)。RR的类型是PTR,资源数据中包含该域名。

从名字解析器传递给名字服务器的指针查询不再是32 bit的IP地址,而是域名34.13.252.140.in-addr.arpa

14.5.2 主机名检查

当一个IP数据报到达一个作为服务器的主机时,无论是UDP数据报还是TCP连接请求,服务器进程所能获得的是客户的IP地址和端口号(UDP或TCP)。某些服务器需要客户的IP地址来获得在DNS中的指针记录。在27.3节会看到这样的例子,从未知的IP地址使用匿名FTP访问服务器。

其他的一些服务器如Rlogin服务器(第26章)不但需要客户的IP地址来获得指针记录,还要向DNS询问该IP地址所对应的域名,并检查返回的地址中是否有地址与收到的数据报中的源IP地址匹配。该检查是因为.rhosts文件(见26.2节)中的条目仅包含主机名,而没有IP地址,因此主机需要证实该主机名是否对应源IP地址。

某些厂商将该项检查自动并入其名字解析器的例程中,特别是函数gethostbyaddr。这使得任何使用名字解析器的程序均可获得这种检查,而无需在应用中人为地进行这项检查。

来看一个使用SunOS 4.13名字解析器库的例子。我们编制了一个简单的程序通过调用函数gethostbyaddr来完成一个指针查询。我们已在文件/etc/resolv.conf中将名字服务器设置为noao.edusun主机通过SLIP链路与它相连。图14-13显示了当调用函数gethostbyaddr获取与IP地址140.252.1.29(sun主机)对应的名字时,tcpdump在SLIP链路上收到的内容。

第1行是预期的指针查询,第2行是预期的响应。但第3行显示了该名字解析器函数自动对第2行返回的名字发出一个IP地址查询。既然sun主机有两个IP地址,第4行的响应就包括两个回答记录。如果这两个地址中没有与gethostbyaddr输入参数匹配的地址,函数会向系统的日志发送一条报文,并向应用程序返回差错。

152TCP/IP详解,卷1:协议

图14-13 调用名字解析器函数执行指针查询

14.6 资源记录

至今我们已经见到了一些不同类型的资源记录(RR):IP地址查询为A类型,指针查询为类型PTR。也已看到了由名字服务器返回的资源记录:回答RR、授权RR和附加信息RR。现有大约20种不同类型的资源记录,下面将介绍其中的一些。另外,随着时间的推移,会加入更多类型的RR。

第14章 DNS:域名系统153

这些是RR的常用类型。将在后面的例子中遇到它们。

14.7 高速缓存

为了减少Internet上DNS的通信量,所有的名字服务器均使用高速缓存。在标准的Unix实现中,高速缓存是由名字服务器而不是由名字解析器维护的。既然名字解析器作为每个应用的一部分,而应用又不可能总处于工作状态,因此将高速缓存放在只要系统(名字服务器)处于工作状态就能起作用的程序中显得很重要。这样任何一个使用名字服务器的应用均可获得高速缓存。在该站点使用这个名字服务器的任何其他主机也能共享服务器的高速缓存。

在迄今为止(图14-9)所举例子的网络环境中,在sun主机上运行客户程序,通过主机noao.edu的SLIP链路访问名字服务器。现在将改变这种设置,在sun主机上运行名字服务器。在这种情况下,如果使用tcpdump监视在SLIP链路上的DNS通信量,将只能看到服务器因超出其高速缓存而不能处理的查询。

在默认情况下,名字解析器将在本地主机上(UDP端口号为53或TCP端口号为53)寻找名字服务器。从名字解析器文件中删除nameserver行,而留下domain行:

sun % cat /etc/resolv.conf

domain tuc.noao.edu

在这个文件中缺少namerserver指示将导致名字解析器使用本地主机上的名字服务器。

154TCP/IP详解,卷1:协议

图14-14 执行hostftp.uu.net后的tcpdump输出

这次在tcpdump中使用了新的选项。使用-w选项来收集进出UDP或TCP 53号端口的所有数据。将这些原始数据记录在一个文件中供以后处理,同时防止tcpdump试图调用名字解析器来显示与那个IP地址相对应的域名。执行查询后,终止tcpdump并使用-r选项再次运行它。它会读取含有原始数据的文件并产生正式的输出显示(如图1414)。这个过程要花费几秒钟,因为tcpdump调用了它自己的名字解析器。

tcpdump输出中要注意的第一点是标识符(identifier)是小整数(2和3)。这是因为我们关闭这个名字服务器,后又重新启动它来强制清空它的高速缓存。当名字服务器启动时,它将标识符初始化为1。

当键入查询,查找主机ftp.uu.net的IP地址,该名字服务器就同8个根名字服务器中的一个ns.nic.ddn.mil(第1行)取得联系。这是以前见到的正常的A类型查询,但要注意的是它的期望递归表示没有说明(如果该标志被设置,在标识符2的后边会跟着一个加号)。在以前的例子中,经常看到名字解析器设置期望递归标志,但这里的名字服务器在与某个根服务器联系时没有设置这个标志。这是因为不应该向根名字服务器发出期望递归的查询,它们仅用来寻找其他授权名字服务器的地址。

第2行显示返回的响应中没有回答资源记录,而包含5个授权资源记录和5个附加信息资源记录。标识符2后的减号表示期望递归标志(RA)没有被设置。即使我们要求进行递归查询,这个根名字服务器也不会回答期望递归查询。

尽管tcpdump没有显示返回的10个资源记录,我们也能执行host命令来查看高速缓存的内容:

第14章 DNS:域名系统155

图14-15 对ftp.ee.lbl.gov主机的tcpdump输出

这时第1行显示我们的服务器与另一个根名字服务器(c.nyser.net)联系。一个名字服务器通常轮询不同的根名字服务器来获得往返时间估计,然后选择往返时间最小的服务器。

既然我们的服务器向一个根服务器发出查询,那么期望递归标志不应被设置。正如我们在图14-14中所看到的该名字服务器并不清除期望递归标志(即便这样,一个名字服务器还是不应该向一个根名字服务器发出期望递归的查询)。

在第2行返回的响应中不包含回答资源记录,但含有4个授权记录和4个附加信息资源记录。正如我们所猜测的那样,4个授权资源记录是供主机ftp.ee.lbl.gov进行域名服务的名字服务器名,其他4个记录则是这4个服务器的IP地址。

第3行是向名字服务器nsl.lbl.gov(第2行中返回的4个名字服务器中的第一个)发出的查询请求。它的期望递归标志是被设置的。

第4行返回的响应和以往的响应不同。返回了两个回答资源记录,tcpdump指出其中的第一个是CNAME资源记录。ftp.ee.lbl.gov的规范名称是ee.lbl.gov

156TCP/IP详解,卷1:协议

图14-16 启动Rlogin客户和服务器的分组交换过程
  • Rlogin服务器收到来自客户的连接请求后,调用它的名字解析器通过TCP连接请求中的IP地址获得客户主机名。这是一个PTR查询请求,由一个根名字服务器处理。这个根名字服务器可以不同于步骤1中客户使用的根名字服务器。
  • 这个根名字服务器的响应中含有为客户的in-addr.arpa域的名字服务器。
  • 服务器上的名字解析器将向客户的名字服务器重传上述PTR查询。
  • 返回的PTR应答中含有客户主机的FQDN。
  • 服务器的名字解析器向客户的名字服务器发送一个A类型查询请求,查找前一步返回的名字对应的IP地址。这可能由服务器中的gethostbyaddr函数自动完成,正如我们在14.5节中介绍的那样,否则Rlogin服务器将完成这一步。此外,客户的名字服务器常常就是客户的in-addr.arpa名字服务器,但这不是必需的。
  • 从客户的名字服务器返回的响应含有客户主机的A记录。Rlogin服务器将客户的TCP连接请求中的IP地址与A记录作比较。
  • 第14章 DNS:域名系统157

    高速缓存将减少这个图中交换的分组数目。

    14.10 小结

    DNS是任何与Internet相连主机必不可少的一部分,同时它也广泛用于专用的互联网。层次树是组成DNS域名空间的基本组织形式。

    应用程序通过名字解析器将一个主机名转换为一个IP地址,也可将一个IP地址转换为与之对应的主机名。名字解析器将向一个本地名字服务器发出查询请求,这个名字服务器可能通过某个根名字服务器或其他名字服务器来完成这个查询。

    所有的DNS查询和响应都有相同的报文格式。这个报文格式中包含查询请求和可能的回答资源记录、授权资源记录和附加资源记录。通过许多例子了解了名字解析器的配置文件以及DNS的优化措施:指向域名的指针(减少报文的长度)、查询结果的高速缓存、in-addr.arpa域(查找IP地址对应的域名)以及返回的附加资源记录(避免主机重发同一查询请求)。

    158TCP/IP详解,卷1:协议

    习题

    1. 14.1讨论一个DNS名字解析器和一个DNS名字服务器作为客户程序、服务器或同时作为客户和服务器的情况。 说明图14-12中构成响应的75个字节的含义。
    2. 在12.3节我们指出,一个既可接受点分十进制形式的IP地址、也可接收主机名的应用程序,应先假定输入的是IP地址,如果失败,再假定是主机名。如果改变这个测试顺序会出现什么情况?
    3. 每个UDP数据报有一个相应的长度。一个接收UDP数据报的进程将被告知这个长度。当名字解析器使用TCP而不是UDP来处理查询请求时,由于TCP是没有任何记录标记的字节流,那么应用程序是如何知道有多少数据返回?注意在DNS的报文首部(图14-3)中没有任何长度字段(提示:查阅 RFC 1035)
    4. 我们说一个名字服务器必须知道根名字服务器的IP地址,这一信息可通过匿名FTP获得。不幸的是当根名字服务器表发生变化时,并不是所有的系统管理员都会更新他们的DNS配置文件(根名字服务表的确会发生变化,尽管不是经常的)你认为DNS如何处理这个问题?
    5. 利用习题1.8指明的文件来确定谁应负责维护根名字服务器。名字服务器更新的频度是怎样的?
    6. 维护一个名字服务器和一个无状态的名字解析器高速缓存的问题分别是什么?
    7. 在图14-10的讨论中,我们指出名字服务器将对A类型记录进行排序以便在公共网中的地址先出现。谁对A类型记录进行这种排序,是名字服务器还是名字解析器?
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: