TCP/IP协议 — DNS 域名系统
[TOC]
域名系统也叫 域名解析(Domain name resolution,DNS) 是一种用于TCP/IP
应用程序的分布式数据库,它提供主机名字和IP
地址间的转换及有关电子邮件的选路信息。
分布式的意思是,在
Internet
上的单个站点不能拥有所有信息,。每个站点(如大学中的系、校园、公司或公司中的部门)保留它自己的信息数据库,并运行一个服务器程序供Internet
上的其他系统(客户程序)查询。DNS
提供了允许服务器和客户程序相互通信的协议。
对DNS
的访问是通过一个地址解析器(resolver
)来完成的,在Unix
主机中该解析器主要通过两个函数gethostbyname(3)
和gethostbyaddr(3)
来访问的。前者接收主机名字返回IP
地址,后者接收IP
地址寻找主机名字。
解析器并不像
TCP/IP
协议那样是操作系统的内核,而是应用程序的一部分。在一个应用程序打开一个TCP
连接或使用UDP
发送一个数据报之前,必须将一个主机名转换成为一个IP
地址,操作系统内核中的TCP/IP
协议簇对DNS
一点都不知道。
DNS 基础
DNS
的名字空间和Unix
文件系统具有相似的层次结构,每个节点(圆圈)有一个最多63
个字符长的标签。这棵树的根是一个空标签的特殊节点,标签不区分大小写。树上的任何节点的域名是从该节点开始到根节点的标签列表,使用.
符号分割。域名树上的不同节点可以使用相同标签,但是每个节点在域名树上必须有一个唯一的域名。
完全限定域名(Full Qualified Domain Name,FQDN) ,也叫 绝对域名 。它指定在域名系统树层次结构中的确切位置,它指定了所有域的级别(包括顶级域和根区域)。一个完全限定域名是没有歧义的,只有一种方式去解释它。通常它由一个主机名和最少一个更高级域标签并通过.
分割符组成,并且以顶级域结束。
域名系统的根域名(顶级域)未命名的,它是通过在域名系统层次结构中有一个空标签来表示。而完全限定名以顶级域结尾,因此如果不完全限定域名以两个以上标签组成,则可以认为它是完全限定域名;或者某些情况要求完全限定域名以
.
符号结尾。如.tuc.noao.edu.
。

顶级域名被分为三个部分:
arpa
是一个特殊域,用于地址到名字的映射。- 普通域,
7
个三字符。通常只有.gov
、.mil
仅限于美国使用。 - 国家域,依据
ISO 3166
国家代码的两字符。
DNS
通过 网络信息中心NIC
分配顶级域和委派其他指定地区域的授权机构。一个独立管理的
DNS
子树称为一个区域 (zone
)。一个常见的区域是一个二级域,如noao.edu
。许多二级域将它们的区域划分成更小的区域。例如,大学可能根据不同的系来划分区域,公司可能根据不同的部门来划分区域。一旦一个区域的授权机构被委派后,由它负责向该区域提供多个名字服务器。当一个新系统加入到一个区域中时,该区域的
DNS
管理者为该新系统申请一个域名和一个IP
地址,并将它们加到名字服务器的数据库中。这就是授权机构存在的必要性。
一个名字服务器负责一个或多个区域。一个区域的管理者必须为该区域提供一个主名字服务器和至少一个辅助名字服务器。主、辅名字服务器必须是独立和冗余的,以便当某个名字服务器发生故障时不会影响该区域的名字服务。
主、辅名字服务器的主要区别在于主名字服务器从磁盘文件中调入该区域的所有信息,而辅名字服务器则从主服务器调入所有信息。我们将辅名字服务器从主服务器调入信息称为区域传送。
当一个新主机加入一个区域时,区域管理者将适当的信息(最少包括名字和
IP
地址)加入到运行在主名字服务器上的一个磁盘文件中,然后通知主名字服务器重新调入它的配置文件。辅名字服务器定时(通常是每隔3
小时)向主名字服务器询问是否有新数据。如果有新数据,则通过区域传送方式获得新数据。
当名字服务器没有请求信息时,它必须联系另一个名字服务器。然而并不是每个名字服务器如何联系其他名字服务器,但是每个名字服务器必须知道怎么联系根名字服务器。
1993
年4
月时有8
个根名字服务器,所有的主名字服务器都必须知道根服务器的IP
地址(这些IP
地址在主名字服务器的配置文件中,主服务器必须知道根服务器的IP
地址,而不是它们的域名)。根服务器则知道所有二级域中的每个授权名字服务器的名字和位置(
IP
地址)。正在处理请求的名字服务器与根服务器联系,根服务器告诉它与另一个名字服务器联系。
DNS
的一个基本特性是使用超高速缓存。即当一个名字服务器收到有关映射的信息(主机名字到IP
地址)时,它会将该信息存放在高速缓存中。这样若以后遇到相同的映射请求,就能直接使用缓存中的结果而无需通过其他服务器查询。
DNS 报文

