TCP/IP-14-DNS

来源:互联网 发布:放置江湖武器数据 编辑:程序博客网 时间:2024/06/06 08:41

 第14章DNS:域名系统

14.1 引言
域名系统( DNS)是一种用于TCP/IP应用程序的分布式数据库,
它提供主机名字和IP地址之间的转换及有关电子邮件的选路信息。
这里提到的分布式是指在I n t e r n e t上的单个站点不能拥有所有的信息。
每个站点保留它自己的信息数据库,并运行一个服务器程序供I n t e r n e t上的其他系统(客户程序)查询。
DNS提供了允许服务器和客户程序相互通信的协议。
对DNS的访问是通过一个地址解析器来完成的。
在U n i x主机中,该解析器主要是通过两个库函数g e t h o s t b y n a m e(3)和g e t h o s t b y a d d r( 3)来访问
的,它们在编译应用程序时与应用程序连接在一起。
前者接收主机名字返回IP地址,而后者接收IP地址来寻找主机名字。
解析器通过一个或多个名字服务器来完成这种相互转换。
图4 - 2中指出了解析器通常是应用程序的一部分。
解析器并不像TCP/IP协议那样是操作系统的内核。
该图指出的另一个基本概念就是:在一个应用程序请求TCP打开一个连接或使用UDP发送一个数据报之前。
心须将一个主机名转换为一个IP地址。操作系统内核中的TCP/IP协议族对于DNS一点都不知道。
14.2 DNS 基础
DNS的名字空间和U n i x的文件系统相似,也具有层次结构。
图14-1 显示了这种层次的组织形式。
每个结点有一个至多6 3个字符长的标识。这颗树的树根是没有任何标识的特殊结点。
命名标识中一律不区分大写和小写。命名树上任何一个结点的域名就是将从该结点到最高层的域名串连起来,
中间使用一个点“.”分隔这些域名。
域名树中的每个结点必须有一个唯一的域名,但域名树中的不同结点可使用相同的标识。
顶级域名被分为三个部分:
1) a r p a是一个用作地址到名字转换的特殊域。
2) 7个3字符长的普通域。有些书也将这些域称为组织域。
3) 所有2字符长的域均是基于I S O 3 1 6 6中定义的国家代码,这些域被称为国家域,或地理域。
图1 4 - 2列出了7个普通域的正式划分。
|********************************|
|--域--|-------描述--------------|
|--------------------------------|
|-com--|--商业组织---------------|
|-edu--|--教育机构---------------|
|-gov--|--政府部门---------------|
|-int--|--国际组织---------------|
|-mil--|--军事网点---------------|
|-net--|--网络组织---------------|
|-org--|--其它组织---------------|
|********************************|

14.3 DNS的报文格式
DNS定义了一个用于查询和响应的报文格式。
标识字段由客户程序设置并由服务器返回结果,客户程序通过它来确定响应与查询是否匹配。

14.3.1 DNS查询报文中的问题部分
问题部分中每个问题的格式如图1 4 - 5所示,通常只有一个问题。
查询名是要查找的名字,它是一个或多个标识符的序列。
每个标识符以首字节的计数值来说明随后标识符的字节长度,每
个名字以最后字节为0结束,长度为0的标识符是根标识符。
计数字节的值必须是0 ~ 6 3的数,因为标识符的最大长度仅为6 3。
不像我们已经看到的许多其他报文格式,该字段无需以整32 bit边界结束,即无需填充字节。

14.4 一个简单的例子
让我们从一个简单的例子来了解一个名字解析器与一个名字服务器之间的通信过程。
在s u n主机上运行Te l n e t客户程序远程登录到g e m i n i主机上,并连接d a y t i m e服务器:

14.5 指针查询
DNS中一直难于理解的部分就是指针查询方式
,即给定一个IP地址,返回与该地址对应的域名。

14.5.2 主机名检查
当一个IP数据报到达一个作为服务器的主机时,无论是UDP数据报还是TCP连接请求,
服务器进程所能获得的是客户的IP地址和端口号( UDP或TCP)。
某些服务器需要客户的IP地址来获得在DNS中的指针记录。
某些厂商将该项检查自动并入其名字解析器的例程中,特别是函数g e t h o s t b y a d d r。
这使得任何使用名字解析器的程序均可获得这种检查,而无需在应用中人为地进行这项检查。

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

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

14.8 用UDP还是用TCP
注意到DNS名字服务器使用的熟知端口号无论对UDP还是TCP都是5 3。
这意味着DNS均支持UDP和TCP访问,但我们使用TCP d u m p观察的所有例子都是采用UDP。
那么这两种协议都在什么情况下采用以及采用的理由都是什么呢?

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

14.10 小结
DNS是任何与I n t e r n e t相连主机必不可少的一部分,
同时它也广泛用于专用的互联网,层次树是组成DNS域名空间的基本组织形式。
应用程序通过名字解析器将一个主机名转换为一个IP地址,也可将一个IP地址转换为与之对应的主机名。
名字解析器将向一个本地名字服务器发出查询请求,
这个名字服务器可能通过某个根名字服务器或其他名字服务器来完成这个查询。
所有的DNS查询和响应都有相同的报文格式。
这个报文格式中包含查询请求和可能的回答资源记录、授权资源记录和附加资源记录。
通过许多例子了解了名字解析器的配置文件以及DNS的优化措施:指向域名的指针、
查询结果的高速缓存、i n - a d d r . a r p a域以及返回的附加资源记录(避免主机重发同一查询请求)。

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