DNS报文传递和报文、资源记录以及主文件格式

DNS报文传递和报文、资源记录以及主文件格式

​ 我们即将解释在DNS报文生成和发送方式,并介绍报文和资源记录所采用的格式。下面先对DNS报文及其如何产生和传送做一个总结性的讨论,概括DNS报文的格式和它包含的5个部分,介绍用于名字的标记法和有助于减少DNS报文长度的特殊压缩方法;然后,说明DNS报文首部和问题区的字段,解释用于所有RR通用字段格式和最为重要的记录类型中使用的具体手段,另外介绍DNS文本文件采用的格式。

​ 最后,简要讨论为支持IPV6对DNS所作的改动。大多数修改(并非全部)与报文格式和RR有关。

1、DNS报文产生和传送

​ 像其他许多TCP/IP一样,DNS被设计成是哦也能够一种客户机/服务器模型来完成这种信息传输,所有的DNS信息交换都从客户端发送一个请求开始,接着服务器就会响应一个回答。

1.1、使用DUP和TCP报文传送

​ DNS同时使用UDP/TCP发送报文,常规的报文交换比较简陋,因此很适合利用非常快速的UDP(是一种简单、无连接的协议,实际上没有提供什么功能但却非常的快速,特别适合于少量、快速的信息交换),DNS自己负责处理丢失请求的检测和重传,如果一段特定的时间后没有收到特定的响应,则必须重新发送请求,重传发送的速率通常设置在2~5秒钟以防止互联网上出现过多的DNS流量,对于比较大的或者比较重要的信息交换,尤其是地区传输来说,则用TCP,这既是因为其可靠性(它是一种面向连接、有确认的、可靠的协议,它自动提供了那些我们确保能够成功完成地区传输和其他冗余操作所需要的机制),也是因为它可以处理任意长度报文(UDP DNS报文的长度限制在512,当然如果实现了可选的DNS拓展机制EDNSO,则DNS UDP报文512字节的长度限制就可以取消)。

1.2、DNS报文处理及通用报文格式

​ DNS查询和响应采用一种通用的报文格式,这种报文格式包含5个区,这些区分别为客户机所请求的查询、服务器响应的回答和控制整个过程的首部信息提供了存放的位置。如下图所示。

在这里插入图片描述

​ 首部区总是在所有报文中出现,长度固定。除了含有重要的DNS控制信息之外,它还含有一个标志(QR)用来指明一个报文是查询还是响应。另外,首部中还有4个“计数”字段,这些字段用来告诉报文接收方其他四个区中的记录数量。

​ 当客户机发去一个查询时,他就创造一个首部区中的字段已经填充好的报文,报文的问题区中包含一个到多个查询(信息请求)。它将QR标志设置为0以说明这是一个查询,并在首部的QDCount字段中放置一个数字来说明问题区中问题的数量。其他区中的数量通常为0,因此将它们在首部中的计数字段(ANCount、NSCount和ARCount)都设置为0。

​ 当服务器接收到查询时,他将对查询进行处理并执行其中所请求的信息检索操作。然后,它使用查询报文为基础来创建自己的响应报文。首部和问题区被复制到响应报文,而QR标志被设置为1以说明这是一个回答。为了向客户端提供信息,首部的某些字段也要修改。例如,服务器要设置RCode(响应代码)字段来指出查询时成功还是出现了错误。

​ 服务器还要填充报文的其他3个区:回答、权威机构和附加信息。这些区公用一个基本格式,每个区携带一到多个RR(一种通用的记录格式)

2、DNS报文首部格式

​ 在DNS报文中,首部区带有数个重要的标志,另外它还指出报文中使用了其他哪些区。图8-2说明了在所有DNS报文中所使用的首部地区的格式,表8-2、表8-3和表8-4中对其进行了详细的描述。对于在一次交换中客户机和服务器以不同的方式使用字段情况,我们在表8-2中提到了两者用法之间的区别。
在这里插入图片描述

在这里插入图片描述

3、DNS问题区格式

DNS查询在问题区总是至少包含一条记录,用来说明本次交换中的客户机试图查找什么内容。这些记录会不经更改地复制到响应报文中,以便在需要的时候提供客户机参考。表8-5和表8-6详细描述了用于DNS报文问题区中每一条记录的格式,图8-3对其作了图示说明。

在这里插入图片描述

3.1、DNS通用RR格式

​ 某些信息类型对多有RR而言都是共同的,而其他信息类型对每种记录类型而言则是唯一的。为了处理这种情况,所有RR都使用一种通用字段格式来表示,其中包含RData字段,该字段根据记录类型变化而变化。表8-7中描述了这种通用RR格式,图8-4对其进行了图示说明。

在这里插入图片描述

3.2、通用RR的RData字段格式

RData字段有一到多个为RR携带实际有效载荷的子字段构成,下面我将介绍常见的RR类型。

