当前位置:蜗牛素材网>综合资讯>科技>正文

谈谈你对域名服务dns的理解:DNS域名解决原理你真的了解吗

人气:188 ℃/2024-04-28 21:16:14

DNS是Domain name system的简称,有些地方也称为Domain name server,它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。关于dns域名解析的大致过程很多人都知道,但有些细枝末节的东西容易遗忘,下面本人对DNS相关知识进行了一些总结和分析,希望能够帮助大家了解和熟悉DNS。

一、 DNS必懂基础

DNS主要是用于将域名解析为IP地址的协议,有时候也用于将IP地址反向解析成域名,所以DNS可以实现双向解析。

DNS可以使用TCP和UDP的53端口,基本使用UDP协议的53端口。

1、域的分类

域是分层管理的,就像中国的行政级别。

最高层的域是根域(root)".",就是一个点,它就像国家主席一样。全球只有13个根域服务器,基本上都在美国,中国一台根域服务器都没有。

根域的下一层就是第二层次的顶级域(TLD)了,那么它就是各省省长了。顶级域一般两种划分方法:按国家划分和按组织性质划分。

  • 按地区划分:.cn(中国)、.tw(台湾)、.hk(香港)。基本都是两个字母的。
  • 按组织性质划分:.org、.net、.com、.edu、.gov、.cc等。
  • 反向域:arpa。这是反向解析的特殊顶级域。

顶级域下来就是普通的域,公司或个人在互联网上注册的域名一般都是这些普通的域,如baidu.com。

2、主机名、域名、FQDN

我们以百度(www.baidu.com)和百度贴吧(tieba.baidu.com)来举例说明。

  • 域名

不论是www.baidu.com还是tieba.baidu.com,它们的域名都是baidu.com,严格地说是"baidu.com."。这是百度所购买的com域下的一个子域名。

  • 主机名

对于www.baidu.com来说,主机名是www,对于tieba.baidu.com来说,主机名是tieba。其实严格来说,www.baidu.com和tieba.baidu.com才是主机名,它们都是baidu.com域下的主机。一个域下可以定义很多主机,只需配置好它的主机名和对应主机的IP地址即可。

  • FQDN

FQDN是Fully Qualified Domain Name的缩写,称为完全合格域名,是指包含了所有域的主机名,其中包括根域。FQDN可以说是主机名的一种完全表示形式,它从逻辑上准确地表示出主机在什么地方。

例如www.baidu.com的FQDN是"www.baidu.com.",com后面还有个点,这是根域;tieba.baidu.com的FQDN是"tieba.baidu.com."。

3、域的分层授权

域是从上到下授权的,每一层都只负责自己的直辖下层,而不负责下下层。例如根域给顶级域授权,顶级域给普通域授权,但是根域不会给普通域授权。和现实中的行政管理不一样,域的授权和管理绝对不会向下越级,因为它根本不知道下下级的域名是否存在。

4、DNS解析流程

仍然以访问www.baidu.com为例。

(1).客户端要访问www.baidu.com,首先会查找本机DNS缓存,再查找自己的hosts文件,还没有的话就找DNS服务器(这个DNS服务器就是计算机里设置指向的DNS)。

(2).DNS服务器收到询问请求,首先查看自己是否有www.baidu.com的缓存,如果有就直接返回给客户端,没有就越级上访到根域".",并询问根域。

(3).根域看到是找.com域的,把到.com域的路(地址)告诉DNS服务器,让DNS服务器去找.com询问。

(4).DNS服务器去找.com,".com"一看是自己辖下的baidu.com,就把baidu.com的IP地址给DNS服务器,让它去找baidu.com。

(5).DNS找到baidu.com,baidu.com发现DNS服务器要找的是自己区域里的www主机,就把这个主机IP地址给了DNS服务器。

(6).DNS服务器把得到的www.baidu.com的IP结果告诉客户端,并缓存一份结果在自己机器中(默认会缓存,因为该服务器允许为客户端递归,否则不会缓存非权威数据)。

(7).客户端得到回答的IP地址后缓存下来,并去访问www.baidu.com,然后www.baidu.com就把页面内容发送给客户端,也就是百度页面。

