DNS基本工作原理

1 需要DNS 提供服务

我们知道,在计算机网络中,因为主机之间是需要通信的,所以很重要的一件事是找到一种方式去唯一性地识别一台主机,所以就有了主机MAC地址和IP地址,MAC地址又称为物理地址,计算机对于MAC地址和IP地址当然是乐于接受的,因为它们无非就是一串数字嘛,通过转换成01比特流能很好的在计算机之间传递这种MAC地址信息和IP地址信息。但计算机终究是给人用的,特别是对计算机不熟悉的普通大众来说,人们是记不住那么多的IP地址的,所以就出现了另一种主机名,如www.example1.com,就是大家平时所说的网址嘛,访问一个网站 www.example1.com,其实就是访问一台主机名为 www.example1.com 的服务器,这种识别主机的方式更容易被人们所接受。

尽管人们喜欢这种便于记忆的主机名标识方式,但是我们知道在计算机网络中,数据的传递还是要通过定长的,有着层次结构的IP地址,为了解决这两种不同的需求,我们就需要一种能进行主机名到IP地址转换的服务,这就需要**域名系统DNS(Domain Name System)**提供服务。

2 DNS工作原理

DNS提供了一种抽象,就像一个黑盒子,将网址输入黑盒,得到输出的IP地址,有了这层抽象,人们就不再需要每次都去关心我这个主机名对应哪个IP地址啊,只要设计好黑盒,需要时直接使用主机名,由DNS自动解析出IP地址即可。

所以问题就变成了如何实现这个提供服务的黑盒。

有一种最简单的设计就是在整个因特网中只使用一个DNS服务器,该服务器存储着所有的主机名和IP地址的映射关系,所有的查询都将发到这个服务器,同时该DNS服务器直接对查询的客户做出响应,这种设计的原理非常的简单,但是是不可行的,原因很简单,因特网的主机数量庞大,单个服务器是没有能力去处理这么多的查询,这种集中式的设计很容易崩溃

所以现在DNS采用的是分布式的设计方案,DNS实现为一个分布式数据库,称为DNS服务器层次结构,如下图:

实际上域名也是分级的,最顶级域名如我们平时常用的com, edu, cn,然后再一层一层分下去,从右到左,从最顶级到最低级。比如说 scnu.edu.cn 这样一个网站,.cn是最顶级的域名,整个分配给了中国地区,然后政府再根据使用情况,划分出了一个子域名.edu作为教育网使用,教育部再划分出一个scnu给华南师范大学使用,一层一层分配。一个域名可以分配出多个子域名,比如还有gov.cn就是划分给政府部门使用的嘛,xxxx.edu.cn就是很多学校的域名了。

大致上,有4种类型的DNS服务器:

  1. 顶级域服务器,也称TLD(Top-Level Domain)服务器,如org,com,net,edu等等等等

  2. 根DNS服务器,按照我们顶级域的划分,每个顶级域的划分都可以用一棵树表示,但是这些树好像没有联系起来,形成了森林,不利于整个DNS的管理,所以我们添加了一个根DNS服务器,让所有的顶级域服务器都变成它的子女,这样就形成了一棵DNS服务器树(好像没有这个专业名词哈哈,为了形象自己创造的)。

  3. 权威DNS服务器,在因特网上具有可访问主机的每一个组织都必须提供公共可访问的DNS记录,这些DNS记录存着这些主机的名字和IP地址的映射关系,一个组织机构的权威DNS服务器就收藏着这些记录,比如说你华南师范大学嘛有这么多的主机连接在校园网中,你就必须提供一个权威DNS服务器收藏着你名下的各主机名和IP地址的对应关系,这样当有人查询你名下的一个主机名的IP地址时,权威DNS服务器能够给出响应。当然也不是非得华师就要自己手撸一个权威DNS服务器,可以向服务商买一个权威DNS服务器嘛,然后只要把记录写进服务器就好了。

  4. 本地DNS服务器:本地DNS服务器起着代理的作用,当主机发出DNS请求时,该请求被发往本地DNS服务器,由本地DNS服务器转发到DNS服务器层次结构中。

来看一个具体的例子,ps (图中的最近的DNS服务器即上面说到的本地DNS服务器,不同教材说法有差异)

