DNS:域名系统

域名系统(DNS)是一种用于TCP/IP应用程序的分布式数据库,它提供主机名字和IP地址之间的转换及有关电子邮件的选路信息。
分布式是指在Internet上的单个站点不能拥有全部的信息。每一个站点保留它本身信息数据库,并运行给一个服务器程序供Internet上的其余系统查询。DNS提供了容许服务器和客户程序相互通讯的协议。数据库

1. 数据结构

DNS的名字空间和UNix的文件系统类似,也具备层次结构。如图显示了这种层次的组织形式:缓存

每一个节点(圆圈)有一个至多63个字符长的标示(不区分大小写)命名树上任何一个结点的域名就是将从该结点到最高层的域名串联起来,中间使用一个点“.”分隔这些域名(Unix文件系统路径是从树根依次向下造成的)。
域名树中的每一个结点必须有一个惟一的域名,但域名树种的不一样结点可以使用相同的标识。
以点“.”结尾的域名称为绝对域名或彻底合格的域名FQDN(Full Qualified Domain Name),例如sun.tuc.noao.edu.。若是一个域名不以点结尾,则认为该域名是不彻底的。
顶级域名被分为三个部分:
(1)arpa是一个用做地址到名字转换的特殊域
(2)7个3字符长的普通域(组织域)
(3)全部2字符长的域是定义的国家代码,国家域(地理域)
许多国家将他们的二级域组织成相似于普通域的结构。例如,.ac.uk和.co.uk等服务器

一个独立管理的DNS子树称为一个区域。一个场景的区域时一个二级域,如noao.edu。许多二级域将他们的区域划分红更小的区域。
一旦一个区域的受权机构被委派后,由它负责向该区域提供多个名字服务器。当一个新系统加入到一个区域中时,该区域的DNS管理者为该新系统申请一个域名和一个IP地址,并将它们加到名字服务器的数据库中。数据结构

2. DNS报文格式

DNS定义了一个用于查询和响应的报文格式。如图显示这个报文的整体格式:分布式

这个报文由12字节长的首部和4个长度可变的字段组成。
(1)标识:由客户端设置并由服务器返回结果,客户程序经过它来肯定响应与查询是否匹配。
(2)标志:16bit的标志字段被划分为若干个字段,如图:函数

QR:1bit字段,0标识查询报文,1标识响应报文3d

opcode:4bit字段,0标准查询,1反向查询,2服务器状态请求
AA:1bit字段,表示受权回答(Authoritative Answer),该名字服务器是受权于该域的。
TC:1bit字段,表示可截断的(truncated),使用UDP时,它表示当应答的总长度超过512字节时,只返回前512个字节。
RD:1bit字段,表示指望递归(Recursion Desired)。该比特能在一个查询中设置,并在响应中返回。这个标志告诉名字服务器必须处理这个查询,也称为一个递归查询。若是该位为1,且被请求的名字服务器没有一个受权回答,它就返回一个能解答该查询的其余名字服务器列表,这称为迭代查询。
RA:1bit字段,标示可用递归若是名字服务器支持递归查询,则在响应中将该比特设置为1。
zero:随后的3bit字段必须是0
rcode:4bit返回码字段。0没有差错,3名字差错(名字差错只有从一个受权名字服务器上返回,它表示在查询中指定的域名不存在)
(3)随后的4个16bit字段说明最后4个变长字段中包含的条目数。对于查询报文,问题数一般是1,而其余3想则均为0。相似地,对于应答报文,回答数至少是1,剩下的两项可使0或非0。code

DNS请求报文:blog

DNS响应报文:递归

 

 2.1 DNS查询报文中的问题部分

 问题部分中每一个问题的格式如图,一般只有一个问题:

查询名是要查找的名字,它是一个或多个标识符的序列,每一个标识符以首字节的计数值来讲明随后标识符的字节长度,每一个名字以最后字节为0结束。计数字节的值必须是0~63的数,由于标识符的最大长度为63。
好比存储genini.tuc.noao.edu,如图

每一个问题有一个查询类型,而每一个响应也有一个类型。大约有20个不一样的类型值,只有两个能用于查询类型:A类型,标示指望得到查询名的IP地址;PTR查询则请求得到一个IP地址对应的域名。

实际抓包报文:

 

2.2 DNS响应报文中的资源记录部分

 DNS报文中最后的三个字段,回答字段、受权字段、附加信息字段,均采用一种称为资源记录RR的相同格式。如图显示了资源记录的格式:

 

(1)域名:记录中资源数据对应的名字,格式和前面介绍的查询名字段格式相同
(2)类型:类型说明RR的类型码,它的值和前面介绍的查询类型值时同样的。类一般为1,指Internet数据
(3)生存时间:客户程序保留该资源记录的秒数
(4)资源数据长度:说明资源数据的数量,该数据的格式依赖于类型字段的值,对于类型A资源数据是4字节的IP地址

实际抓包报文:

2.3 高速缓存

为了减小DNS的通讯量,全部的名字服务器均使用高速缓存,在标准的Unix实现中,高速缓存是有名字服务器而不是由名字解析器维护的。
既然名字解析器做为每一个应用的一部分,而应用又不可能总处于工做状态,所以将高速缓存放在只要系统(名字服务器)处于工做状态就能起做用的程序中显得很重要。
这样任何一个使用名字服务器的应用都可得到高速缓存,在该站点使用这个名字服务器的任何其余主机也能共享服务器的高速缓存。

3. 总结

DNS名字服务器使用的熟知端口号不管是对UDP仍是TCP都是53,这意味着DNS均支持UDP和TCP访问。
当名字解析器发出一个查询请求,而且返回响应中的TC(删减标志)比特被设置为1时,它就意味着响应的长度超过了512个字节,而仅返回前512个字节。在遇到这种状况时,名字解析器一般使用TCp重发原来的查询请求,它将容许返回的响应超过512个字节。既然TCP能将用户的数据流分为一些报文段,它就能用多个报文段来传送任意长度的用户数据。
既然DNS主要使用UDP,不管是名字解析器仍是名字服务器都必须本身处理超时和重传。

例子,启动Rlogin客户程序,而后链接到一个位于其余域的Rlogin服务器。(1)客户程序启动后,调用它的名字解析器函数将咱们键入的主机名转换为一个IP地址。一个A类型的查询请求被送往一个根服务器。(2)由根服务器返回的响应中包含为该服务器所在域服务的名字服务器名。(3)客户端的名字解析器将想改服务器的名字服务器重发上述A类型查询,这个查询一般是将指望递归标志设置为1。(4)返回的应答中包含Rlogin服务器的IP地址。(5)Rlogin客户和Rlogin服务器创建一个TCP链接。(6)Rlogin服务器收到来自客户的链接请求后,调用它的名字解析器经过TCp链接请求中的IP地址得到客户主机名。这是PTR查询请求,由一个根名字服务器垂类。这个根名字服务器可与不一样于步骤(1)中客户使用的根名字服务器。(7)这个根名字服务器的响应中含有为客户的in-addr.arpa域的名字服务器。(8)服务器上的名字解析器将向客户的名字服务器重传上述PTR查询。(9)返回的PTR应答中含有客户主机的FQDN。(10)服务器的名字解析器向客户的名字服务器发送一个A类型查询请求,查找前一步返回的名字对应的IP地址。(11)从客户的名字服务器返回的响应含有客户主机的A记录。Rlogin服务器将客户的TCP链接请求中的IP地址与A记录做比较。

相关文章
相关标签/搜索