最后要说明的是:

1.本机查找完缓存后如果没有结果,会先查找hosts文件,如果没有找到再把查询发送给DNS服务器,但这仅仅是默认情况,这个默认顺序是可以改变的。在/etc/nsswitch.conf中有一行" hosts: files dns"就是定义先查找hosts文件还是先提交给DNS服务器的,如果修改该行为"hosts: dns files"则先提交给DNS服务器,这种情况下hosts文件几乎就不怎么用的上了。

2.由于缓存是多层次缓存的,所以真正的查询可能并没有那么多步骤,上图的步骤是完全没有所需缓存的查询情况。假如某主机曾经向DNS服务器提交了www.baidu.com的查询,那么在DNS服务器上除了缓存了www.baidu.com的记录,还缓存了".com"和"baidu.com"的记录,如果再有主机向该DNS服务器提交ftp.baidu.com的查询,那么将跳过"."和".com"的查询过程直接向baidu.com发出查询请求。

5、 /etc/resolv.conf文件

这个文件主要用于定义dns指向,即查询主机名时明确指定使用哪个dns服务器。该文件的详细说明见Linux网络管理之:/etc/resolv.conf。

例如此文件中指定了"nameserver 8.8.8.8",则每当要查询主机名时,都会向8.8.8.8这台dns服务器发起递归查询,这台dns服务器会帮忙查找到最终结果并返回给你。

当然,在后文的实验测试过程中,使用了另一种方式指定要使用的dns服务器:dig命令中使用"@dns_server"。

二、DNS术语

1 、递归查询和迭代查询

例如A主机要查询C域中的一个主机,A所指向的DNS服务器为B,递归和迭代查询的方式是这样的:

递归查询:A --> B --> C --> B --> A

迭代查询:A --> B A --> C --> A

将递归查询和迭代查询的方式放到查询流程中,就如下图所示。(未标出Client指向的DNS服务器)

也就是说,递归的意思是找了谁谁就一定要给出答案。那么允许递归的意思就是帮忙去找位置,如A对B允许递归,那么B询问A时,A就去帮忙找答案,如果A不允许对B递归,那么A就会告诉B的下一层域的地址让B自己去找。

可以想象,如果整个域系统都使用递归查询,那些公共的根域和顶级域会忙到死,因此更好的方案就是把这些压力分散到每个个人定制的DNS服务器。

所以DNS的解析流程才会如下图。并且在客户端到DNS服务器端的这一阶段是递归查询,从DNS服务器之后的是迭代查询。也就是说,顶级域和根域出于性能的考虑,是不允许给其他任何机器递归的。

为什么客户端到DNS服务器阶段是递归查询?因为客户端本身不是DNS服务器,它自己是找不到互联网上的域名地址的,所以只能询问DNS服务器,最后一定由DNS服务器来返回答案,所以DNS服务器需要对这个客户端允许递归。因此,dns解析器(nslookup、host、dig等)所发出的查询都是递归查询。

2 、权威服务器和(非)权威应答

权威服务器(权威者)可以理解为直接上层域的DNS服务器。例如www.baidu.com这台主机的上层域是baidu.com,那么对www来说,它的权威服务器就是baidu.com这个域内负责解析的DNS服务器,而对于baidu.com这个主机来说,它的权威服务器是.com这个域负责解析的DNS服务器。

更具体的说,某域的权威服务器是可以直接查看该域数据(即区域数据文件)的DNS服务器,主、从DNS服务器都是权威服务器。

只有权威服务器给出的应答才是权威应答,否则就是非权威应答。为什么呢?因为一个域中所有的主机都是在DNS服务器中的区域数据文件中记录的,对于主机来说,它们的位置只有直接上层才知道在哪里。

因此如果解析www.baidu.com时要获得权威应答,应该将DNS指向baidu.com这个域内负责解析的DNS服务器。

只有权威服务器直接给出的答案才是永远正确的,通过缓存得到的答案基本都是非权威应答。当然这不是一定的,因为权威服务器给的答案也是缓存中的结果,但是这是权威答案。DNS服务器缓存解析的数据库时间长度是由权威服务器决定的。

