DNS

一、名称解析&域名系统

通过文本你将会了解到什么是域名?什么是域名系统?什么是名称解析?为什么计算机处理数据报不用域名而用IP?为什么DNS需要采用分布式系统?

1、名称解析

IP网络的理念就是资源共享,而资源则位于一台台服务器上。人们通过IP地址来定位到自己所需的资源位置,但是随着资源的增加,服务器也会随着增加,所用的IP也会增加,这就造成了一个问题:IP地址不方便人类记忆。于是人类用域名来唯一标识一个IP地址,而域名能让人类更容易记住。而计算机处理数据报时只能识别IP地址,所以需要做域名到IP地址的转换。所以总结就是IP地址让计算机更方便的处理数据报,而域名是让人类更方便的间接记住某台主机的IP地址。

起初人们将IP和域名对应到一个文件中方便查找,这个文件就是Hosts。Hosts文件中记录着IP和对应的域名,使得计算机在查找时能够快速对应,这种查找过程叫做名称解析,也叫域名解析,是指将域名翻译成为IP的过程

2、域名系统

Hosts文件的缺点就是每次IP网络产生的新的IP资源时都需要修改该文件,而且是整个网络都需要添加这样一条IP到域名的对应信息,这样就显得非常不灵活。于是人们开发了一套系统,将Hosts文件放到一台特殊的服务器上,每次当用户输入域名时,计算机都会去该服务器上查找对应的IP是什么,拿到IP之后再去访问对应的资源,这样一个系统叫做域名系统[RFC 1034\1035]。

DNS(domain name system,域名系统)是一个联机分布式数据库系统,为用户和互联网应用提供核心的名称解析功能

3、域名系统重要性

随着DNS的应用,当今互联网已经将其作为基础通信能力的重要一环。DNS为许多应用和用户提供名称解析服务,有些应用会将资源放在云端,需要时则通过域名的方式去解析IP获取资源,用户也可以通过浏览器输入想要浏览的网址来访问资源,这些都是需要用到DNS,所以DNS在现代互联网中是非常重要的存在。

DNS为什么说是分布式数据库系统?理论上讲DNS完全可以只需要一台域名服务器,但是单台服务器的性能和处理速度跟不上全球使用互联网用户的访问请求,所以分布式这个概念就存在了,并且在很多领域都得以运用,DNS也不例外。而且一旦域名服务器出现故障,那么全球的用户就无法使用域名来访问其他计算机资源。所以对于一个提供庞大用户的服务,需要考虑冗余性性能等诸多因素。分布式数据库系统+层次树状结构命名法形成了DNS。

DNS所考虑的冗余性和性能因素分析:

  • DNS使用了分布式数据库系统,并采用了C/S架构(client/server),DNS让大多数的名称解析在本地进行(即本地解析,local resolve),仅有少量的解析需要通过互联网通信,因此DNS的效率很高。

  • 分布式数据库系统的特点就是即使单台服务器出现故障,也不会妨碍整个DNS的正常运行。

二、域名结构

经过多年的发展,DNS采用了层次树状结构(即等级命名)的命名空间,采用这种方法的优点就是方便管理和查询,任何一个连接在互联网上的主机或路由器都有唯一的名字,即域名(domain name)。域是命名空间中的一个可被管理的划分,域可以划分子域,子域还能划子域,这样就形成了顶级域、二级域、三级域等等。

1、层次树状结构命名语法

命名语法:

  • 每一个域名由标号和点构成。

  • 标号由英文字母和数字组成,每一个标号不超过63个字符(一般不超过12个),标号中除了 – 外不能有其他任何特殊符号,不区分大小写。

  • 低级别域名写在最左边,顶级域写在最右边。

  • 完整域名不超过255个字符。

2、层次树状命名分类与管理

一般被分为了顶级域名二级域名三级域名四级域名(一般出现在以国家顶级域名后),每级域由上一级的域名管理机构管理,而顶级域由ICANN管理。用这种方法可以使得每个域名在整个互联网范围内是唯一的,并且容易设计出一种查找域名的机制。

FQDN(Fully Qualified Domain Name,完全限定域名)其实就是标识了全球唯一的一台主机。google.com是二级域名,google公司有一台提供WWW服务的服务器,主机名就是www,那它的FQDN就是www.google.com,这种带有主机名+域名的完全展示形式就是FQDN。

1)根域名

根域名是域名系统中不可或缺的部分,但是通常可以省略不写。根域名在FQDN中以·表示,例如www.google.com.,www.apple.com.,email.bing.com.。

2)顶级域名

