- 基本介绍
DNS是应用层协议,基于传输层的UDP协议,端口号为53
提供的基本功能有:- 主机到IP的映射
- 主机别名
- 邮件别名
- 负载均衡
其实在我们看来,DNS协议像是一个黑盒子,请求传过去对应的域名,就会返回回来域名解析出来的IP地址
- 基本实现
1.0版本
因为DNS协议主要的工作是域名到IP的一个映射,所以我们现在假设一下,只有一台DNS服务器,里面包含了所有的域名到IP的一个映射,用户的请求到会发到这个DNS服务器。
优点: 设计简单,非常具有吸引力
缺点: 不适合当今的因特网,因为因特网的拥有数量巨大的主机数量,而且这种集中式的设计的问题包括:
- 单点故障:如果该DNS服务器崩溃,整个互联网都会随之瘫痪
- 通信容量:这台DNS服务器处理的请求可能有上亿个
- 远距离的集中式数据库:如果这台DNS服务器在北极,请求从南极发来,必须跨越一个地球才能处理,有比较长的时延
- 维护:数据库大,需要频繁更新
2.0版本
分布式、层次数据库
因为一台DNS服务器根本满足不了实际的需求,那么我们就多布置几台服务器,但是如何去布置呢?按照什么形式布置?
为了更好处理扩展,需要大量的DNS服务器,他们以层次方式阻止,并且分布到世界各地,没有一台DNS服务器拥有因特网上所有的主机的映射。
总的来说,有三种DNS服务器:
- 根DNS服务器
- 顶级域DNS服务器
- 权威DNS服务器
其实还有一个本地DNS服务器,由ISP进行布置,一般的,学校、大型公司都会布置一台本地DNS服务器,一般主机都是将请求发往本地DNS服务器,再由本地DNS服务器去查询
由图我们可以看到,获得一个主机到IP映射需要四次查询报文,四份回到报文,这样是及其复杂而且有长时延的,所有
3.0版本
DNS缓存
主要目的:改善时延性能并能减少在互联网上到处传输DNS报文数量
缓存就是:在一个请求中,当某DNS服务器接收到一个DNS回答,就能将映射缓存到本地存储器中
但是这个缓存不能一直存在本地存储器中,要不然慢慢的,某台服务器就会拥有所有的映射,就会出现版本1.0的问题,所以,一般DNS服务器在一段时间后(一般是两天)将缓存信息丢弃
经过了三个版本的迭代更新,就出现了现在我们所用到的一个体系
我们就假设一下,在自己的电脑里面请求百度网页需要经历的过程:
- 主机访问www.baidu.com,这个请求会被发送到本地DNS服务器(①)
- 本地DNS服务器就回去缓存中找,有没有有关www.mail.baidu.com的缓存或者com的缓存,发现没有之后
- 请求根DNS服务器(②),说我需要顶级域名为com的DNS服务器的IP,然后根DNS服务器返回com的DNS服务器的IP为111.111.111(????)
- 本地服务器拿到这个IP之后,就去请求com DNS服务器(④),说:我需要要baidu.com的IP地址,com DNS服务器就会返回baidu.com的IP地址为222.222.222(????)
- 拿到www.baidu.com之后,就要去访问这个域名下的mail,本地DNS服务器就会发一个请求给222.222.222(⑥),说我需要mail的IP地址,那么baidu.com服务器就会返回333.333.333(⑦)
- 因为本地DNS服务器已经拿到了mail.baidu.com的IP地址,就会返回给主机(⑧),这样主机就可以直接访问444.444.444的首页了,这个时候本地DNS服务器还会缓存根域名、com的域名、www.baidu.com的域名www.mail.baidu.com的域名,保存到本地,这样,下次别人需要访问百度就可以直接返回IP了