六、DNS组成与原理

一、啥是DNS

DNS全名叫domain name system,是一个部署在分层的DNS服务器上的分布式数据库通过访问DNS服务器,查询分布式数据库,能够让主机的域名转化为IP地址。

因为是个分布式的数据库,所以会分别部署在很多的DNS服务器上,那么当一个DNS请求过来了,由哪台服务器处理这个请求呢?所以,除了解析域名外,DNS协议还要负责负载均衡

DNS通常用来辅助应用程序,由其他应用层协议使用(比如Http),所以,所在的位置属于应用层协议

 

二、为啥需要DNS

主机之间通信需要彼此的IP地址和端口号,就拿打开网页来说,网页的域名好记,但是网页的IP地址难记,所以,DNS诞生了

 

三、DNS服务器的组成

3.1、DNS的由来

最初,域名和IP的对应关系全保存在一个叫hosts文件中。如果有一个新的计算机想接入网络,或者某个计算IP变更都需要到信息中心申请变更hosts文件,其他计算机也需要定期更新,才能上网。Ubuntu下的hosts文件是这样的

但是网络的规模越来越大,频繁更新,维护成本太高,所以,就出现了DNS服务器。DNS服务器中的数据库维护主机IP和主机名的对应关系。如果计算机接入网络,将这个信息写入到数据库中,用户输入域名时,会自动查询DNS服务器,由DNS服务器检索数据库,得到对应的IP地址。

DNS一开始并不是分布式的,而是一台DNS服务器,解决了用数据库代替人维护各自hosts文件的问题。但是,随着域名越来越多。会出现以下问题:

1、如果DNS服务器崩溃,那么,将无法解析域名,导致网络崩溃。此外,因为单台服务器的数据库要保存所有的主机名称和IP地址,随着网络的增加,维护也越来越频繁

2、所有DNS请求都发给一台服务器,造成通信量巨大,而且DNS请求可能要经过很多链路才能到达服务器,延迟拥塞严重

所以,就把DNS设计成分布式的了

 

3.2、DNS服务器的层级

因为DNS变成分布式的了。所以,DNS使用了大量的DNS服务器,它们以层次方式组织,DNS映射分布在所有的DNS服务器上。

DNS服务器的类型有三种:根DNS服务器、 顶级域(Top Level Domain,TLD) DNS服务器和权威DNS服务器。 这些服务器的层次结构如下图。

除了上述三种DNS服务器之外,还有另一类重要的DNS服务器,本地DNS服务器(local DNS server)。当主机发岀DNS请求时,该请求被先发往本地DNS服务器,然后本地DNS服务器将该请求转发到DNS服务器层次结构中。

 

3.3 DNS服务器的缓存

和http一样,DNS也有缓存机制。DNS缓存是由操作系统维护的临时数据库。它存储了以前的DNS信息。有助于减少DNS服务器的网络流量和DNS的平均时延。

DNS缓存的原理非常简单。 当DNS服务器收到DNS的应答时,它能将包含某域名到IP地址的映射缓存在本地。

例如,本地DNS服务器接收到一个回答,它能够缓存包含在该回答中的任何信息。 如果在DNS服务器中缓存了一台主机名-IP地址对,另一个对相同域名-IP地址的查询到达该DNS服务器时,该DNS服务器就能够提供所要求的IP地址。因为缓存的存在,部分DNS服务器被绕过,从而减少DNS的网络流量和DNS的平均时延

由于主机和主机名与IP地址间的映射并不是永久的,DNS服务器在一段时间后将缓存丢弃。

 

四、DNS的查询过程和方式

4.1、DNS的查询过程

当访问一个网页时,DNS的整体工作过程如下

1、客户端浏览器从上述URL中抽取域名,并将这台主机的域名传给DNS应用的客户端。

2、DNS客户端先通过本地hosts文件查找对应的IP地址,如果没找到,向DNS服务器发送一个包含主机域名的请求。

3、DNS客户最终会收到一份回答报文,其中含有对应于该主机名的IP地址。

4、客户端浏览器接收到来自DNS报文中的IP地址,向位于该IP地址80端口的HTTP服务器进程发起一个TCP连接

示意图如下:

其中,DNS中具体的查询方式有两种情况,一种是迭代查询,另一种是递归查询

 

4.2、迭代查询

迭代查询:当根DNS服务器收到本地DNS服务器发出的查询请求报文时,要么给出所要查询的IP地址,要么告诉本地服务器:“你下一步应当向哪一个域名服务器进行查询”。然后让本地服务器进行后续的查询。

