一、引言
关于DNS(Domain Name System)应该都不陌生,大多人说出来就是将一个网站的域名转化成IP.能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的 IP 数串。
- 使用域名代表IP地址,相对于数字更好记方便用户访问
- 服务器IP地址可能经常改动、使用域名映射IP、可对外提供一个稳定的服务地址
稍微画了个DNS原理图:
网络简易拓扑图一-DNS原理.png
DNS是一个分布式数据库系统。当我们需要访问一个域名(其实就是前面说的计算机的名字)时,应用程序会向DNS服务器发起一个DNS请求,DNS服务器返回该域名对应的IP地址.
它需要去管理一个超大型并且不断变化的域名到IP的映射集合、并且还要去应付成千上万的DNS查询请求. DNS协议是如何规划来处理这些问题的呢?我们需要看下了解下DNS的域名系统结构.
二、DNS域名系统结构
image.png1)Root 域名:DNS 域名使用时,规定由尾部句号来指定名称位于根或更高级别的域层次结构;
2)Top Level 顶级域名:用来指示某个国家、地区或组织使用的名称的类型名称。如 .com;
3)Second Level 域名:个人或组织在 Internet 上使用的注册名称。如 baidu.com;
4)Third Level 域名:已注册的二级域名派生的域名。如 tieba.baidu.com
通过这样的域名结构划分、就合理地将所有的域名资源记录存储到不同的域名服务器上。
这样我们建立了一个域名服务器集群,并合理地保存了域名空间和域名资源记录的对应关系。现在我们要做的就是发送一个DNS请求给域名服务器,然后坐等它返回正确的域名资源记录,这个过程叫作域名解析。
画了张图描述下DNS解析过程:
image.png
如上图所示,这是一个典型的域名解析过程:
- 1)浏览器中输入 www.baidu.com,发出解析请求;
- 2)本机的域名解析器 resolver 程序查询本地缓存和 host 文件中是否为域名的映射关系,如果有则调用这个 IP 地址映射,完成解析;
- 3)如果 hosts 与本地解析器缓存都没有相应的网址映射关系,则本地解析器会向 TCP/IP 参数中设置的首选 DNS 服务器(我们叫它 Local DNS 服务器)发起一个递归的查询请求;
- 4)服务器收到查询时,如果要查询的域名由本机负责解析,则返回解析结果给客户机,完成域名解析,此解析具有权威性。如果要查询的域名,不由 Local DNS 服务器解析,但该服务器已缓存了此网址映射关系,则调用这个 IP 地址映射,完成域名解析,此解析不具有权威性;
- 5)如果 Local DNS 服务器本地区域文件与缓存解析都失效,则根据 Local DNS 服务器的设置(是否递归)进行查询,如果未用开启模式,Local DNS 就把请求发至13台 Root DNS。如果用的是递归模式,此 DNS 服务器就会把请求转发至上一级 DNS 服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根 DNS 或把转请求转至上上级,以此循环;
- 6)Root DNS 服务器收到请求后会判断这个域名是谁来授权管理,并会返回一个负责该顶级域名服务器的一个 IP;
- 7)Local DNS 服务器收到 IP 信息后,将会联系负责 .net 域的这台服务器;
- 8)负责 .com 域的服务器收到请求后,如果自己无法解析,它就会找一个管理 .net 域的下一级 DNS 服务器地址给本地 DNS 服务器;
- 9)当 Local DNS 服务器收到这个地址后,就会找 52im.net 域服务器,10、11重复上面的动作,进行查询;
- 10)最后 www.baidu.com 返回需要解析的域名的 IP 地址给 Local DNS 服务器;
- 11)Local DNS 服务器缓存这个解析结果(同时也会缓存,6、8、10返回的结果);
- 12)Local DNS 服务器同时将结果返回给本机域名解析器;
- 13)本机缓存解析结果;
- 14)本机解析器将结果返回给浏览器;
- 15)浏览器通过返回的 IP 地址发起请求。
递归查询:如果主机所询问的本地域名服务器不知道被查询域名的 IP 地址,那么本地域名服务器就以 DNS 客户的身份,向其他根域名服务器继续发出查询请求报文,而不是让该主机自己进行下一步的查询。
迭代查询:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的 IP 地址,要么告诉本地域名服务器:你下一步应当向哪一个域名服务器进行查询。然后让本地域名服务器进行后续的查询,而不是替本地域名服务器进行后续的查询。
由此可见,客户端到 Local DNS 服务器,Local DNS 与上级 DNS 服务器之间属于递归查询;DNS 服务器与根 DNS 服务器之前属于迭代查询。
#######三、DNS报文格式
首先我打算通过WireShark抓包来看一眼DNS数据包
3.1 抓包前准备
查询手头电脑的DNS配置
cat /etc/resolv.conf
nameserver 10.0.62.15
ifconfig
10.0.51.182
我这边查询的配置是 10.0.62.15
3.2开始抓包分析DNS报文格式
ping bilibili.com
WireShark抓包如下:
image.png
DNS定义了一个用于查询和响应的报文格式
image.png
这个报文由12字节长的首部和4个长度可变的字段组成
标识字段由客户程序设置并由服务器返回结果。客户程序通过它来确定响应与查询是否匹配。
16 bit的标志字段被划分为若干子字段,我们通过抓包工具看.
image.png
- QR是1bit字段:0表示查询报文,1表示响应报文。
- opcode是一个4bit字段:通常值为0(标准查询),其他值为1(反向查询)和2(服务器状态请求)。
- AA是1bit标志,表示“授权回答(authoritative answer)”。该名字服务器是授权于该域的。
- TC是1bit字段,表示“可截断的(truncated)”。使用UDP时,它表示当应答的总长度超过512字节时,只返回前512个字节。
- RD是1bit字段表示“期望递归(recursion desired)”。该比特能在一个查询中设置,并在响应中返回。这个标志告诉名字服务器必须处理这个查询,也称为一个递归查询。如果该位为0,且被请求的名字服务器没有一个授权回答,它就返回一个能解答该查询的其他名字服务器列表,这称为迭代查询。在后面的例子中,我们将看到这两种类型查询的例子。
- RA是1bit字段,表示“可用递归”。如果名字服务器支持递归查询,则在响应中将该比特设置为1。在后面的例子中可看到大多数名字服务器都提供递归查询,除了某些根服务器。
- 随后的3bit字段必须为0。
- rcode是一个4bit的返回码字段。通常的值为0(没有差错)和3(名字差错)。名字差错只有从一个授权名字服务器上返回,它表示在查询中制定的域名不存在。
随后的4个16 bit字段说明最后4个变长字段中包含的条目数。对于查询报文,问题(question)数通常是1,而其他3项则均为0。类似地,对于应答报文,回答数至少是1,剩下的两项可以是0或非0。
下面这个是响应报文
image.png
我们通过dig命令来查看bilibili.com是如何被解析出来的,首先会向预置的 13 组根域名服务器发出请求获取顶级域名的地址:
dig -t A bilibili.com +trace
image.png
根域名服务器是 DNS 中最高级别的域名服务器,这些服务器负责返回顶级域的权威域名服务器地址,这些域名服务器的数量总共有 13 组,域名的格式从上面返回的结果可以看到是 .root-servers.net,每个根域名服务器中只存储了顶级域服务器的 IP 地址
image.png
网友评论