引言
域名系统是一种用于TCP/IP应用程序的分布式数据库,它提供主机名字和IP地址之间的转换及有关电子邮件的选路信息。这里提到的分布式是指在Internet上的单个站点不能拥有所有的信息。

只要是一堆机器,就可以叫集群,他们是不是一起协作着干活,这个谁也不知道;一个程序或系统,只要运行在不同的机器上,就可以叫分布式。
1
1
对DNS的访问时通过一个地址解析器来完成的(一般在应用程序上,不像TCP/IP协议那样是操作系统的内核)。

DNS基础
DNS的名字空间具有层次结构:

每个结点有一个至多63字符长的标识。
这棵树的树根是没有任何标识的特殊节点。
命名标识中一律不区分大小写。
命名树上任何一个结点的域名就是将从该结点到最高层的域名串连起来,中间用“.”隔开。
域名树种的每个结点必须有一个唯一的域名,但是不同结点可以用相同的标识。
FQDN(Full Qualified Domain Name):完全域名、绝对域名。如:sun.tuc.noao.edu.

如果一个域名不以点结尾,则认为该域名是不完全的。
如果不完整的域名由两个或以上的标号组成,则认为它是完整的,或者在该域名的右边加一个局部后缀。
顶级域名分为三个部分:

arpa是一个用作地址到名字转换的特殊域
7个3字符长的普通域
2字符长的都是国家域/地理域
网络信息中心NIC负责分配顶级域和委派其他指定地区域的授权机构。

一个独立管理的DNS子树称为一个区域,常见的区域是一个二级域,如noao.edu。

当一个新系统加入到一个区域中时,DNS管理者为该新系统申请一个域名和一个IP地址,并加到名字服务器的数据库中。

一个名字服务器负责一个或多个区域。
一个区域的管理者必须为该区域提供一个主名字服务器和至少一个辅助名字服务器(独立和冗余的,以免某个服务器故障时影响名字服务)。

主、辅助名字服务器的区别:主名字服务器从磁盘文件中调入该区域的所有信息,辅助名字服务器从主服务器中调入所有信息。

当一个名字服务器没有请求的信息时,它将于其他的名字服务器联系(DNS的分布特性),然而不是每个名字服务器都知道如何和其他的名字服务器联系,这时它会与根服务器联系,根服务器告诉它与另一个名字服务器联系。

NDS的报文格式
DNS定义了一个用于查询和响应的报文格式:

16bit的标志字段如下:

查询问题部分
查询名是要查找的名字,它是一个或多个标识符的序列(长度+名字+0结尾,如下),该字段无需以整32bit边界结束,无需填充字节。

每个问题有一个查询类型,每个响应也有一个类型。

最常用的查询类型是A,表示获得查询名的IP地址。PTR表示获得IP地址对应的域名。

查询类通常是1,指互联网地址。

资源记录
DNS报文中的最后三个字段:回答、授权、附加信息,均采用一种称为资源记录RR(Resource Record)的相同格式。

域名、类型、类和查询问题部分一样。
生存时间值位2天。

指针查询
指针查询即给定一个IP地址,返回与该地址对应的域名。

当一个组织加入Internet并获得DNS域名空间的授权,如noao.edu,则它们同事也获得了对应IP地址的in-addr.arpa域名空间的授权(2个域名空间的授权)。
在DNS树种结点in-addr.arpa的下一级必须是IP地址的第一节(140),再下一级是IP地址的再下一节,以此类推。
DNS名字是由DNS树的底部逐步往上书写的,这意味着140.252.13.33的sun主机,它的DNS名字是33.13.252.140.in-addr.arpa。

从名字解析器传入IP时,先将IP转换成34.13.252.140.in-addr.arpa,再传送给名字服务器查询。

资源记录
A – 知道名字查询IP
PTR – 知道IP查询域名

高速缓存
所有的名字服务器均使用高速缓存,高速缓存是名字服务器维护而不是名字解析器维护的(名字解析器在应用程序上,不能一直处于工作状态)。

名字解析器将在本地主机上(UDP和TCP端口号53)寻找名字服务器。

用UDP还是TCP
DNS主要使用UDP。
如果发送的数据超过512字节,则用TCP重传。
因为UDP一般要求不能超过512字节。
查询过程
客户程序启动后,调用它的名字解析器函数,将我们键入的主机名转换成一个IP地址,一个A类型的查询请求被送往一个根服务器。
由根服务器返回的相应中包含为该服务器所在域服务的名字服务器名。
客户端的名字解析器将向该服务器的名字服务器重发上述A类查询,这个查询通常将期望递归标志设置为1.
返回IP地址。