《TCP/IP协议卷1》第14章 DNS:域名系统
什么 是 DNS?DNS 有什么用?DNS 如何实现的,过程是什么?
引言
- 定义与作用:DNS是用于TCP/IP应用程序的分布式数据库,提供主机名字和IP地址转换以及电子邮件选路信息。分布式指Internet上单个站点不拥有所有信息,各站点保留自身信息数据库,通过客户 - 服务器程序供其他系统查询。
- 应用访问方式:应用通过地址解析器访问DNS。在Unix主机中,解析器主要通过
gethostbyname(3)
和gethostbyaddr(3)
函数工作,在将主机名转换为IP地址(用于TCP连接或UDP数据报发送 )以及反向转换中起作用。解析器是应用程序一部分,与操作系统内核中的TCP/IP协议族不同。
DNS基础
- 名字空间结构:DNS名字空间类似Unix文件系统,呈层次结构。每个结点有最长63个字符的标识,树根是无标识的特殊结点,命名标识不区分大小写。域名由从结点到最高层的域名串连而成,以“.”分隔。以“.”结尾的域名是绝对域名(FQDN ) ,否则为不完全域名。
- 顶级域名分类
-
- arpa:用于地址到名字转换的特殊域。
- 7个3字符普通域:如
com
(商业组织 )、edu
(教育机构 )等,一般认为主要用于美国组织机构,但许多非美国组织也会使用。
- 2字符国家域:基于ISO3166定义的国家代码,用于各个国家。许多国家的二级域有类似普通域的结构划分,如
.ac.uk
(英国研究机构 )、.co.uk
(英国商业机构 ) 。 - 区域(zone)概念:独立管理的DNS子树,常见为二级域,如
noao.edu
。二级域常划分为更小区域,类似Unix文件系统从逻辑到物理磁盘分区的划分。一旦区域授权机构被委派,它负责向区域内新系统提供名字服务器,新系统加入时需申请域名和IP地址并添加到名字服务器数据库。 - 名字服务器:负责一个或多个区域,主名字服务器从磁盘文件调入区域所有信息,辅助名字服务器从主服务器调入信息(区域传送 ) 。新主机加入区域时,区域管理者更新主名字服务器配置文件,辅助名字服务器定时向主服务器询问新数据。名字服务器需与其他名字服务器联系,所有主名字服务器都要知道根服务器IP地址,根服务器知道二级域中授权名字服务器的IP地址,处理请求时,名字服务器与根服务器联系,根服务器指引其与相关名字服务器联系。
- 超高速缓存特性:名字服务器收到主机名到IP地址映射信息时,会存放在高速缓存中,后续相同映射请求可直接使用缓存结果,无需通过其他服务器查询。
14.3 DNS的报文格式
- 总体格式:DNS定义了用于查询和响应的报文格式,由12字节长的首部和4个长度可变的字段组成。12字节首部包含标识字段(客户程序设置,服务器返回结果用于匹配响应与查询 )和16 bit标志字段(划分为多个子字段 ) 。
- 标志字段子字段含义
-
- QR:1 bit字段,0表示查询报文,1表示响应报文。
- opcode:4 bit字段,通常值为0(标准查询 ),还有1(反向查询 )、2(服务器状态请求 )等其他值。
- AA:1 bit标志,“授权回答”,该名字服务器是授权于该域的。
- TC:1 bit字段,“可截断的”,使用UDP时,应答总长度超512字节只返回前512字节。
- RD:1 bit字段,“期望递归”,能在查询中设置,名字服务器支持递归查询则在响应中返回。若未授权回答,返回能解答查询的其他名字服务器列表(迭代查询 ) 。
- RA:1 bit字段,“可用递归”,名字服务器支持递归查询则在响应中设置为1 。
- 随后3 bit字段:必须为0。
- rcode:4 bit返回码字段,通常0(没有差错 )、3(名字差错,仅从授权名字服务器返回,表明查询域名不存在 ) 。
- 后续4个16 bit字段说明后面4个变长字段包含的条目数,查询报文问题数通常是1,其他3项为0;应答报文回答数至少是1 。
- DNS查询报文中的问题部分
-
- 格式:每个问题格式包含查询名、查询类型、查询类。查询名是要查找的名字,由一个或多个标识符序列组成,每个标识符以首字节计数值说明后续标识符字节长度,名字以最后字节为0结束,长度为0的标识符是根标识符,计数字节值为0 - 63 ,最高两比特为1(192 - 255 )用于压缩格式 。
- 查询类型:约20个不同类型值,常用的A类型表示期望获得查询名的IP地址,PTR查询请求获得一个IP地址对应的域名(指针查询 ) 。还有NS(名字服务器 )、CNAME(规范名称 )等类型 。
- 查询类:通常是1,指互联网地址,某些站点也支持其他非IP地址 。
14.3.2 DNS响应报文中的资源记录部分
- 资源记录格式:DNS响应报文中的回答字段、授权字段和附加信息字段,均采用资源记录(RR)格式。其包含以下字段:
-
- 域名:资源数据对应的名字,格式与查询名字段格式相同。
- 类型:说明RR的类型码,与查询类型值相同。
- 类:通常为1,代表Internet数据。
- 生存时间:客户程序保留该资源记录的秒数,通常值为2天。
- 资源数据长度:说明资源数据的数量。
- 资源数据:格式依赖于类型字段的值,如类型1(A记录)的资源数据是4字节的IP地址 。
14.4 一个简单的例子
- 示例场景:在sun主机上运行Telnet客户程序远程登录到gemini主机,并连接daytime服务器(命令为
sun % telnet gemini daytime
) 。此过程中,sun主机的名字解析器会与位于noao.edu(140.252.1.54 )的名字服务器交互,以获取gemini.tuc.noao.edu的IP地址。 - 相关配置文件:sun主机上的
/etc/resolv.conf
文件配置名字解析器行为。nameserver
行给出主名字服务器IP地址(140.252.1.54 ) ,domain
行设置默认域名(tuc.noao.edu ) ,若待查域名非完全合格域名,默认域名会加到待查名后。 - 报文交互过程
-
- 查询报文:名字解析器向名字服务器发送UDP数据报进行查询。第1行输出表明查询源IP为140.252.1.29,目的IP为140.252.1.54,源端口号1447,目的端口号53(知名端口 ) 。查询类型为A(期望获得IP地址 ) ,待查名字为gemini.tuc.noao.edu ,报文总长度37字节,包含12字节首部、用于查询类型和查询类的4字节等,无填充数据。
- 响应报文:名字服务器返回响应。第2行输出中,
I*
表示标识字段,星号表示设置AA标志(授权回答,该服务器是noao.edu域的主域名服务器,回答在该域内可信 ) 。2/0/0
表示响应报文中回答资源记录数为2,授权RR和附加信息RR数均为0 。回答类型为A,值为140.252.1.11 。
- 知识点总结
-
- 名字解析器与服务器交互:展示了名字解析器在建立网络连接前,通过与名字服务器通信获取目标主机IP地址的过程。
- DNS报文格式应用:体现了DNS查询和响应报文中各字段(如标识、标志、查询类型、资源记录等 )在实际交互中的使用和含义。
- 配置文件作用:说明了
/etc/resolv.conf
文件对名字解析器配置(如指定名字服务器、设置默认域名 )的重要性。
14.4 一个简单的例子(续)
- 多接口主机与多个回答:gemini是多接口主机,所以查询会得到两个IP地址。公开程序host可将查询传递给名字服务器并显示结果,使用
host gemini.tuc.noao.edu A
,能看到两个IP地址140.252.1.11和140.252.3.54 。当名字服务器和发出请求的主机位于相同网络(或子网 )时,BIND会优先显示相同网络的地址。 - 路由与IP地址替换:使用traceroute工具发现从子网140.252.1到140.252.3的正常路由不经过gemini主机,而是经过连接两个网络的另一个路由器。若将IP地址(140.252.3.54 )来访问gemini主机,部分网络需额外跳数。可通过SNMP查看路由器路由表来研究替换路由的可行性。
- nslookup工具:多数DNS实现包含的程序,用于查询DNS相关信息,[Albitz and Liu 1992]的第10章详细介绍了其使用方法。
- dig工具:“域名Internet搜索(Domain Internet Groper)”程序,是查询DNS服务器的公开工具,可向合适名字服务器发送查询诊断含义不清的域名,并对返回结果进行简单分析,附录F有获取该程序的详细介绍。
- DNS报文的压缩与UDP数据长度
-
- 查询结果的UDP数据长度为69字节,原因一是返回结果包含查询问题;二是域名gemini.tuc.noao.edu出现三次,为避免重复采用压缩方式。压缩时,当计数字节最高两位设为11 ,表示是16 bit指针,指针剩下14 bit说明在DNS报文中标识符所在位置(起始位置由标识字段非第一字节起算 ) 。
- 图14 - 11展示了DNS应答格式,重申了IP首部和UDP首部封装情况,明确了问题部分域名中标识符计数字节,回答中的指针值为12表示从DNS首部开始偏移量。
14.5 指针查询
- 原理:指针查询是给定一个IP地址,返回与之对应的域名。通过in - addr.arpa域实现,当组织获得DNS域名空间授权(如noao.edu ) ,也获得对应IP地址的in - addr.arpa域名空间授权。IP地址在DNS树中的表示是从网络号开始依次写出字节,且DNS名字自树底部逐步向上书写,如IP地址140.252.13.33对应的DNS名字为33.13.252.140.in - addr.arpa 。
- 举例
-
- 使用host程序结合tcpdump进行指针查询观察。在sun主机运行
host 140.252.13.34
,host程序自动产生指针查询。tcpdump输出显示,第1行标识查询,期望递归标志设为1 ,查询类型为PTR,数据包含DNS报文首部、域名标识符和查询类型字节。第2行是响应,RR类型为PTR,资源数据包含对应域名svr4.tuc.noao.edu 。 - 名字解析器传递给名字服务器的指针查询是域名34.13.252.140.in - addr.arpa ,而非32 bit的IP地址。
- 使用host程序结合tcpdump进行指针查询观察。在sun主机运行
- 主机名检查:当主机收到客户的UDP数据报或TCP连接请求时,能获取客户IP地址和端口号。部分服务器(如Rlogin服务器 )不仅需客户IP地址获取指针记录,还需向DNS询问该IP地址对应的域名,并检查返回地址与收到数据中的源IP地址是否匹配,以防止.rhosts文件(仅含主机名,无IP地址 )被伪造。使用gethostbyaddr函数可实现从IP地址获取对应名字,编程时需注意相关问题。 例如在SunOS 4.13名字解析器库的例子中,调用gethostbyaddr获取IP地址对应名字时,tcpdump捕获到名字解析器自动对第1行预期的指针查询和第2行显示的IP地址进行两个回答记录查询。若两个地址中无匹配输入参数的地址,函数会向系统日志发送报文并返回差错。
14.6 资源记录
- A记录:定义一个IP地址,存储32 bit的二进制数,用于将主机名映射到IP地址。
- PTR记录:用于指针查询,将IP地址看作in - addr.arpa域下的一个域名(标识字符串 ) ,实现从IP地址到域名的反向映射。
- CNAME记录:表示“规范名字(canonical name )” ,用于给服务器设置别名,系统提供易于记忆的别名,实际规范名通过别名可查到。如gated.cornell.edu是别名,规范名为COMET.CIT.CORNELL.EDU ,使用
host -t cname gated.cornell.edu
可查询。 - HINFO记录:表示主机信息,包括主机CPU和操作系统的两个字符串,提供主机基本信息,但并非所有站点都提供。如
host -t hinfo sun
,可显示sun主机的相关信息为Sun - 4/25和SunOS 4.1.3 。 - MX记录:邮件交换记录,应用于多种场景。如未连入Internet的站点将邮件转发到连入Internet的站点;通过一种协议无法到达目的主机时,将邮件传送到替代主机;允许机构提供他人发送邮件的虚拟主机;防止防火墙限制外部与内部主机的连接。每个MX记录有16 bit的整数值(优先值 ) ,邮件处理器按优先值从小到大顺序使用MX记录。如
host -t mx foo.com
,可查询到foo.com的MX记录为relay1.UU.NET和relay2.UU.NET 。 - NS记录:指定区域的授权名字服务器,由域名表示(符号串 ) ,用于标识负责某个域名区域的名字服务器。
14.7 高速缓存
- 缓存维护与作用:名字服务器维护高速缓存,减少Internet上DNS通信量。应用中的名字解析器不总处于工作状态,由名字服务器维护缓存,在其工作时起作用,且其他主机可共享缓存,提高查询效率。
- 实验设置与操作
- 配置修改:在sun主机上,从名字解析器文件
/etc/resolv.conf
中删除nameserver
行,留下domain
行,使名字解析器使用本地主机上的名字服务器。 - 查询过程及分析
-
-
- 执行
host ftp.uu.net
,tcpdump输出显示名字服务器与根名字服务器nsl.nic.ddn.mil联系进行A类型查询。根名字服务器返回的响应不含资源记录,含授权资源记录和附加信息资源记录,且未设置期望递归标志(RA ) 。 - 名字服务器与授权名字服务器ns.uu.net联系,设置期望递归标志,得到包含IP地址的响应。再次执行
host ftp.uu.net
,tcpdump无输出,因回答来自名字服务器高速缓存。 - 执行
host ftp.ee.lbl.gov
,名字服务器与根名字服务器c.nsysr.net联系,后续与授权名字服务器交互,得到CNAME资源记录(规范名ee.lbl.gov )和A记录(IP地址 ) 。体现了名字服务器在查询过程中对根服务器的选择(轮询不同根服务器取往返时间最小的 ) ,以及在响应中同时返回规范域名的CNAME记录和A记录的优化。
- 执行
-
14.8 用UDP还是用TCP
- 协议支持情况:DNS名字服务器熟知端口号为53 ,同时支持UDP和TCP访问。
- 选择UDP的原因:多数DNS查询和响应报文长度较小,使用UDP即可满足需求,且UDP开销相对较小。当名字解析器发出查询,响应中TC(截断标志 )比特设为1时,意味着响应长度超512字节,仅返回前512字节,此时名字解析器通常用TCP重发查询以获取完整响应。
- 选择TCP的原因:辅助名字服务器从主名字服务器执行区域传送时,因传送数据量较大,使用TCP协议,能更好处理大量数据传输,保证数据可靠传输。
- 协议使用要点:DNS应用需自行处理超时和重传。与其他使用UDP的Internet应用(如TFTP、BOOTP和SNMP )相比,DNS查询和响应常经过广域网,分组丢失率和往返时间不确定性更高,所以良好的重传和超时程序对DNS客户端很重要。
1