TCP/IP协议详解卷一:Chapter14 笔记
Chapter 14 DNS:域名系统
DNS = Domain Name System = 域名系统
域名系统(DNS)是一种用于TCP/IP应用程序的分布式数据库,它提供主机名字和IP地址之间的转换及有关电子邮件的选路信息。这里提到的分布式是指在Internet上的单个站点不能拥有所有的信息。每个站点保留它自己的信息数据库,并运行一个服务器程序供Internet上的其他系统(客户程序)查询。DNS提供了允许服务器和客户程序相互通信的协议。
从应用的角度上看,对DNS的访问是通过一个地址解析器(resolver)来完成的。在Unix主机中,该解析器主要是通过两个库函数gethostbyname(3) 和gethostbyaddr(3)来访问的,它们在编译应用程序时与应用程序连接在一起。前者接收主机名字返回IP地址,而后者接收IP地址来寻找主机名字。解析器通过一个或多个名字服务器来完成这种相互转换。解析器通常是应用程序的一部分,而并不像TCP/IP协议那样是操作系统的内核。
14.2 DNS基础
DNS的名字空间和Unix的文件系统相似,也具有层次结构。每个结点有一个至多63个字符长的标识。这颗树的树根是没有任何标识的特殊结点。命名标识中一律不区分大小写。命名树上任何一个结点的域名就是将从该结点到最高层的域名串连起来,中间使用一个点“.”分隔这些域名(注意Unix系统文件路径是由树根依次向下的形成的)。域名树中的每个结点必须有一个唯一的域名,但域名树中的不同结点可使用相同的标识。
以点“ .”结尾的域名称为绝对域名或完全合格的域名 FQDN(Full Qualified Domain Name),例如sun.tuc.noao.edu.。如果一个域名不以点结尾,则认为该域名是不完全的。如何使域名完整依赖于使用的DNS软件。如果不完整的域名由两个或两个以上的标号组成,则认为它是完整的;或者在该域名的右边加入一个局部后缀。例如域名sun通过加上局部后缀.tuc.noao.edu.成为完整的。
顶级域名被分为三个部分:
- arpa是一个用作地址到名字转换的特殊域;
- 7个3字符长的普通域。有些书也将这些域称为组织域,它们分别为商业机构com、教育机构edu、政府部门gov、国际组织int、美国军事网点mil、网络net、其他组织org;
- 所有2字符长的域均是基于ISO3166中定义的国家代码,这些域被称为国家域,或地理域。
许多国家将它们的二级域组织成类似于普通域的结构:例如,.ac.uk是英国研究机构的二级域名,.co.uk则是英国商业机构的二级域名。
没有哪个机构来管理域名树中的每个标识,相反,只有一个机构,即网络信息中心NIC负责分配顶级域和委派其他指定地区域的授权机构。一个独立管理的DNS子树称为一个区域( zone )。一个常见的区域是一个二级域,如noao.edu。许多二级域将它们的区域划分成更小的区域。
一旦一个区域的授权机构被委派后,由它负责向该区域提供多个名字服务器。当一个新系统加入到一个区域中时,该区域的DNS管理者为该新系统申请一个域名和一个IP地址,并将它们加到名字服务器的数据库中。
一个名字服务器负责一个或多个区域。一个区域的管理者必须为该区域提供一个主名字服务器和至少一个辅助名字服务器。主、辅名字服务器必须是独立和冗余的,以便当某个名字服务器发生故障时不会影响该区域的名字服务。主、辅名字服务器的主要区别在于主名字服务器从磁盘文件中调入该区域的所有信息,而辅名字服务器则从主服务器调入所有信息(称为区域传送)。辅名字服务器定时(通常是每隔3小时)向主名字服务器询问是否有新数据。
DNS的一个基本特性是使用超高速缓存。即当一个名字服务器收到有关映射的信息(主机名字到IP地址)时,它会将该信息存放在高速缓存中。这样若以后遇到相同的映射请求,就能直接使用缓存中的结果而无需通过其他服务器查询。
14.3 DNS的报文格式
DNS定义了一个用于查询和响应的报文格式。这个报文由12字节长的首部和4个长度可变的字段组成。
DNS报文 = 2字节标识 + 2字节标志 + 2字节问题数 + 2字节资源记录数 + 2字节授权资源记录数 + 2字节额外资源记录数 + 查询问题 + 回答(资源记录数可变)+ 授权(资源记录数可变)+ 额外信息(资源记录数可变)
标识字段由客户程序设置并由服务器返回结果。客户程序通过它来确定响应与查询是否匹配。
16 bit的标志字段被划分为若干子字段:1位QR + 4位opcode + 1位AA + 1位TC + 1位RD + 1位RA + 3位置零 + 4位rcode
其中:
- QR:0表示查询报文,1表示响应报文。
- opcode:通常值为0(标准查询),其他值为1(反向查询)和2(服务器状态请求)。
- AA表示“授权回答(authoritative answer)”。该名字服务器是授权于该域的。
- TC表示“可截断的( truncated )”。使用UDP时,它表示当应答的总长度超过512字节时,只返回前512个字节。
- RD表示“期望递归( recursion desired)”。该比特能在一个查询中设置,并在响应中返回。这个标志告诉名字服务器必须处理这个查询,也称为一个递归查询。如果该位为0,且被请求的名字服务器没有一个授权回答,它就返回一个能解答该查询的其他名字服务器列表,称为迭代查询。
- RA表示“可用递归”。如果名字服务器支持递归查询,则在响应中将该比特设置为1。
- 随后的3 bit字段必须为0。
- rcode是一个4 bit的返回码字段。通常的值为0(没有差错)和3(名字差错)。名字差错只有从一个授权名字服务器上返回,它表示在查询中制定的域名不存在。
随后的4个16 bit 字段(问题数和3个资源记录数)说明最后4个变长字段中包含的条目数。对于查询报文,问题数通常是1,而其他3项则均为0。类似地,对于应答报文,回答数至少是1,剩下的两项可以是0或非0。
14.3.1 DNS查询报文中的问题部分
查询问题中每个问题的格式为:查询名 + 查询类型 + 查询类。通常只有一个问题。
查询名是要查找的名字,它是一个或多个标识符的序列。每个标识符以首字节的计数值来说明随后标识符的字节长度,每个名字以最后字节为0结束,长度为0的标识符是根标识符。计数字节的值必须是0~63的数,因为标识符的最大长度仅为63。该字段无需以整32 bit边界结束,即无需填充字节。
下图显示了如何存储域名gemini.tuc.noao.edu。
每个问题有一个查询类型,而每个响应(也称一个资源记录,我们下面将谈到)也有一个类型。大约有20个不同的类型值,其中的一些目前已经过时。
最常用的查询类型是A类型,表示期望获得查询名的IP地址。一个PTR查询则请求获得一个IP地址对应的域名。
查询类通常是1,指互联网地址(某些站点也支持其他非IP地址)。
14.3.2 DNS响应报文中的资源记录部分
DNS报文中最后的三个字段,回答字段、授权字段和额外信息字段,均采用一种称为资源记录RR(Resource Record)的相同格式。
DNS资源记录 = 域名 + 类型 + 类 + 生存时间 + 资源数据长度 + 资源数据
域名是记录中资源数据对应的名字。它的格式和前面介绍的查询名字段格式相同。
类型说明RR的类型码。它的值和前面介绍的查询类型值是一样的。类通常为1,指Internet数据。
生存时间字段是客户程序保留该资源记录的秒数。资源记录通常的生存时间值为2天。
资源数据长度说明资源数据的数量。该数据的格式依赖于类型字段的值。对于类型1(A记录)资源数据是4字节的IP地址。
14.4 一个简单的例子
通过在SLIP链路上运行tcpdump程序来了解名字解析器与名字服务器之间的分组交换(图14-9)。
其中:
主机sun地址为140.252.1.29,1447为临时端口号;
noao.edu上的名字服务器地址为140.252.1.54,53为知名端口号;
查询得到的主机gemini的地址为140.252.1.11;
1+:1表示标识字段,+表示RD标志字段为1(期望递归);
A?:查询类型为A,?表示查询;
(37):查询报文长度为37字节(12字节报文首部+21字节查询名字+4字节查询类型和查询类);
1*:标识字段,*表示设置AA标志(授权回答);
2/0/0:表示3个资源记录数中,回答RR数为2,授权RR数和额外信息RR数均为0;
A:表示回答类型为A,即IP地址;
(69):查询结果中的UDP数据长度为69字节。
当一个域名中的标识符是压缩的,它的单计数字节(范围由0~63)中的最高两位将被设置为11。这表示它是一个16 bit指针而不再是8 bit的计数字节。指针中的剩下14 bit说明在该DNS报文中标识符所在的位置(起始位置由标识字段的第一字节起算)。
下图展示了该例子中tcpdump输出第二行DNS应答的格式。
对于多接口主机,可以查询到多个IP地址。返回的两个回答除了返回的IP地址不同外,其余都是一样的。在这个例子中,每个回答中的指针值为12,表示从DNS首部开始的偏移量。
14.5 指针查询
指针查询方式,即给定一个IP地址,返回与该地址对应的域名。
使用host程序完成一个指针查询,并使用tcpdump程序来观察这些分组。
sun % host 140.252.13.34
Name: svr4.tuc.noao.edu
Address: 140.252.13.34

