前言
最近吸收了很多与DNS协议相关的知识,为了更好的吸收该部分知识,也打算把自己学习到的知识。通过自己的语言,能令想学习这部分知识的伙伴更容易的了解DNS协议。
前置知识
要学习DNS协议,首先得了解DNS是什么。DNS的英文全称是Domain Name System 翻译成中文就是域名系统。它的功能就是提供给用户域名解析服务。
1.什么是域名解析
2.为什么它能够提供这种服务。
首先回答第一个问题,先回忆一下,大家访问网站的过程。
第一步,打开浏览器
第二步,在地址栏输入网址,比如www.youkuaiyun.com
第三步,跳转到网页首页
而域名解析就是在第二步到第三步之间进行的,当你输入域名时,其实电脑并不知道网页的服务器在哪。因为网页服务器的位置是用IP地址标识的。在命令行使用nslookup,你就能查询网站的ip地址。如果有人不懂ip地址是什么的话,我后续可以写多一篇博客去介绍,但目前你可以理解ip地址就是服务器的家庭住址,只有当你知道服务器的家庭住址,你才能去它家看它家里面的东西(网页)。那么域名解析,就是将域名映射到ip地址上的意思。可以通俗的理解成,域名就是人的姓名,ip地址就是电话号码,DNS系统就是通讯录。当你要打电话给别人的时候,首先会在手机通讯录上找那个人的名字,然后找到对应的电话号码,才能和对方通话。DNS系统就是存储了名字与电话的系统。
而为什么它能提供这种服务呢,这是因为它存储了互联网上的网站的ip和域名的对应信息。
该部分就比较专业了,如果要深入学习的话,就必须看这部分描述,因为这与DNS协议的设计是息息相关的。此部分引用了域名系统的部分介绍。
名字空间的层次结构:
名字空间是指定义了所有可能的名字的集合。域名系统的名字空间是层次结构的,类似Windows的文件名。它可看作是一个树状结构,域名系统不区分树内节点和叶子节点,而统称为节点,不同节点可以使用相同的标记。所有节点的标记只能由3类字符组成:26个英文字母(a~z)、10个阿拉伯数字(0~9)和英文连词号(-),并且标记的长度不得超过22个字符。一个节点的域名是由从该节点到根的所有节点的标记连接组成的,中间以点分隔。最上层节点的域名称为顶级域名(TLD,Top-Level Domain),第二层节点的域名称为二级域名,依此类推。
DNS使用TCP和UDP端口53。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。
DNS协议分析
开篇第一句,如果英文水平可以的话,可以结合RFC1035和我这篇文章一起看。这样有助于加深了解。
DNS对很多东西的大小都有限制,主要是以下几个:
www.csdn.com www和csdn以及com就是标签
-
标签 63字节或更少
-
域名 255字节或更少
-
TTL 一个32位的有效数字
-
UDP消息 512字节或更少
一条DNS报文中自然就包含了域名。你或许会以为报文中包含的域名会是www.csdn.com,然而并不是。RFC文档中有说明::在报文消息中的域名是由标签组成的。每个标签表示为一个八位字节长度的字段加上余下的标签字符。而由于所有域名的最后的标签都是根域名,而根域名后面是没有标签的。因此域名的结束位为'\0';每个长度字节的前两位必须是0,这样余下的6位能确保限制标签在63字节的长度以下。为了简化实现,域名总长度即(标签和标签长度字段)必须为255个字节以下。域名不区分大小写。 这是我翻译的官方说明,只看文字挺苦涩的,因此我决定通过例子解释下:
这段的意思是DNS报文中包含的域名表示格式。
在现实生活中,网站域名通常为www.baidu.com的格式。而这在数据传输中是很麻烦的,不适用于DNS的场景。你可以设想下,当你要发送一堆域名给别人。
比如:www.abc.com www.cde.com www.efg.com
对方收到之后,该怎么解析呢,是数'.'。还是在协议头声明有多少条信息?然后使用分隔符。但无论怎么样,要不就增加报文头字段,要不就增加了分隔符的字节。为了简化信息,DNS协议采取的格式是,标签长度+字符
比如:www.baidu.com
在dns协议中就是3www5baidu3com\0
这样一来,读取就一点都不困难了。
前置知识中有讲过,每一级的域名长度不允许超过63个字符。上面的说明中有强调,表示长度的那个字段,必须最高两位为0。每个长度字段仅为1字节。
那么,长度字段的最大值就是00111111换算成二进制就是63。
不仅如此,因为限制了长度字段的最高位,DNS还有一个妙用。这就是后文将会讲述的。
DNS报文的格式:
Header:DNS的报文头。其中包含了很多关于该报文信息字段,以及其余几项的相关内容。以及说明了这是一个请求还是响应报文,后面有详细描述。
Question:描述问题的部分。包含了请求查询的问题的字段。
这些字段包含:
QTYPE:获取类型
QCLASS:获取类别
QNAME:需要查询的域名。
以下的三个部分包含相同的格式:一系列可能为空的resource records(RRs)资源记录链表。
Answer:该部分包含响应Question部分的RRS
Authority:该部分包含指向一个权威域名服务器的RRS
Additional:该部分包含与查询相关的RRs,但又不是严格意义上的标准回答。
继续举例子:
一个DNS报文格式:
|Header|Question|Answer|Authority|Additional|
|必选 |可选 |可选 |可选 |可选 |
DNS报文Header部分:(总长度:6*16=96bit即12字节)
The header contains the following fields:
1 1 1 1 1 1
0