域名系统(domain name system)是一种将主机名、电子邮件地址、Web服务器名映射成IP地址的分布式数据库系统,通俗来说,DNS系统提供的是名字和地址的映射关系。
举个例子,比如顶级域名root(根服务器)下面有.cn域名。我假设我的邮件想访问12345678@abc.edu.cn,这是一个在中国的教育网下面的邮箱地址。我发送了这封邮件,那么这个邮件怎么根据这个地址找到真正的主机地址呢?靠得就是DNS域名系统。或者假如我想访问https://www.hao123.com 我在浏览器中输入了这个url并且点击了回车,那么自己的主机怎么知道这个网址的服务器对应的地址在那里呢?靠得也是DNS域名系统。这就是DNS系统的作用。
DNS查询有两种方式:
①迭代查询:当主机/名字服务器A向B查询,B将返回下一个DNS名字服务器的IP地址。
从上图来看,假设请求主机想给华盛顿大学发送消息,他并不知道华盛顿大学的IP地址,但是知道他的域名。于是首先它给本地域名服务器发送消息。本地域名服务器当然也不知道华盛顿大学的IP,于是他请求上级根域名服务器,请求上机帮他查询。但是根域名服务器也不知道,但是他知道应该查询的方向,于是它给他的下级edu教育域名服务器发送消息,请求他帮忙查询,以此类推,直到问到华盛顿大学自己的域名服务器,这时候终于知道了,于是一级一级的返回,直到本地域名服务器,然后再告诉主机。
总结来看,就是:“我不知道这个名字,但是我知道下一步应该怎么走,你可以问问下一个服务器”,这就是迭代查询的精髓。
②递归查询:当主机/名字服务器A向B查询,B将代表A执行查询请求并将响应结果返回给A。
不同于迭代查询,当请求主机把DNS请求给发送到本地名字服务器时候,本地名字服务器记住了DNS请求的请求域名,于是代执行这个请求,也就是请求方从主机变成了本地名字服务器。本地名字服务器把这个请求发送给中间名字服务器,中间名字服务器再次代替本地名字服务器去执行这个请求,直到请求到华盛顿的名字服务器,这样再层层返回,直到给本地域名服务器,再回给主机,这样主机就得到了想要的IP地址。
总结来看,就是“我不知道这个名字,那我帮你查询一下,然后把结果告诉你”。这不就是递归的思想吗?
每个主机都有一个DNS缓存表用于存放新查询的域名和IP地址的对应关系,并且有一定的生存期TTL,超时之后会被抛弃。这样就避免了每一次发送消息都需要DNS请求,提高了效率。
我们知道DNS协议是应用层协议,那么它是基于传输层的TCP还是UDP协议呢?实际上既有TCP也有UDP。DNS协议会同时占有TcP和UDP的53端口。
区域传送同步的时候,辅助域名DNS服务器会定时向主DNS服务器进行同步请求,以查询当前的转换表有无变动。那么这个区域传送数据同步的过程使用TCP,保证大数据同步请求的稳定可靠性。
单独进行一个域名解析的时候用UDP,因为返回内容不超过512字节,本身长度不长,如果不经过TCP三次握手,对于DNS负载要求也没那么高,使得DNS服务器请求响应更快。