DNS
定义了一个用于查询和响应的报文格式(如上图)。报文由12
字节首部和4
个可变字段组成。
标识 字段,由客户程序设置,并由服务器返回结果,客户程序通过它来确定响应与查询是否匹配。
标志 字段,占16bit
被分为多个子字段,如下:
QR
字段,0
表示查询,1
表示响应。占1bit
。opcode
字段,0
表示标准查询,1
表示反向查询,2
表示服务器状态请求。点4bit
。AA
字段,权威回答。如果查询结果由管理域名的域名服务器而不是缓存服务器提供的,则称为权威回答。TC
字段,表示“可截断的”。使用UDP
时,当其值为1
时,总长度超过512字节,只返回前512个字节,这时 DNS就需要使用TCP重发原来的查询请求。RD
字段,表示“期望递归”。该比特在一个查询中设置,并在响应中返回。这个标志告诉名字服务器必须处理这个查询,也称为一个递归查询。如果该位为0
,且被请求的名字服务器没有一个权威回答,它就返回一个能解答该查询的其他名字服务器列表,这称为迭代查询。RA
字段,表示“可用递归”。如果名字服务器支持递归查询,则在响应中将该比特设置为1
。zero
字段,必须为0
。rcode
字段,返回码。0
表示没有差错,3
表示名字差错。名字差错只能从一个权威的名字服务器上返回,它表示指定的域名在查询中不存在。

随后的四个16bit
字段说明最后四个变长字段中包含的条目数。对于查询报文,问题数通常是1
,而其他三项则均为0
。类似地,对于应答报文,回答数至少是1
,剩下的两项可以是0
或非0
。
查询问题
问题部分中,通常只有一个问题,每个问题的格式如下:

查询名字段,要查找的名字,它是一个或多个标签的序列。每个标签以首字节的计数值来说明随后标签的字节长度,名字最后以字节为0
结束,长度为0
的标签是根标签。因为标签最大长度为63
,所以计数字节的值必须是0 ~ 63
的数。该字段无需以整32bit
边界结束,即无需填充字节。

查询类型字段,每个问题有一个查询类型,并且每个响应(也叫一个 资源记录 )也有一个类型。
常见的查询类型如下:
名称 | 数值 | 描述 |
---|---|---|
A | 1 | 传回一个32bit 的IPv4 地址,最常用于映射主机名称到IP 地址。正向查询 |
AAAA | 28 | 传回一个128bit 的IPv6 地址,最常用于映射主机名称到IP 地址。正向查询 |
CNAME | 5 | 一个主机名字的别名,域名系统将会继续尝试查找新的名字(将域名指向另外一个域名canonical name )。 |
NS | 2 | 委托DNS 区域使用已提供的权威名字服务器(Name server )。 |
MX | 15 | 将一个域名映射到该域名的邮件传输代理(Message Transfer Agents,MTA)列表。 |
SRV | 33 | 服务定位记录,被新式协议使用而避免产生特定协议的记录。 |
PTR | 12 | 由IP 到域名的查询,反向查询。 |
TXT | 16 | 最初用于DNS记录中的任意人类可读文本。然而,自20世纪90年代初以来,这种记录更多地携带机器可读的数据,如随机加密等。一般做一些验证记录时会使用此项如:做SPF(反垃圾邮件)记录。 |
SOA | 6 | 指定DNS 域的权威信息,包括主要名称服务器、域名管理员邮箱地址、域名序列号和与刷新区域几个相关的计时器。 |
AXFR | 252 | 将整个区域文件从主要名称服务器传输到次要名称服务器 |
*(或 ANY) | 255 | 返回名称服务器已知的所有类型的所有记录 |
查询类 字段,值通常是1
表示互联网地址(某些站点也支持其他非 I P地址)。
响应资源记录
DNS
最后三个字段 回答 、 授权、 附加信息 字段均采用一种称为资源记录( Resource Record,RR )的相同格式。如下图:

域名 字段是下面资源数据的名字,它的格式与前面 查询名 字段格式相同。
类型 字段,指定一个RR
类型码,它与前面查询类型值相同。
类 字段,值通常是1
表示互联网地址(某些站点也支持其他非 I P地址)。
生存时间 字段,RR
被客户端缓存的秒数,通常是2
天。
资源数据长度 字段,说明了资源数据的数量。
资源数据 字段,该数据的格式依赖于类型字段的值。对于类型1
(A记录)资源数据是4
字节的IP
数据。
DNS 反向查询
DNS
反向查询是查询域名系统来确定IP
地址关联的域名的技术,即给定一个IP
地址返回该地址对应的域名。反向DNS
查询的过程使用PRT
记录,互联网的反向DNS
数据库根植于.arpa
顶级域名。
协议
[rfc:1912 RFC1912年]
建议,每一个互联网可访问的主机都应该有一个名字”和“每一个IP地址都应该有一个匹配 PTR 记录”,但这并不是一个互联网标准 强制要求,所以并不是每一个IP地址都有一个反向记录。
反向查找IPv4
地址时使用一个特殊的域名in-addr.arpa
。在上面树形图中IP
地址为140.252.13.33
,在DNS
树中结点in-addr.arpa
的下一级必须是该IP
地址的第一字节140
,再下一级是252
,依此类推。
需要注意的是
DNS
名字是由DNS
树底部向上书写的,所以IP
地址140.252.13.33
,它的DNS
名字是33.13.252.140.in-addr.arpa
。必须写出
4
字节的IP
地址,因为授权的代表是基于网络号:A
类地址是第一字节,B
类地址是第一、二字节,C
类地址则是第一、二、三字节。
反向查找IPv6
地址时,使用一个特殊域名ip6.arpa
(以前是ip6.int
)。IPv6
地址,以十六进制数字表示为子域。
高速缓存
为了减少Internet
上DNS
的通信量,所有的名字服务器均使用高速缓存。在标准的Unix
实现中,高速缓存是由名字服务器而不是由名字解析器维护的。由于解析器是每个应用程序的一部分,并且应用程序又不可能总处于工作状态,因此将缓存放入整个系统运行期间都存在的程序(名称服务器)中是有意义的。这使缓存对于使用这个服务器的任何应用都是有效的。站点上任何使用该名字服务器的主机也可以共享服务器缓存。