主机名检查

14.6 资源记录
现有大约20种不同类型的资源记录,我们已经见到了一些不同类型的资源记录(RR):IP地址查询为A类型,指针查询为类型PTR。也已看到了由名字服务器返回的资源记录:回答RR、授权RR和附加信息RR。
常见的资源记录包括:
- A:一个A记录定义了一个IP地址;
- PTR:指针记录用于指针查询;
- CNAME:表示“规范名字(canonical name)”。它用来表示一个域名(标识符串),而有规范名字的域名通常被称为别名(alias);
- HINFO:表示主机信息,包括说明主机CPU和操作系统的两个字符串;
- MX:邮件交换记录;
- NS:名字服务器记录。
14.7 高速缓存
为了减少Internet上DNS的通信量,所有的名字服务器均使用高速缓存。在标准的Unix实现中,高速缓存是由名字服务器而不是由名字解析器维的。
在默认情况下,名字解析器将在本地主机上( UDP端口号为53或TCP端口号为53)寻找名字服务器。从名字解析器文件中删除nameserver行,而留下domain行:
sun % cat /etc/resolv.conf
domain tuc.noao.edu
在这个文件中缺少nameserver指示将导致名字解析器使用本地主机上的名字服务器。使用host命令执行下列查询:
sun % host ftp.uu.net
ftp.uu.net A 192.48.96.9
对应的tcpdump输出为:
在tcpdump输出中要注意的第一点是标识符((identifier)是小整数(2和3)。这是因为我们关闭这个名字服务器,后又重新启动它来强制清空它的高速缓存。当名字服务器启动时,它将标识符初始化为1。
当键入查询,查找主机ftp.uu.net的IP地址,该名字服务器就同8个根名字服务器中的一个ns.nic.ddn.mil(第1行)取得联系。需要注意的是它没有设置期望递归标志(如果该标志被设置,在标识符2的后边会跟着一个加号)。这是因为不应该向根名字服务器发出期望递归的查询,它们仅用来寻找其他授权名字服务器的地址。
第2行显示返回的响应中没有回答资源记录,而包含5个授权资源记录和5个附加信息资源记录(0/5/5)。标识符2后的减号表示期望递归标志(RA)没有被设置。即使我们要求进行递归查询,这个根名字服务器也不会回答期望递归查询。
尽管tcpdump没有显示返回的10个资源记录,我们也能执行host命令来查看高速缓存的内容:
这次采用 -v 选项查看的不仅仅只是A记录。它显示出对于域uu.net有5个授权名字服务器(Authoritative nameservers之后的5行),而由根名字服务器返回的5个附加信息资源记录(Additional information之后的5行)中含有这5个名字服务器的IP地址。这避免了在查找其中的某个名字服务器的地址时,无需再次与根名字服务器联系。
host命令指出这个回答不是授权的,这是因为这个回答来自名字服务器的高速缓存,而不是来自授权名字服务器。
14.8 用UDP还是TCP
注意到DNS名字服务器使用的熟知端口号无论对UDP还是TCP都是53。
当名字解析器发出一个查询请求,并且返回响应中的TC(删减标志)比特被设置为1时,它就意味着响应的长度超过了512个字节,而仅返回前512个字节。在遇到这种情况时,名字解析器通常使用TCP重发原来的查询请求,它将允许返回的响应超过512个字节。
此外,当一个域的辅助名字服务器在启动时,将从该域的主名字服务器执行区域传送。我们也说过辅助服务器将定时(通常是3小时)向主服务器进行查询以便了解主服务器数据是否发生变动。如果有变动,将执行一次区域传送。区域传送将使用TCP,因为这里传送的数据远比一个查询或响应多得多。
既然DNS 主要使用UDP,无论是名字解析器还是名字服务器都必须自己处理超时和重传。此外,不像其他的使用UDP的Internet应用(TFTP、BOOTP和SNMP),大部分操作集中在局域网上,DNS查询和响应通常经过广域网。分组丢失率和往返时间的不确定性在广域网上比局域网上更大。这样对于DNS客户程序,一个好的重传和超时程序就显得更重要了。
本文深入探讨TCP/IP协议中的DNS(域名系统)工作原理,包括其分布式数据库特性、域名解析流程、报文格式、资源记录类型及高速缓存机制。同时,文章详细解释了DNS查询与响应过程,以及在UDP和TCP协议上的应用。
399

被折叠的 条评论
为什么被折叠?