3.2.1、A(地址)RR(类型值1)

A(地址)是DNS中最常见的RR类型,它包含一个与某个域名相关联的32比特IP地址。

字段名称长度(字节)描述
地址4地址:该条记录的命名对象对应的32比特IP地址
3.2.2、NS(名字服务器)RR(类型值2)

NSDName数据字段携带着一台名字服务器的域名。

字段名字长度(字节)描述
NSDName可变名字服务器域名:一台名字服务器可变长度的名字,这台服务器应该是该记录的命名对象的权威服务器。像所有名字一样,该名字使用标准的DNS名字标记法编码。如果能够找到A记录的话,对这种RR类型的请求通常还会导致一条指定名字服务器的A记录放在响应的附加信息中一并返回。
3.2.3、CName(规范名)RR(类型5)

CName数据字段包含一个已使用别名引用的命名对象的真实名字

子字段名称长度(字节)描述
CName可变规范名,命名对象的规范(真实)名字。该名字随后会被客户机使用标准DNS解析过程以获得最初指定的名字的地址
3.2.4、SOA(权威结构起点)RR(类型6)

SOA记录标记了一个DNS地区的起点,并包含着有关这个地区应该如何管理和使用的重要信息。SOA记录时是最复杂的RR类型。表8-5介绍了它的格式,图8-5对其进行了图示说明。

在这里插入图片描述
在这里插入图片描述

3.2.5、PTR(指针)RR(类型12)

PTR记录携带一个指向某条RR的指针,用于反向地址查找。它包含一个数字字段。

子字段名称长度(字节)描述
PTRName可变指针域名:一个长度可变的域名。这是一个由该条RR所指向的名字,上篇文章讲过详细用法
3.2.6、MX(邮件交换)RR(类型值15)

专用MX记录包含着有关邮件服务器的信息,这些邮件服务器用于向域发送电子邮件。每条记录记录包含两个字段。

子字段名称长度(字节)描述
优先2优先值:此次邮件交换的优先级,值越低表示优先级越高
交换可变交换域名:愿意为此命名对象提供邮件交换服务的某台主机域名,使用标准DNS名字标记法编码
3.2.7、TXT(文本)RR(类型16)

TXT记录含有关于命名对象的附加描述性信息。

子字段名字长度描述
TXT-Data可变文本数据:长度可变的描述性文本

4、DNS名字标记法和报文压缩

​ 显然,整个DNS协议的操作都以处理域、子域和对象的名字为中心。正如你在前面几个主题中看到的那样,DNS报文和RR中由很多字段携带着对象、名字服务器等的名字。DNS使用了一种专用标记法来编码RR和字段中的名字,又用这种标记法的一个变种来编码电子邮件地址,为了提高效率他还采用了一种特殊的压缩方法减少报文长度。

4.1、标准DNS名字标记法

​ DNS采用了一种专门的标记法来表示NDS名字,名字字段中的每个标签,一个接着一个,都要进行编码。在每个标签的前面,用一个保存二进制的字节来指示标签中的字符数量。然后,对标签中的字符编码,每个字符一个字节。名字的结尾由一个代表根的空标签来指示,其长度为0,因此每个标签都以字符0结尾,代表着这个长度为0的根标签。

​ 注意标签之间的圆点不是必须的,因为长度描述了标签的边界。读取名字的计算机在读入名字时还能同时了解每个标签中包含了多少的字节,因此当他从名字当中读取各个标签时可以很方便地为其分配空间。

​ 例如,www.xyzindustries.com可以编码为一下形式,

​ 【3】www【13】xyzindustries【3】com【0】

​ 这些标签长度都是二进制编码地数字,标签被限制最长63个字符。

在这里插入图片描述

4.2、NDS电子邮件地址标记法

​ 某些DNS资源记录中使用了电子邮件标记地址,例如SOA RR中地RName字段。电子邮件地址采用<名字>@<名字>地形式。DNS采用与常规DNS域完全相同的方法来对这些地址进行编码,简单的把名字@当作另一个圆点来处理。因此johnny@somewhere.org将被作为johnny.somewhere.org来进行对待,请编码如下:

【6】johnny【9】somewhere【3】org【0】

4.3、DNS报文压缩

​ 假设一个客户机现在请求查找xyzindustries.com的MX记录发送给这个客户机的响应中除了其他信息之外还将包含如下这两条记录。

MX记录,一条在名字字段中含有xyzindustries.com且在RData字段中含有mail.xyzindustries.com的MX记录。

A记录,假定名字服务器知道mail.xyzindustries.com的IP地址,则附加信息区包含一条A记录,该记录的名字字段中含有mail.xyzindustries.com,RData字段含有mail.xyzindustries.com的地址。

为了减少这种重复性,采用了一种特殊的称为报文压缩的技术。

4.3.1、利用报文压缩来避免全名重复