3、DNS缓存

在Client和DNS服务器这些个人订制的DNS解析系统中都会使用缓存来加速解析以减少网络流量和查询压力,就算是解析不到的否定答案也会缓存。

但是要访问的主机IP可能会改变,所有使用缓存得到的答案不一定是对的,因此缓存给的答案是非权威的,只有对方主机的上一级给的答案才是权威答案。缓存给的非权威答案应该设定缓存时间,这个缓存时间的长短由权威者指定。

另外访问某个域下根本不存在的主机,这个域的DNS服务器也会给出答案,但是这是否定答案,否定答案也会缓存,并且有缓存时间。例如某个Client请求51cto.com域下的ftp主机,但是实际上51cto.com下面可能根本没有这个ftp主机,那么51cto.com就会给否定答案,为了防止Client不死心的访问ftp搞破坏,51cto.com这个域负责解析的DNS服务器有必要给Client指定否定答案的缓存时间。

4、主、从dns服务器

dns服务器也称为name server,每个域都必须有dns服务器负责该域相关数据的解析。但dns服务器要负责整个域的数据解析,压力相对来说是比较大的,且一旦出现问题,整个域都崩溃无法向外提供服务,这是非常严重的事。所以,无论是出于负载均衡还是域数据安全可用的考虑,两台dns服务器已经是最低要求了,多数时候应该配置多台dns服务器。

多台dns服务器之间有主次之分,主dns服务器称为master,从dns服务器称为slave。slave上的域数据都是从master上获取的,这样slave和master就都能向外提供名称解析服务。

5、 资源记录(Resource Record,RR)

对于提供DNS服务的系统(DNS服务器),域名相关的数据都需要存储在文件(区域数据文件)中。这些数据分为多种类别,每种类别存储在对应的资源记录(resource record,RR)中。也就是说,资源记录既用来区分域数据的类型,也用来存储对应的域数据。

DNS的internet类中有非常多的资源记录类型。常用的是SOA记录、NS记录、A记录(IPV6则为AAAA记录)、PTR记录、CNAME记录、MX记录等。

其中:(以下内容如果不了解,可以先跳过,在配置区域数据文件时回头来看)

(1).SOA记录:start of authority,起始授权机构。该记录存储了一系列数据,若不明白SOA记录,请结合下面的NS记录,SOA更多的信息见"子域"部分的内容。格式如下:

longshuai.com. IN SOA dnsserver.longshuai.com. mail.longshuai.com. ( 3h 1h 1w 1h )

第四列指定了"dnsserver.longshuai.com."为该域的master DNS服务器。

第五列是该域的管理员邮箱地址,但注意不能使用@格式的邮箱,而是要将@符号替换为点".",正如上面的例子"mail.longshuai.com.",其实际表示的是"mail@longshuai.com"。

第六列使用括号将几个值包围起来。第一个值是区域数据文件的序列编号serial,每次修改此区域数据文件都需要修改该编号值以便让slave dns服务器同步该区域数据文件。第二个值是刷新refresh时间间隔,表示slave dns服务器找master dns服务器更新区域数据文件的时间间隔。第三个值是重试retry时间间隔,表示slave dns服务器找master dns服务器更新区域数据文件时,如果联系不上master,则等待多久再重试联系,该值一般比refresh时间短,否则该值表示的重试就失去了意义。第四个值是过期expire时间值,表示slave dns服务器上的区域数据文件多久过期。第五个值是negative ttl,表示客户端找dns服务器解析时,否定答案的缓存时间长度。这几个值可以分行写,也可以直接写在同一行中使用空格分开,所以,上面的SOA记录可以写成如下格式:

longshuai.com. IN SOA dnsserver.longshuai.com. mail.longshuai.com. ( 1 3h 1h 1w 1h )

前三列是声明性的语句,表示"longshuai.com."这个域内的起始授权机构为第四列的值"dnsserver.longshuai.com."所表示的主机。第五列和第六列是SOA的附加属性数据。

每个区域数据文件中都有且仅能有一个SOA记录,且一般都定义为区域数据文件中的资源记录。

