DNS(Domain Name System,域名系统),是目前互联网上最不可或缺的服务器之一,我们在互联网从访问一个网站,到发送一封电子邮件,再到定位域中的域控制器,无时无刻不再使用着DNS为我们提供的服务,那为什么我们会需要这样一个服务那?带着这样一个疑问让我们先来认识一下什么是DNS吧
DNS最核心的工作就是域名解析,也就是把计算机名翻译成IP地址,这样我们就可以按照自己容易理解的方式来为一台主机或者一个网站取一个名字,其他人也就可以通过这个名字来访问我们的主机或者网站了,而不必去记住那些枯燥晦涩的IP地址,只有计算机才会才更容易理解那些地址,其实早在1969年互联网就诞生了,虽然早期的互联网的规模比较小,到70年代互联网也只有几百台主机而已,这样每台主机之间相互访问的就有一个比较简单的办法,就是每台主机利用一个hosts文件就可以把互联网上所有的主机都解析出来,hosts文件也计较简单,就是每一行记录一个主机对应的IP地址,在当时,这样一个解决方案是可以满足需要的,但是随着互联网规模的迅速膨胀,这样一个仅仅靠hosts文件来识别网络中主机的方案,显然是不合适的,就按保守的算互联网中有1亿台主机,什么的hosts文件能存放1亿条记录那?而且每时每刻这些记录都有可能变化,这也就是为什么现在会有需要的DNS服务的原因了。
早期互联网利用host文件来定位其他主机位置的方法其实就是完全分散的解析方案,每台主机都自己负责名称解析,而DNS的出现就仿佛在告诉世人,域名解析这个事由我一个人来解决,你们只要给我发请求我就回答这个域名的地址是什么,我们都知道,如果真有这样的一个DNS服务器的话,这个DNS服务器将会面临多大的流量压力,这个DNS服务器里面的解析条目会不会有极限,如何及时的更新这些解析条目,每一个问题都将使这台DNS服务器的陷入绝境,那DNS的设计者们是怎么样处理这些问题的那?
首先DNS采用的是分布式解决方案,具体是这样的,互联网管理委员会规定,域名的解释权都归根服务器所有,而根服务器通过委派,把com结尾的域名解析权委派给其他的DNS服务器,以后所有以com结尾的域名根服务器就都不负责解析了,而是由被委派的服务器负责解析,而且根服务器还把以net、org、edu、gov等等结尾的域名都一一进行进行了了委派,每个顶级域名都有预设的用途,例如com域名用于商业公司,edu域名用于教育机构,gov域名用于政府机关等等,这种顶级域名也被称为顶级机构域名。根服务器还针对不同国家进行了域名委派,例如把所有以cn结尾的域名委派给中国互联网管理中心,以jp结尾的域名委派给日本互联网管理中心,cn、jp这些顶级域名被称为顶级地理域名。每个被委派的DNS服务器同样使用委派的方式向下发展,例如新浪公司想申请使用sina.com域名,这时新浪公司就要向负责.com域名的DNS服务器提出申请,只要sina.com还没有被其他公司或个人使用,而且申请者按时足额缴纳了费用,负责.com域名的服务器就会把sina.com域名委派到新浪公司自己的DNS服务器,这时候你就知道一个域名对一家互联网公司来讲有多重要了吧,
让我们来看下面这张图,我想学过linux的同学就会觉得很熟悉,这不就是linux系统的目录结构吗,同时在公司待过一段时间的小伙伴也一样会觉得很熟悉,这不就是一家现代公司的组织架构吗,总经理就好比最上层的根,其他的部门经理就好比以com、net、org结尾的域名解析服务器一样,根域名服务器和总经理一样不负责任何一个具体的事务,只是把解析权授权给其他的域名服务器,
有了上面的认识以后,对于我们来了解一个域名具体的解析过程有着很大的帮助,一次DNS的工作过程是怎么样的那,首先DNS的查询类型分为递归查询和迭代查询;
递归查询:一次查询就得到最终的结果,通常是客户端与本地DNS服务器之间会使用递归查询。
迭代查询:有可能发生多次请求,且每次得到的结果有可能只是参考答案,通常是DNS服务器直接会使用迭代查询。
1)首先客户端怎样发起一个DNS查询请求,例如此时你在浏览器地址栏输入www.163.com敲回车之后,那么浏览器并没有发起DNS请求,而是先查询本机的DNS缓存中是否有该域名对应的地址,有的话直接访问该地址,没有的话查询本机的hosts文件,如果刚好你本机的hosts文件中有该域名对应的地址,那么此刻客户端是不会发起dns请求的,但是通常情况下本地的host文件是空的,所以就有了第二步
2)经历是前面两次本机内部的查询之后发现并没有该域名对应的IP地址,于是客户端正式向本地的DNS服务器发起DNS查询请求。
3)本地的DNS服务器收到这个查询请求后,会查询自己的缓存中以及自己的资源记录中是否有该域名对应的IP地址,如果在自己的缓存中以及本机的资源记录中依然找不到该对应的IP地址,此时本地DNS服务器会把请求发送给大名鼎鼎的13台根服务器中的一台,
4)其中一台根服务器收到这个请求后,会发送一个回复说,.com的域名解析服务我已经委派给.com这台域名服务器了,给你这个.com这台域服务器的地址,你去哪里查询吧,此时本地DNS服务器就进入了迭代查询。
5)本地DNS服务器收到这个参考答案后,就会将它收到来自客户端的DNS请求再次发往.com域名服务器。
6)负责.com域名解析服务器收到这个请求后,会回复说163.com的主区域服务器应该会知道答案,给你163.com主区域服务器的地址,你去它那里查询吧。
7)本地DNS服务器收到这个参考答案后,就会将它收到来自客户端的DNS请求再次发往163.com主区域服务器,当163.com这个主区域服务器收到这个DNS请求后,查询自己的缓存以及自己的资源记录,终于找到本区域内有一个www的主机。于是将www.163.com对应的ip地址回复给本地DNS服务器。
8)此时本地DNS服务器收到这个回复后,会将这条记录回复给客户端,同时将该记录写入到自己的缓存中,以便备查。
以上只是简单的介绍了一个DNS请求的大致过程,当然实际的过程中要比这复杂的多,同时除了正向解析:FQDNàIP的解析之外,还包括反响解析:IPàFQDN。欢迎来一起讨论,
从上面DNS请求的过程可以了解到,客户端发送一个请求后,本地的DNS服务器就需要对不断的迭代查询客户端发起的这个请求到底是哪个地址,直到找到这个域名所对应的IP地址是什么为止,那这台DNS服务器具体是怎么工作的那?以及这台DNS服务器都有哪些部分组成那?接下来,让我们先来认识一下DNS服务器都有哪些类型,
1)主DNS服务器:维护所负责解析的域内解析库服务器,有管理员维护
2)辅DNS服务器:从主DNS服务器或者其他DNS服务器哪里复制(也叫区域传送)一份解析库,从服务器通过每次检测解析库的版本号,没到一次刷新时间间隔就会通过全局传送或者区域传送从主服务器上面更新解析库。
3)缓存DNS服务器:通常就是用来存储网络上用户需要的网页和内容的网络服务器。而DNS缓存服务器即是存在DNS信息,它可以将它收到的DNS信息存储下来,并再将其提供给其它的用户进行查询,直到这些信息过期
4)转发器:只做转发
从上面DNS服务器的类型上可以看出,主DNS服务器承担着重要的工作,那究竟我们的主DNS服务器如何工作的那?其实DNS服务器是通过由众多资源记录(Resource Record)这个区域解析库来完成解析,任何一台主DNS服务器都是如此,无论是windows平台上面使用的域控制器,还是linux平台的bind都是通过这些资源记录来完成解析过程。以下就是这些资源记录的类型以及语法格式,每条资源记录的语法都遵循
name [TTL] IN rr_type value
SOA记录:Start Of Authority,起始授权记录;一个区域解析库有且仅能有一个SOA记录,而必须为解析库的第一条记录;
name: 当前区域的名字,例如“sina.com.”;
value: 有多部分组成
(1) 当前区域的主DNS服务器的FQDN,也可以使用当前区域的名字。
(2) 录前区域管理员的邮箱地址;但地址中不能使用@符号,一般用“.”替换。
(3) 主从服务协调属性的定义以及否定的答案的统一的TTL。
A记录:internet Address,作用,FQDN(完全格式域名) –> IP
name: 某主机的FQDN(完全格式域名);
value: 主机名对应主机的IPv4地址;
AAAA记录: FQDN(完全格式域名)–> IPv6
name: 某主机的FQDN(完全格式域名);
value: 主机名对应主机的IPv6地址;
PTR记录: PoinTeR,IP –> FQDN(完全格式域名),用于反向解析
name: IP,有特定格式,把IP地址反过来写,1.2.3.4,要写作4.3.2.1;而有特定后缀
in-addr.arpa.,所以完整写法为:4.3.2.1.in-addra.arpa.;
value: FQDN(完全格式域名);
NS记录: Name Server,专用于标明当前区域的DNS服务器
name: 当前区域的名字;
value: 当前区域的某DNS服务器的名字;
注意:一个区域可以有多个NS记录;
CNAME记录:Canonical Name,别名记录
name: 别名的FQDN(完全格式域名);
value: 正式名字的FQDN(完全格式域名);
MX:记录Mail exchanger,邮件交换器,用于定位该区域中的邮件服务器
name: 当前区域的名字;
value: 当前区域的某邮件服务器(smtp服务器)的主机名;
注意:一个区域内,MX记录可有多个;但每个记录的value之前应该有一个数字(0-99),表示此服务器的优先级;数字越小优先级越高;
以上的这些基础认识,对于我们配置windows下的DNS服务器,还是linux平台下bind都是必须要理解的,在下一篇博文中我会详细介绍linux平台下bind的正反向解析、主从同步、子域授权以及bind view,预知后事如何,且听下回分解。