​ 在报文压缩中不再使用标签长度的组合来编码DNS名字,而是用一个两个字节长的指针,指向报文中能够找到这个名字的另外一个位置。该字段的前两个比特设置为1(即二进制11),其余14个比特包含一个偏移量,指出报文中什么位置可以找到这个名字。计算偏移量时将第报文的第一个字节(ID字段的第一个字节)计为0。

​ 让我们回到原来的例子。假定在DNS报文中,包含mail.xyzindustries.com的MX记录的RData字段从第47个字节开始。在第一个实例中,我们可以看见该名字的完整编码如下:

​ 【4】mail【13】xyzindustries【3】com

​ 但是在第二个实例中,我们将在其中放置两个值为1的比特,后面再加上一个二进制编码的数字47,这样一来就是16比特的二进制模式1100000000101111或两个数值192和47。

​ 那么读取名字字段的设备如何区分指针和真实的名字呢?这正是开始使用11的原因。这样做可以保证指针的第一个字节大于或等于192,由于标签长度被限制小于等于63个字节,因此当主机读取名字的第一个字节时,如过看到字节中的数值小于或等于63则它就知道了这是一个真实的名字,反之则是一个指针。

4.3.1、利用报文压缩来避免部分名重复

​ 指针的功能还可以更强大,它可以指向真实名字的一部分,或者额外的标签组合起来提供一个名字的压缩表示。

​ 例如:

​ 【4】mail【指向第19字节的指针】

5、DNS主文件格式

5.1、DNS通用主文件记录格式

​ 如所有RR都采用一种通用的字段格式进行内部存储一样,它们还可以使用一种通用的主文件格式。通常每条记录在文件中占据单独的一行。这种格式如下所示,其中可选字段放在方括号中表示:

<域名>[<ttl>]<类><类型><数据>

字段说明如下:

域名。DNS域名,既可以是一个全限定名(FQDN)也可以是一个部分限定名(PQDN)。

ttl。该条记录的TTL值。如果该项省略,则使用该地区默认的TTL值。

。RR类。对于现代DNS而言,该字段是可选的,并且默认是IN,表示因特网。

类型。RR类型,使用一个诸如A或NS之类的文本代码而不是数字代码指定。

数据。RR数据,一组依赖于记录类型的,通过空格分隔项目。

​ 根据记录类型,<数据>极可能是单条信息也可能是一组项目,在记录类型较长的情况下,尤其是SOA记录,有多个项目组成的<数据>字段分布在数行上,用圆括号括起来,圆括号令所有项目在处理上就像它们位于一行一样,注意如果存在字段,则字段和<类>字段可以呼唤,不会引起任何问题,因为一个是字段一个是文本(IN)。

5.2、主文件指令

​ 除了RR之外,大多数主文件实现还支持指令的使用,这些指令是一些说明了某些重要信息的命令,用来知道如何解释主文件,下面是三个最常见的指令。

$ORGIN  指定一个域名用来追加到非限定规范上.这是用来将PQDN转换为FQDN的基础.
$TTL    为所有没有自己在记录中指定TTL的RR指定一个默认的TTL值.
$INCLUDE  允许一个主文件包含另一个主文件的内容.有时用来避免地区之间某些相同项目出现重复

5.3、主文件语法规则

​ 还有少数其他几个语法规则用于主文件,其中一些规则使用目的是节省管理员的时间精力。

多条域名缩略法。如果多条连续的记录都数同一个域,则就可以只为第一条记录指定域名,然后把接下来的记录的域名留作空白。服务器会假定任一没有指定域名的RR适用于自己看到的最后一个域名。

注释。分号用于单行注释。

转义字符。反斜杠()

空格。制表符和空格用作定界符,空白行将被忽略。

大小写。主文件记录项目不区分大小写

6、为了支持IPv6所作的DNS修改

6.1、IPv DNS拓展

​ 实际上,由于DNS在体系结构上距离下面第三层的IP很远,所以需要修改的并不是特别多。

新的RR类型AAAA(IPv6地址)。常规DNS地址(A)RR是为32比特的IPv4地址定义的,所以为了使域名能够和128比特的IPv6地址相关联,创建了一种新的地址记录。4个A是一种助记码,用于指示IPv6的地址长度是IPv4的四倍。AAAA的NDS RR类型值是28.

新的反向解析层次结构

S拓展

​ 实际上,由于DNS在体系结构上距离下面第三层的IP很远,所以需要修改的并不是特别多。

新的RR类型AAAA(IPv6地址)。常规DNS地址(A)RR是为32比特的IPv4地址定义的,所以为了使域名能够和128比特的IPv6地址相关联,创建了一种新的地址记录。4个A是一种助记码,用于指示IPv6的地址长度是IPv4的四倍。AAAA的NDS RR类型值是28.

新的反向解析层次结构

查询类型和解析过程的改动

  • 25
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值