根DNS服务器通常是把自己知道的顶级DNS服务器的IP地址告诉本地DNS服务器,让本地DNS服务器再向顶级DNS服务器查询。顶级DNS服务器在收到本地DNS服务器的查询请求后,要么给出所要查询的IP地址,要么告诉本地服务器下一步应当向哪一个权威DNS服务器进行查询。最后,把这个结果返回给发起查询的主机。

过程如下图

假设主机cse. nyu. edu想知道主机 gaia. cs. umass. edu的IP地址。 过程如下:

0、请求主机cse. nyu. edu会在本地hosts文件中查找是否有关于gaia. cs. umass. edu的IP的映射,如果没有,会到本机缓存中查找,如果还没有,执行步骤1(如果hosts文件中有或者本机缓存中有该映射,直接返回DNS查询结果)

1、主机cse. nyu. edu向本地DNS服务器dns. nyu. edu发送一个含有主机名gaia. cs. umass. edu的DNS查询报文,本地DNS服务器如果在缓存中找到了该域名与IP地址的映射,直接返回DNS查询结果,如果没有,本地DNS服务器将根DNS服务器发起DNS查询请求,并执行第步骤2。

2、本地DNS服务器将该查询报文转发到根DNS服务器。 根DNS服务器也会在缓存中查找是否有该域名和IP地址的映射,如果有,将该映射放到查询结果中并返回DNS查询报文给本地DNS服务器。否则,根DNS服务器根据edu前缀,向本地DNS服务器返回负责edu的TLDDNS服务器的IP地址列表,并执行步骤3。

3、本地DNS服务器则再次向TLDDNS服务器发送DNS查询报文。TLDDNS服务器会在缓存中查找是否有该域名和IP地址的映射,如果有,将该映射放到查询结果中并返回DNS查询报文给本地DNS服务器。否则,该TLDDNS服务器根据umass. edu前缀,并把权威DNS服务器的IP地址向本地DNS服务器返回,并执行步骤4。

4、本地DNS服务器直接向权威服务器dns. umass. edu重发查询报文,dns. umass. edu用gaia. cs. umass. edu的IP地址进行响应,最后本地DNS服务器将IP地址发给请求主机,然后请求主机开始建立TCP连接,进行通信。

 

4.3、递归查询

如果主机所询问的本地DNS服务器不知道被查询的域名的IP地址,那么本地DNS服务器就以DNS客户的身份,向其它根DNS服务器继续发出查询请求报文(即替本地DNS服务器或者主机继续查询),而不是让本地DNS服务器或者主机自己进行下一步查询。

过程图如下:

交互过程如下:

0、同迭代查询步骤0

1、主机cse. nyu. edu首先向本地DNS服务器dns. nyu. edu发送一个含有gaia. cs. umass. edu的DNS查询报文,本地DNS服务器依然是先查询缓存决定是否直接返回DNS查询报文,如果缓存没有该映射,则本地DNS服务器向跟根务器发送DNS查询报文。

2、根DNS服务器也会先进行缓存查找,没找到的话,该根DNS服务器根据后缀edu,将报文转发给后缀为edu的顶级域名DNS服务器。

3、TLDDNS服务器收到报文后,依然会先进行缓存查找,没找到的话,根据后缀umass. edu,将报文转发给权威DNS服务器dns. umass. edu

4、权威DNS服务器dns. umass. edu收到报文后,先进行缓存查找,没找到的话,根据后缀cs.umass. edu将报文转发给权威DNS服务器dns.cs.umass.edu

5、权威DNS服务器dns.cs.umass.edu对发来的DNS查询报文进行解析得到IP地址或者查找失败,之后,将DNS查询结果原路返回至权威DNS服务器dns.cs.umass.edu,然后再返回给权威服务器dns. umass. edu,接着再返回给TLDDNS服务器,TLDDNS服务器再将DNS查询结果返回给根DNS服务器,根DNS服务器又查询结果返回给本地DNS服务器,最后请求主机收到本地DNS服务器的查询报文。

6、请求主机根据查询结果中的IP地址直接向gaia. cs. umass. edu发起连接。

五、DNS与安全

关于DNS的攻击大体有两种:一种是向DNS服务器发送大量的请求,导致其他正常请求无法得到相应,从而无法得到域名到IP地址的映射,无法进行网络连接。另一种是劫持主机的DNS请求并返回错误的DNS解析映射,从而让用户访问一个错误的IP地址。

 

参考

《图解HTTP》

《计算机网络自顶向下方法》

https://cloud.tencent.com/developer/article/1552703

https://blog.csdn.net/qq_36898043/article/details/79666611

https://blog.51cto.com/hbgslz/2074068

https://blog.csdn.net/ZWE7616175/article/details/80473982

https://www.2daygeek.com/flush-clear-dns-cache-linux/#

 

欢迎大家评论交流,作者水平有限,如有错误,欢迎指出

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值