顶级域名包括三种:国家顶级域名(nTLD)、通用顶级域名(gTLD)、基础顶级域名。

  • 国家顶级域名:cn(中国)、us(美国)、jp(日本)、uk(英国)……共296个国家顶级域名

  • 通用顶级域名:com(商业公司)、net(网络服务机构)、org(非盈利组织)、edu(教育机构)、gov(政府机构)、mil(军事部门)、aero(航空运输)、asia(亚太)……等20个,值得注意的是ICANN在2011年通过了新通用顶级域名,任何个人、组织和机构都可以向ICANN申请新通用顶级域,新通用顶级域名被认为是真正的商业顶级域名。比如谷歌在2015年以2501万美元击败其他公司拿下了.app顶级域名,在比如.top也是属于新通用顶级域,一般用于个人和企业注册。

  • 基础结构域名:arpa用于反向域名解析。

3)二级域名

二级域名则是顶级域名下面的,由国家、企业/个人决定。如果是nTLD下面的二级域名则由国家规定,分为类别域名行政类域名;如果是gTLD下面的二级域名则由企业和个人决定。

  • 以nTLD规定类别域名有7个,分别是ac(科研)、com(工、商、金融)、edu(教育)、gov(政府)、mil(军事)、net(互联网服务提供机构)、org(非盈利)。以nTLD规定行政类域名有34个,分别是bj(北京)、sh(上海)、ah(安徽)……

  • 以gTLD为顶级域名的二级域名的命名是企业/个人决定的。例如google.com、bing.com、ietf.org、xdn.app ……

4)三级域名

如果不使用nTLD,那么一般到三级域名时已经可以等同于FQDN了;如果使用了nTLD,那么此时三级域名仍然不会定位到某一台服务器或主机。例如www.xxx.com,这就是一个三级域名,也可以是FQDN;email.xxx.com.cn则是四级域名,这也是一个FQDN。

通过等级命名形成的域名树,最终每台主机都会有一个全球唯一的域名,比如www.huawei.com、www.alibaba.com、www.google.com。

三、DNS Server

既然DNS是分布式数据库系统,那么就需要了解DNS分布式设计是怎样的。DNS采用了层次树状结构(即等级命名)的命名空间,这使得DNS采取了划分区的方式实现分布式设计,而分布式设计的最终效果大大提升了DNS的运行效率。

区是DNS非常重要的特征。一个服务器所负责管辖(即拥有权限)范围叫做区,各公司或组织根据具体情况来划分自己管辖范围的区。根就是最原始的一个区域,根区域分离出三个顶级区域,每个顶级区域又分离出更多的区域,如此往复将一个DNS区域划分成很多个小区域。规定每个区域都必须设置对应的权限域名服务器(Authoritative Name Server),权限域名服务器中的数据内容就是主机的域名到IP的映射

DNS不是以域为单位,而是以区为单位,区≤域,不可能大于域!左边的权限域名服务器为huawei.com,因为区和域是一样大的;右边权限域名服务器为huawei.com、www.huawei.com,因为这个域被分为了两个区。

1、根域名服务器

根域名服务器(Root Name Server)是最高层次及最重要的域名服务器。所有的根域名服务器都知道存有各种顶级域名的顶级域名服务器的域名和IP。根域名服务器是最重要的域名服务器,因为不管是哪一个本地域名服务器,若要对互联网上任何一个域名进行解析,只要自己无法解析,那么首先求助于根域名服务器。假定所有的根域名服务器瘫痪了,那么DNS就无法工作。

截至2016年,全球有588个地点安装了根域名服务器,但是这么多根域名服务器却只使用13个不同IP地址的域名,即a.rootservers.net、b.rootservers.net、……、m.rootservers.net每个域名下的根域名服务器由专门的公司或美国政府某个部门负责运营。虽然互联网的根域名服务器总共只有13台节点,但是不表示根域名服务器只由13台机器组成。实际上在互联网中是由13套装置构成这13组根域名服务器。每一套装置在很多地点安装根域名服务器(也称镜像根服务器),但都是使用同一域名。

由于一组根域名服务器采用了任播技术,因此当DNS客户向某个根域名服务器的IP地址发出查询报文时,互联网上的路由器就能找到离这个DNS客户最近的一个根域名服务器。这样不仅加快了DNS查询过程,也合理的利用了互联网的资源。

2、顶级域名服务器

顶级域名服务器负责管理所有的二级域名,当收到DNS查询请求时,就给出相应的回答(可能是最后的结果,也可能是下一步应当查找的域名服务器的IP地址)。顶级域名服务器有很多,例如专门存储所有.com的服务器,有专门存储.org的服务器等等。专门存储所有.com的服务器中的主机记录可能包括bing.com、google.com等,回复收到的DNS查询请求“你去问问bing.com权限域名服务器”。

