🔊 本文收纳于 ⭐ CS-Wiki(Gitee 推荐项目,0.9k star), 欢迎 star ~ 😊git
为了保证网址的正常访问,域名解析协议(DNS)其实在背后作出了不少努力,本文将透彻讲解 DNS 协议的原理,了解咱们天天都在接触的网址究竟是怎么工做的。面试
在学习 DNS 协议以前,咱们先区分一下域名和 IP 地址这个两个概念:算法
www.baidu.com
不知道有没有同窗会混淆域名和 网址的概念,能够这样理解,网址里面含有域名。举个例子:www.gitee.com/veal98
就是一个网址,而www.gitee.com
就是域名
<u>因为 IP 地址具备不方便记忆而且不能显示地址组织的名称和性质等缺点</u>,人们设计出了域名,并经过域名解析协议(DNS,Domain Name System)来将域名和 IP 地址相互映射,令人更方便地访问互联网,而不用去记住可以被机器直接读取的 IP 地址数串。将域名映射成 IP 地址称为正向解析,将 IP 地址映射成域名称为反向解析。数据库
💡 DNS 协议可使用 UDP 或者 TCP 进行传输,使用的端口号都为 53。但 大多数状况下 DNS 都使用 UDP 进行传输。
❓ 那么域名由谁来规定和管理呢?不能是随便写吧?浏览器
全世界域名的最高管理机构,是一个叫作 ICANN (Internet Corporation for Assigned Names and Numbers)的组织,总部在美国加州。ICANN 负责管理全世界域名系统的运做。缓存
域名实际上是具备必定的层次结构的,从上到下依次为:根域名、顶级域名(top level domain,TLD)、二级域名、(三级域名)服务器
先来说讲顶级域名(TLD),即最高层级的域名。简单说,就是网址的最后一个部分。好比,网址www.baidu.com
的顶级域名就是 .com
。ICANN 的一项主要工做,就是规定哪些字符串能够看成顶级域名。截至 2015 年 7 月,顶级域名共有 1058 个,它们大体能够分红两类:网络
.com
、.net
、.edu
、.org
、.xxx
等等,共有 700 多个。.cn
(中国)、.io
(英属印度洋领地)、.cc
( 科科斯群岛)、.tv
(图瓦卢)等,共有 300 多个。固然,ICANN 本身不会去管理这些顶级域名,由于根本管不过来。想一想看,顶级域名有1000多个,每一个顶级域名下面都有许多批发商,若是每一个都要管,就太麻烦了。ICANN 的政策是,每一个顶级域名都找一个托管商,该域名的全部事项都由托管商负责。ICANN 只与托管商联系,这样管理起来就容易多了。举例来讲,.cn
国家顶级域名的托管商就是中国互联网络信息中心(CNNIC),它决定了 .cn
域名的各类政策。数据结构
而二级域名(Second Level Domain,SLD) 在通用顶级域名或国家顶级域名之下具备不一样的意义:app
yahoo.com
(商业组织一般使用本身的商标、商号或其余商业标志做为本身的网上名称,如 baidu.com
).com.cn
域名结构中,.com
此时是置于国家顶级域名 .cn
下的二级域名,表示中国的商业性组织,以此类推。三级域名是形如 www.baidu.com
的域名,能够当作是二级域名的子域名,特征为域名包含两个 .
。对于域名全部者/使用者而言,三级域名都是二级域名的附属物而无需单独费用。三级域名甚至不能称为域名,通常称之为域名下的 “二级目录”。
❓ 那么根域名在哪里呢?在层次结构中根域名不是最顶级的吗?域名中怎么没有看见它?
因为 ICANN 管理着全部的顶级域名,因此它是最高一级的域名节点,被称为根域名(root domain)。在有些场合,www.xxx.com
被写成 www.xxx.com.
,即最后还会多出一个点。这个点就是根域名。
理论上,全部域名的查询都必须先查询根域名,由于只有根域名才能告诉你,某个顶级域名由哪台服务器管理。事实上也确实如此,ICANN 维护着一张列表(根域名列表),里面记载着顶级域名和对应的托管商。
好比,我要访问abc.xyz
,也必须先去询问根域名列表,它会告诉我 .xyz
域名由 CentralNic 公司托管。根域名列表还记载,.google
由谷歌公司托管,.apple
由苹果公司托管等等。
因为根域名列表不多变化,大多数 DNS 服务商都会提供它的缓存,因此根域名的查询事实上不是那么频繁。
域名服务器是指管理域名的主机和相应的软件,它能够管理所在分层的域的相关信息。一个域名服务器所负责管里的分层叫做 区 (ZONE)。域名的每层都设有一个域名服务器:
下面这幅图就很直观了:
除了上面三种 DNS 服务器,还有一种不在 DNS 层次结构之中,可是很重要的 DNS 服务器,即本地域名服务器。下面咱们分别讲解这四种服务器都是用来干什么的 👇
上面咱们提到,ICANN 维护着一张根域名列表,里面记载着顶级域名和对应的托管商,其实根域名列表的正式名称是 DNS 根区(DNS root zone),<u>保存 DNS 根区文件的服务器</u>,就叫作 DNS 根域名服务器(root name server)。根域名服务器保存全部的顶级域名服务器的地址
因为早期的 DNS 查询结果是一个 512 字节的 UDP 数据包。这个包最多能够容纳 13 个服务器的地址,所以就规定全世界有 13 个根域名服务器,编号从 a.root-servers.net
一直到 m.root-servers.net
。其中 10 台设置在美国,另外各有一台设置于荷兰、瑞典和日本。
前面咱们说过,理论上全部域名的查询都必须先查询根域名,因此通常来讲全部的域名服务器都会注册一份根域名服务器的 IP 地址的缓存,用于在必要的时候向其发送请求。
按照根域名服务器管理顶级域名的逻辑,顶级域名服务器显然就是用来管理注册在该顶级域名下的全部二级域名的,记录这些二级域名的 IP 地址。
按照上面的逻辑,权限域名服务器应该是管理注册在二级域名下的全部三/四级域名的,但其实不是这样,若是一个二级域名或者一个三/四级域名对应一个域名服务器,则域名服务器数量会不少,咱们须要使用划分区的办法来解决这个问题。那么权限域名服务器就是负责管理一个“区”的域名服务器。
❓ 什么是区?怎样划分区呢?
区和域实际上是不一样的,区能够有多种不一样的划分方法。以百度为例,咱们假设有 fanyi.baidu.com
、ai.baidu.com
、tieba.baidu.com
这三个三级域名。咱们能够这样分区,fanyi.baidu.com
和 tieba.baidu.com
放在 baidu.com
权限域名服务器,ai.baidu.com
放在 ai.baidu.com
权限域名服务器中。而且 baidu.com
权限域名服务器和 ai.baidu.com
权限域名服务器是同等地位的,而具体怎么分区是百度公司根据域名多少、访问多少等状况去本身规定的。
画个图直观理解一下:
除了上面三种 DNS 服务器,还有一种不在 DNS 层次结构之中,可是很重要的 DNS 服务器,就是本地域名服务器(也被称为权威域名服务器)。本地域名服务器是电脑解析时的默认域名服务器,即电脑中设置的首选 DNS 服务器和备选 DNS 服务器。常见的有电信、联通、谷歌、阿里等的本地 DNS 服务。
每一个因特网服务提供者或一所大学,甚至一所大学中的各个系,均可以拥有一个本地域名服务器。当一台主机发出 DNS 查询请求时,这个查询请求报文就发送给该主机的本地域名服务器。本地域名服务器管理本地域名的解析和映射,而且可以向上级域名服务器进行查询。
那么具体本地域名服务器是如何向上级域名服务器转发查询请求的呢?
具体 DNS 查询的方式有两种:
所谓迭代就是,若是请求的接收者不知道所请求的内容,那么接收者将扮演请求者,发出有关请求,直到得到所须要的内容,而后将内容返回给最初的请求者。
👍 通俗点来讲,在递归查询中,若是 A 请求 B,那么 B 做为请求的接收者必定要给 A 想要的答案;而迭代查询则是指,若是接收者 B 没有请求者 A 所须要的准确内容,接收者 B 将告诉请求者 A,如何去得到这个内容,可是本身并不去发出请求。
通常来讲,域名服务器之间的查询使用迭代查询方式,以避免根域名服务器的压力过大。经过下面这两个图就能很好的理解了 👇
1)递归查询:
2)迭代查询:
上面讲解的是域名服务器之间的 DNS 查询请求过程,但实际上,每一个时刻都有无数网民要上网,那每次都去访问本地域名服务器去获取 IP 地址显然是不实际的。解决方法就是使用缓存保存域名和 IP 地址的映射。
计算机中 DNS 记录在本地有两种缓存方式:浏览器缓存和操做系统缓存。
1)浏览器缓存:浏览器在获取网站域名的实际 IP 地址后会对其进行缓存,减小网络请求的损耗。每种浏览器都有一个固定的 DNS 缓存时间,如 Chrome 的过时时间是 1 分钟,在这个期限内不会从新请求 DNS
2)操做系统缓存:操做系统的缓存实际上是用户本身配置的 hosts 文件。好比 Windows10 下的 hosts 文件存放在 C:WindowsSystem32driversetchosts
Windows 系统默认开启 DNS 缓存服务,服务名是 DNSClient
,能够缓存一些经常使用的域名。
使用命令 ipconfig/displaydns
能够查看电脑中缓存的域名。
⭐ 在浏览器中进行访问的时候,会优先查询浏览器缓存,若是未命中则继续查询操做系统缓存,最后再查询本地域名服务器,而后本地域名服务器会递归的查找域名记录,最后返回结果。主机和本地域名服务器之间的查询方式是递归查询,也就是说主机请求本地域名服务器,那么本地域名服务器做为请求的接收者必定要给主机想要的答案。
OK,将咱们上面所说的域名服务器之间的 DNS 查询请求过程和域名缓存结合起来,就是一个完整的 DNS 协议进行域名解析的过程。这里咱们以正向解析为例(域名解析成 IP 地址):
1)首先搜索浏览器的 DNS 缓存,缓存中维护一张域名与 IP 地址的对应表;
2)若没有命中,则继续搜索操做系统的 DNS 缓存;
3)若仍然没有命中,则操做系统将域名发送至本地域名服务器,本地域名服务器查询本身的 DNS 缓存,查找成功则返回结果(注意:主机和本地域名服务器之间的查询方式是递归查询);
4)若本地域名服务器的 DNS 缓存没有命中,则本地域名服务器向上级域名服务器进行查询,经过如下方式进行迭代查询(注意:本地域名服务器和其余域名服务器之间的查询方式是迭代查询,防止根域名服务器压力过大):
4)本地域名服务器将获得的 IP 地址返回给操做系统,同时本身将 IP 地址缓存起来
5)操做系统将 IP 地址返回给浏览器,同时本身也将 IP 地址缓存起来
6)至此,浏览器就获得了域名对应的 IP 地址,并将 IP 地址缓存起来
配合下图直观理解: