介绍现在是互联网的世界,每个人都从各个网站获取各种资源和信息,通常我们只需要记住一个网站地址,至于后台的服务器这个网站在哪里,我们不需要关心。当我们的请求指向这个URL时,只需要等待请求被转发到该URL的后端服务器,并得到返回的处理结果即可。这种将网站名称解析为服务IP地址的服务就是DNS服务,它的全称是DomainNameSystem,即域名解析服务。那么DNS究竟是如何工作的呢?有聪明的朋友可能会说,这还不简单,搭建一个统一的服务器,把全世界所有域名对应的IP都存储起来,每次需要解析的时候从这个服务中获取。事实上,这是在互联网早期完成的。当时网站不多,域名维护成本不高,一开始也没有域名系统。ARPANET(TheAdvancedResearchProjectsAgencyNetwork)是互联网的技术基础,是第一个具有分布式控制的广域分组交换网络,也是最早应用TCP/IP协议的网络设施。在ARPANET网络中,每台主机都有一个数字地址,但是这个数字地址显然是反人类记忆方式的,所以科学家们希望给这些主机起一些好记的名字,那么就需要维护这些名字之间的关系和主机。这时,斯坦福研究院(现称为SRIInternational)接手了这项任务。他们维护了一个HOSTS.TXT的文本文件,在这个文件中描述了主机地址和主机名的关系。映射关系。如果有人要更新HOST文件,需要在上班时间致电SRI网络信息中心,信息中心的工作人员会将主机名和地址添加到HOSTS.TXT文件中。当然,这种操作对于少量的数据更新是可以的,但是如果数据量太大,就会出现问题。后来,一个叫ElizabethFeinler的人在SRI网络信息中心的基础上建立了WHOIS目录,用于检索有关资源、联系人和实体的信息,并提出了域名的概念。最初的维护是在单一的服务器上集中管理,但这种维护方式已经不能满足日益增长的网络需求,所以在1983年,PaulMockapetris在南加州大学创建了DNS系统,并以RFC882和1983年11月的RFC883相关原始规范。后来DNS经历了一系列的发展。1987年11月,RFC1034和RFC1035取代了1983年的DNS规范。之前我们也提到过DNS的作用。DNS最基本的功能就是将用户提供的域名转换成服务器的地址。比如我们现在有一个域名叫www.flydean.com,它对应的服务器IPv4地址是42.138.111.201,对应的IPv6地址是fe40::1024:ff:fe10:123f。DNS的工作是根据需要将www.flydean.com快速转换为IPv4或IPv6地址。这是DNS的第一个也是最重要的功能:提供域名解析服务。另外,在特定的应用场景中,域名后面对应的服务器IP可能会发生变化,因此DNS需要具备快速更新的功能,能够快速反映网络的变化,不影响特定用户的访问。这种操作对用户很友好,因为用户不需要知道底层服务器的变化,只需要知道要访问的域名即可。最后,现代网络应用一般都是分布式的,可能有多个worker节点,不同的worker节点可能部署在不同的地方。当用户访问一个域名时,为了提高访问速度,应该优先访问离用户最近的节点。这时,DNS就承担了优化网络访问的任务。它负责为用户提供最近的服务器节点。因此,在现代网络架构中,DNS扮演着越来越重要的角色。DNS的构成讲解完DNS的功能,我们再来看看DNS的构成。DNS作为一种域名服务,由域名空间和Nameservers组成。域名空间描述了域名的结构和命令规则,而名称服务器是解析域名的服务。接下来,我们将分别对其进行说明。域名空间域名空间域名空间,也叫域名空间,它是所有域名的集合。下面是维基百科上的域名空间示意图:/>从上图可以看出,域名空间其实是一个树状结构。每个节点或叶子节点都有一个标签和RR(esourcerecords记录与域名相关的有用信息)。域名本身由标签组成,右边是其父节点的名称。分开了。域名空间可以划分为多个子空间,每个子空间可以独立管理。这样的子空间称为区域。每个DNS域又可以划分为一个域,并且可能包含许多域和子域,具体取决于域管理器的管理选择。域名大家都很熟悉,但是对于域名的组成你可能不是很了解。其实域名是由标签组成的,每个标签之间用点连接,比如:www.flydean.com。每个标签都可以看作是域名的一级,最右边是顶级域名com,左边是右边域名的子域名,比如flydean是com的子域名,www是flydean.com的子域名,等等。总共可以有127个层次结构。每个标签可以包含0到63个字符,域名总长度不能超过253个字符。为什么是253个字符而不是255个?那是因为使用了2个字符来存储长度值。一般来说,域名的标签是用ASCII字符来表示的,通常用a-z、A-Z、0-9和连字符来表示,这种规则简称为LDH(letters,digits,hyphen)规则。在域名中,字符串是不区分大小写的,也就是说www.flydean.com和WWW.FLYDEAN.COM是等价的。请注意,标签不能以连字符开头或结尾,并且顶级域不能全是数字。有的朋友可能会问,不是,我怎么听说过中文域名呢?这是因为为了解决域名只能用ASCII编码的问题,ICANN采用了一个名为IDNA国际化域名的系统,用户应用程序(例如网络浏览器)可以通过该系统使用Punycode将Unicode字符串映射到有效的DNS字符放。什么是Punycode?Punycode是一种使用ASCII字符集来表示Unicode的编码方式。有兴趣的同学可以自行探索,这里不再赘述。名称服务器,也称为名称服务器,是用来解析域名的服务器。名称服务器是一种客户端-服务器架构,其中每个名称服务器发布有关域的信息并管理从属于它的任何域的名称服务器。这样的名称管理器形成一个层次结构。为了提高域名解析的效率,通常需要使用缓存来存储域名与服务器地址的对应关系,但有时我们需要更多的时效性场景和服务,于是出现了专门的名称服务器,它称为权威名称服务器。为什么叫权威域名服务器呢?这是因为权威名称服务器仅根据原始来源配置的数据对DNS查询提供答案,而不是根据查询其他名称服务器获得的结果。它是域名服务器查询的最后一站。如果权威名称服务器中有请求的记录,它会将请求的主机名的IP地址返回给发出初始请求的DNS解析器。DNS的工作流程上面介绍了这么多概念性的东西,大家可能有点迷糊。没关系,这里我们举一个具体的例子来观察DNS查询的整个过程。如果用户在浏览器中输入www.flydean.com访问本网站,由于用户输入的是域名,需要将域名解析为IP地址,以便发送后续的数据请求包。因为DNS本身是一种名称服务,所以需要客户端请求DNS。此客户端称为DNS解析器。一般来说,DNS解析器是嵌入在浏览器中的。当用户输入一个URL访问网络资源时,浏览器会自动调用DNS解析器来解析该URL。那么域名解析的第一站在哪里呢?域名解析的第一站是根服务器,也叫根服务器。域名解析请求首先由根服务器响应,但根服务器并不直接返回用户要解析的域名地址,而是返回顶级域名服务器(TLD)的地址根据用户访问的域名中的顶级域名。比如我们这里定义的要访问的域名是.com,那么根服务器就会返回.com的顶级域名服务器地址。有多少根服务器?全球只有13个根服务器IP地址,这是受早期技术原因的限制。在13个根服务器IP地址中,1个是主根地址,由ICANN管理。其他12个地址中,9个在美国,2个在欧洲,1个在日本。虽然只有13个根服务器IP,但是基于这13个IP地址搭建服务器集群,可以有效保证根服务器的稳定性。这样就不会出现根服务器无法访问导致的大规模网络错误。回到我们的解析过程,根服务器将.com顶级域名服务器的地址返回给DNS解析器,DNS解析器会再次发起对.comTLD的解析查询。.comTLD将再次将flydean.com的名称服务器地址返回给DNS解析器。DNS解析器再次向flydean.com的域名服务器发送请求。这里的域名服务器是权威域名服务器,因为这里是域名解析的最后一站,存放的是域名的真实IP地址。权威域名服务器获取www.flydean.com的真实IP地址并返回给DNS解析器。最后,DNS解析器将这个IP地址返回给浏览器,供后续的浏览请求使用。可见DNS解析是一个不断递归解析的过程,所以这样的解析器也称为DNS递归解析器。从上面的过程可以看出,每次域名请求都需要经过根域名服务器,所以根域名服务器的压力会非常大。为了解决这个问题,我们在使用过程中其实引入了DNS缓存。缓存的目的是将DNS数据放在离自己最近的地方,以促进数据的处理速度和显示效率。常见的DNS缓存包括浏览器缓存和操作系统DNS缓存。浏览器缓存是浏览器维护的DNS缓存,而操作系统DNS缓存是操作系统级别的DNS缓存。如果这两个缓存不存在,那么本地DNS客户端会将DNS查询发送给ISP(Internet服务提供商)内部的DNS递归解析器。对于ISP来说,它也会有DNS缓存,所以如果添加域名或者更改IP地址不会立即生效,而是需要一定的时间缓存才会失效或者刷新。DNS资源记录我们前面提到,DNS命名空间中的每个节点都由标签和资源记录(RR)组成。RR存储资源描述信息,并在收到DNS查询后返回。DNSRR由记录组成。下面是一条记录的结构:字段名描述长度[octets]NAME这条记录所属节点的名称是可变的TYPERR类型2CLASS类代码2TTLRR有效秒数4RDLENGTHRDATA字段长度2RDATA附加数据字段是可变的其中NAME是树中节点的完全限定域名。TYPE是记录类型。它指示数据的格式和用途。例如,A表示用于将域名转换为IPv4地址,NS表示哪些名称服务器可以响应DNS域查找,MX表示指定处理指定域邮件的邮件服务器在邮件中地址。在电子邮件地址中。RDATA是与特定类型关联的数据,例如地址记录的IP地址,或MX记录的优先级和主机名。DNS报文结构既然有DNS查询,就会有DNS查询的报文结构。DNS消息可以分为两种类型,查询消息和回复消息。每条消息由消息头和其他四个部分组成:问题、答案、权限和额外空间。表头负责控制其他4个部分。头部包含几个字段:Identification,Flags,Numberofquestions,Numberofanswers,Numberofauthorityresourcerecords(RRs)andNumberofadditionalRRs,如下表所示:是查询(0)还是回复(1)1OPCODE查询类型QUERY(标准查询,0),IQUERY(递归查询,1),还是STATUS(服务器状态请求,2)4AA是否权威服务器响应1TC表示消息被截断是因为太长1RD是否递归查询1RADNNS服务器是否支持递归1Z保留字段3RCODE响应码,可以是NOERROR(0),FORMERR(1,格式错误),SERVFAIL(2),NXDOMAIN(3、不存在的域名)4整个头部的标记域长度为16位,后面跟着4个16位,分别表示其他4部分的长度。综上所述,以上就是DNS的结构和DNS工作的基本过程。本文已收录于http://www.flydean.com/19-domain-name-service/最流行的解读,最深刻的干货,最简洁的教程,很多你不知道的小技巧等着你等你发现!欢迎关注我的公众号:《程序那些事儿》,懂技术,更懂你!