3、权限域名服务器

权限域名服务器负责一个区的域名服务器,当一个顶级域名服务器不能给出最后的查询回答时,就会告诉发出查询请求的DNS客户,下一步应当找哪个权限域名服务器。如上图的区huawei.com和www.huawei.com各设有一个权限域名服务器。

4、本地域名服务器

本地域名服务器(或缓存域名服务器,Cache Domain Server)对DNS也非常重要,当一台主机发出DNS查询请求时,这个查询请求报文就发送给本地域名服务器。每一个ISP(/大学/大学计算机系)都可以拥有一个本地域名服务器。

如上图首选DNS服务器和备用DNS服务器的IP地址就是指本地域名服务器。本地域名服务器离用户比较近,一般不超过几个路由器的距离,当所要查询的主机也属于同一个本地ISP时,该本地域名服务器就能将所查询的域名转换成IP地址,而不需要去询问其他的域名服务器。

当使用桌面路由器时,桌面路由器会下发DNS服务器地址为内网PC的首选DNS服务器,桌面路由器收到PC的DNS查询请求后,因为本地没有存储或者没有能力存储任何域名记录时,会转发查询请求给ISP的本地域名服务器去查询。所以桌面路由器充当了转发的作用,也称为转发域名服务器。

如果企业环境下有AD域,那么一定有DNS服务器支持,这个DNS服务器的功能拥有本地域名服务器的功能(即缓存)和转发域名服务器的功能(即转发DNS请求)。

四、DNS查询方式

DNS被设计成联机分布式数据库系统,并采用C/S的架构。大多数的名称解析都在本地进行解析(resolve),仅少量解析需要在互联网上通信,因此DNS的效率很高。

域名解析流程:当一个应用程序进程需要进行域名解析时所经过的一系列动作。

应用进程获得目的主机的IP地址后即可进行通信。若本地域名服务器中没有该对应的映射,那么本地域名服务器就会向其他的域名服务器发出请求报文,这种过程直至找到能够回答该请求的域名服务器为止。DNS可以使用UDP,也可以使用TCP,只是使用UDP更为合理,使用UDP是为了节省开销

1、hosts文件

以前整个网络上只有数百台计算机,那时只需要使用hosts文件,列出所有主机名-IP地址的对应,只要用户输入一台主机名,计算机可以很快的把这台主机名转换成IP地址。但是随着互联网的发展,hosts文件已经不能满足需求了,产生了DNS。尽管有了DNS,计算机在查询域名时也是先会查询hosts文件中是否有对应条目,有就直接访问该域名对应的IP地址,没有则成为DNS客户,查询域名对应的IP地址。

2、迭代查询

迭代查询:是指发出多次DNS-query查询不同的DNS服务器,本地域名服务器向根域名服务器的查询。

迭代查询的特点:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,告诉本地域名服务器:“你下一步应当向哪个域名服务器进行查询”。然后让本地域名服务器进行后续的查询(而不是替本域名服务器进行后续的查询)。根域名服务器通常是把自己知道的顶级域名服务器的IP告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询。顶级域名服务器在收到域名服务器的查询请求后,要么给出所要查询的IP,要么告诉本地域名服务器下一步应当向哪一个权限域名服务器进行查询,本地域名服务器就这样进行迭代查询。最后知道了所要解析的域名的IP地址,然后把结果返回给发起查询的主机。

本地域名服务器默认采用迭代查询方法的查询图示:

第2~7步是迭代查询

Step1. 主机向本地域名服务器发起查询(www.epiol.top对应的IP地址是多少?)

Step2. 本地域名服务器不知道,默认开始执行迭代查询,向一个根域名服务器查询(www.epiol.top对应的IP地址是多少?)

Step3. 根域名服务器告诉本地域名服务器,下一次应该向谁询问(我不知道,但是我知道.top的顶级域名服务器的IP地址,你可以去问问他)

Step4. 本地域名服务器向顶级域名服务器发出查询(www.epiol.top对应的IP地址是多少?)

Step5. 顶级域名服务器告诉本地域名服务器,下一次应该向谁询问(我不知道,但是我知道epiol.top的权限域名服务器的IP地址,你可以去问问他)

Step6. 本地域名服务器向权限域名服务器发出查询(www.epiol.top对应的IP地址是多少?)

Step7. 权限域名服务器告诉本地域名服务器(www.epiol.top对应的IP地址是114.x.x.x)