注意,资源记录的作用之一是存储域相关的对应数据,所以第4、5、6列表示的是该SOA记录所存储的相关值。

(2).NS记录:name server,存储的是该域内的dns服务器相关信息。即NS记录标识了哪台服务器是DNS服务器。格式如下:

longshuai.com. IN NS dnsserver.longshuai.com.

前三列仍然是声明性语句,表示"longshuai.com."域内的DNS服务器(name server)为第四列值所表示的"dnsserver.longshuai.com."主机。

如果一个域内有多个dns服务器,则必然有主次之分,即master和slave之分。但在NS记录上并不能体现主次关系。例如:

longshuai.com. IN NS dnsserver1.longshuai.com.longshuai.com. IN NS dnsserver2.longshuai.com.

表示主机"dnsserver1.longshuai.com."和主机"dnsserver2.longshuai.com."都是域"longshuai.com."内的dns服务器,但没有区分出主次dns服务器。

不少朋友搞不懂SOA记录,也很容易混淆SOA和NS记录。其实,仅就它们的主要作用而言,NS记录仅仅只是声明该域内哪台主机是dns服务器,用来提供名称解析服务,NS记录不会区分哪台dns服务器是master哪台dns服务器是slave。而SOA记录则用于指定哪个NS记录对应的主机是master dns服务器,也就是从多个dns服务器中挑选一台任命其为该域内的master dns服务器,其他的都是slave,都需要从master上获取域相关数据。由此,SOA的名称"起始授权机构"所表示的意思也就容易理解了。

(3).A记录:address,存储的是域内主机名所对应的ip地址。格式如下:

dnsserver.longshuai.com. IN A 172.16.10.15

客户端之所以能够解析到主机名对应的ip地址,就是因为dns服务器中的有A记录存储了主机名和ip的对应关系。AAAA记录存储的是主机名和ipv6地址的对应关系。

(4).PTR记录:pointer,和A记录相反,存储的是ip地址对应的主机名,该记录只存在于反向解析的区域数据文件中(并非一定)。格式如下:

16.10.16.172.in-addr.arpa. IN PTR www.longshuai.com.

表示解析172.16.10.16地址时得到主机名"www.longshuai.com."的结果。

(5).CNAME记录:canonical name,表示规范名的意思,其所代表的记录常称为别名记录。之所以如此称呼,就是因为为规范名起了一个别名。什么是规范名?可以简单认为是fqdn。格式如下:

www1.longshuai.com. IN CNAME www.longshuai.com.

最后一列就是规范名,而第一列是规范名即最后一列的别名。当查询"www1.longshuai.com.",dns服务器会找到它的规范名"www.longshuai.com.",然后再查询规范名的A记录,也就获得了对应的IP地址并返回给客户端。

CNAME记录非常重要,很多时候使用CNAME可以解决很复杂的问题。而且目前常用的CDN技术有一个步骤就是在dns服务器上设置CNAME记录,将客户端对资源的请求引导到与它同网络环境(电信、网通)以及地理位置近的缓存服务器上。关于CDN的简介,见下文CDN和DNS的关系。

(6).MX记录:mail exchanger,邮件交换记录。负责转发或处理该域名内的邮件。和邮件服务器有关,且话题较大,所以不多做叙述,如有深入的必要,请查看《dns & bind》中"Chapter 5. DNS and Electronic Mail"。

关于资源记录,最需要明确的概念就是它不仅仅用来区分和标识区域数据的类型,还用来存储对应的域数据。

近期即将推出系列文章,敬请关注:

《如何搭建安装DNS服务系统》

《如何开发自己的DNS服务系统》

如果您喜欢本文章,能够帮助你解决一些问题,请帮忙关注、点赞、转发,谢谢!

搜索更多有关“谈谈你对域名服务dns的理解:DNS域名解决原理你真的了解吗”的信息 [百度搜索] [SoGou搜索] [头条搜索] [360搜索]
本网站部分内容、图文来自于网络,如有侵犯您的合法权益,请及时与我们联系,我们将第一时间安排核实及删除!
CopyRight © 2008-2024 蜗牛素材网 All Rights Reserved. 手机版