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标识响应报文

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。

DNS请求报文:

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记录作比较。

原文地址:https://www.cnblogs.com/lujiango/p/10749116.html