Step8. 本地域名服务器把结果告诉给主机

其实本地域名服务器也可以发起递归查询,这取决于最初的查询请求报文的设置是要求使用哪一种查询方式。如果本地域名服务器采用递归查询方法的查询图示:

3、递归查询

递归查询:客户端发起一次DNS-query给DNS服务器,通过多次查找返回正确解析,主机向本地域名服务器的查询

递归查询的特点:如果主机本身hosts文件没有解析条目,以及所询问的本地域名服务器不知道被查询域名的IP地址,那么本地服务器就以DNS客户的身份,向其他根域名服务器继续发出查询请求报文(即替该主机继续查询),而不是让该主机自己进行下一步查询。因此递归查询返回的查询结果或者是所要查询的IP,或者是报错,表示无法查询到所需的IP。

第1、8步是递归查询

Step1. 主机向本地域名服务器发起查询(www.epiol.top对应的IP地址是多少?)

Step2. 本地域名服务器不知道,默认开始执行迭代查询,向一个根域名服务器查询(www.epiol.top对应的IP地址是多少?)

Step3. 根域名服务器告诉本地域名服务器,下一次应该向谁询问(我不知道,但是我知道.top的顶级域名服务器的IP地址,你可以去问问他)

Step4. 本地域名服务器向顶级域名服务器发出查询(www.epiol.top对应的IP地址是多少?)

Step5. 顶级域名服务器告诉本地域名服务器,下一次应该向谁询问(我不知道,但是我知道epiol.top的权限域名服务器的IP地址,你可以去问问他)

Step6. 本地域名服务器向权限域名服务器发出查询(www.epiol.top对应的IP地址是多少?)

Step7. 权限域名服务器告诉本地域名服务器(www.epiol.top对应的IP地址是114.x.x.x)

Step8. 本地域名服务器把结果告诉给主机

4、解析方式和服务器功能

正向解析:FQDN->IP

反向解析:IP->FQDN

主从DNS服务器:即slave自动更新同步master的配置,作为backup

缓存服务器:使用递归查询,将查询结果返回客户端,作为缓存查询的结果

转发服务器:当发现查询不是本机的时候则将请求转发出去

5、提高DNS查询效率

为了提高DNS查询效率,并减轻根域名的服务器的负荷和减少互联网上的DNS查询报文数量,在域名服务器中广泛使用了高速缓存(有时也称高速缓存域名服务器)。高速缓存用来存放最近查询过的域名以及从何处获得域名映射信息的记录。比如本地域名服务器查询过www.epiol.top的IP地址后,其他用户想要访问www.epiol.top,本地域名服务器不必再执行迭代查询,而是把之前查询之后的结果存入高速缓存,并返回缓存信息给用户即可。同时如果本地域名服务器缓存中有顶级域名服务器的IP地址,那么本地域名服务器在执行迭代查询时就不必向根域名服务器去查询,而是直接询问比如com、top、net等顶级域名服务器。这样就大大减轻了根域名服务器的负荷,而且能够使互联网上的DNS查询请求和回答报文的数量大大减少。

由于名字到地址的绑定并不经常改变,为保持高速缓存中的内容正确,域名服务器应为每项内容设置计时器并处理超过合理时间的项(例如每个项存放两天)。当域名服务器已经从缓存中删去某项信息后又被请求查询该项信息,就必须重新授权管理该项的域名服务器获取绑定信息。当权限域名服务器回答一个查询请求时,在响应中都指明绑定有效存在的时间值。增加此时间值可减少网络开销,而减少此时间值可提高域名转换的准确性。

不但在本地域名服务器中需要高速缓存,在主机中也很需要。许多主机在启动时从本地域名服务器下载名字和地址的全部数据库,维护存放自己最近使用的域名的高速缓存,并且只在从缓存中找不到名字时才使用域名服务器。维护本地域名服务器数据库的主机自然应该定期地检查域名服务器以获取新的映射信息,而且主机必须从缓存中删掉无效地项。由于域名改动并不频繁,大多数网点不需要花太多精力就能维护数据库地一致性。

五、DNS记录类型

六、系统&应用上的DNS缓存

1、系统DNS缓存

1)Windows

查看DNS缓存# ipconfig/displaydns

刷新DNS缓存# ipconfig/flushdns

2)Linux

查看DNS缓存# journalctl -u systemd-resolved.service > ./dns-cache.txt

2、应用DNS缓存

chrome浏览器:chrome://net-internals/#dns

firefox浏览器:about:config  network.dnsCacheExpirationGracePeriod

Edge浏览器:edge://net-internals/#dns