DNS的工作过程大致就如上图,注意上图①过程和②③④等过程的差别,客户端计算机询问最近的DNS服务器问“www.lab.glasscom.com的IP地址是多少?",最近的DNS服务器不知道,但是他没有直接返回客户端计算机说:“不知道”,而是作为一个代理,替客户端计算机去问“www.lab.glasscom.com的IP地址是多少?",查到了再告诉客户端计算机答案,有点送佛送到西那味,这种我们称为递归查询。而②③④过程所访问的服务器,他们也不知道“www.lab.glasscom.com的IP地址是多少?",他们不再帮本地DNS服务器查了,而是告诉本地DNS服务器:”我不知道,但是我告诉你,XXX知道,你问他去!",然后本地DNS再根据收到的信息去找下一个查,这种我们称为迭代查询

下面是一个不仅本地DNS服务器使用递归查询,而且其他DNS服务器也是使用递归查询,都是老好人了…

这就是DNS域名解析工作的大致原理了。

3 DNS缓存

每次访问一个主机都要通过DNS服务去查IP地址好麻烦啊,实际上,为了改善时延性能并减少在因特网上到处乱窜的DNS报文,DNS广泛地采用了缓存技术

当访问过某个网站并得到其IP后,会将其域名(主机名)和IP缓存下来,下一次访问域名的时候,先查查缓存中有没有嘛,有就直接使用不需要去查了,提供了响应速度,当然了查询不到那还是得乖乖去找DNS求服务吧。

目前,计算机中DNS记录在本地有两种缓存方式,浏览器缓存操作系统(OS)缓存,在浏览器中访问的时候,优先访问浏览器缓存,未命中则访问OS缓存,再找不到就去找本地DNS服务器咯。

  • 浏览器缓存:指的是浏览器在获取网站域名的实际IP地址后会对IP进行缓存,减少延时,当然DNS缓存有一定的时间,过期就清除了。Google Chrome浏览器可以在地址栏输入chrome://net-internals/#dns,就可以看各域名的DNS缓存时间,很神奇,我输入这个网址时一个缓存也没有…。

  • 操作系统DNS缓存:存放在电脑里的缓存,windows系统下可以在cmd终端输入ipconfig/displaydns可以展示已经缓存的域名。ipconfig/flushdns 可以帮你马上清空已经缓存的记录,之所以要清空的话,因为有时因为一些恶意的病毒还是什么东西会存着错误的对应关系,需要清除。

4 DNS服务和防火墙原理

通过上面我们知道,每次访问一个域名,如果本机没有存在缓存的话,那就得借用DNS服务去查找对应的IP地址,没有IP地址是无法访问目标主机的。

通过提供错误的DNS服务就是早期防火墙的基本原理,相当于给用户一个错误IP地址,防止用户进行不良的访问。

比如说用户B想访问G网站(G网站的IP地址为8.8.8.8),B只有G网站的域名而没有IP地址,这时候B就只能求助于DNS服务,而防火墙就相当于立在用户B主机和DNS解析服务器中间的一堵大墙,拦截DNS服务,告诉B说G网站的地址是3.3.3.3,从而遏制用户B的不良访问,这种也称为DNS污染。

有时候我们访问比如全球最大的同性交友网站 www.github.com 不幸被墙,一个解决的方法就是手动将github网站的域名和IP地址添加到C:\Windows\System32\drivers\etc\hosts文件中,就像下面这样子:

1
2
192.30.252.131 github.com
185.31.16.185 github.global.ssl.fastly.net

关于hosts文件的话,hosts文件是一个没有拓展名的系统文件,用普通的记事本工具打开即可,hosts文件的作用就是将常用的网址域名和对应的IP地址的映射关系存放起来,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从hosts文件中寻找对应的IP地址,找到的话,就不再需要去寻求DNS域名解析服务咯,直接打开响应的网页,比如我们将github和他对应的IP地址写入hosts后,就不再需要DNS解析了,有时可以避免被墙。(但很奇怪,即使我将github和IP地址写入hosts后,有时候还是被墙)

而且hosts文件配置的映射是静态的,如果映射关系有所变化要手动修改,否则不能访问。

当然上面这个github网站配置是临时的,因为github的ip经常会变化,所以可以访问https://github.com.ipaddress.com查看最新的ip地址,将hosts文件中的github.com的ip地址改为最新的ip地址即可。(有时可能还需要先清除dns缓存,因为缓存可能有不正确的对应关系,导致得到不是最新的IP对应,访问失败)。

以上为自己的学习笔记,不当之处,请指正!

参考资料:

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

《网络是怎样连接的》

文章作者: luo
文章链接: https://luo41.top/2021/08/11/DNS基本工作原理/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 luo's Blog