不论你是否从事IT行业,和网络打交道是在所难免,比如,微信,抖音,网购比比皆是,当我们在浏览器里面输入一个域名,浏览器是如何定位到远程的服务器?其中会经历哪些过程?今天我们就来聊一聊其背后的原理?
一、什么是DNS?
其实,当用户在浏览器输入“example.com”进行访问时,浏览器会自动向 DNS服务器发送请求,DNS解析器将域名转换为IP地址,然后将 IP返回给浏览器,浏览器再访问该 IP,因此,整个过程中用户无需知道网站的 IP地址,却可轻松访问网站。如下图:
在上述描述中,有一个核心点是 DNS,那么,DNS是什么呢?
网上有很多公用的 DNS服务器,比如 Google的“8.8.8.8”,Cloudflare 公司的“1.1.1.1”等。
二、DNS工作原理
要了解 DNS的工作原理,需要从 DNS服务器和 DNS查询过程两个主要点来进行讲解。
在整个 DNS工作过程中,会经历 4种 DNS服务器,整个请求过程如下图:
1.DNS解析器
DNS解析器是一种服务器,负责整个域名转IP的过程,当收到客户端 DNS查询请求时,DNS解析器会根据“DNS查询类型”来查询对应的 IP地址。因此,递归 DNS解析器是域名转IP的总负责人。
2.根域名服务器
根域名服务器是将人类可读的域名转换为 IP地址的第一步,它管理着根域名,根域名用一个点(.)表示,因此,可以把根域名服务器理解成一个索引。
全球共有 13组根域名服务器,它们以英文字母“A到M”依序命名,网域名称格式为“A~M.root-servers.net”,具体信息如下表:
3.顶级域名服务器
顶级域名服务器(top-level domain,简写 TLD),托管着一些顶级域名(比如 .com,.io, .net),它是域名转IP的第二步,可以把顶级域名服务器理解成一个二级索引。
4.权威性域名服务器
权威性域名服务器(Authoritative nameserver),它是真实存储具体域名的服务器,比如(example.com,redis.io)等,它是域名转IP的最后一步,如果权威性域名服务器能查询记录,则返回 IP地址,否则做以下处理:
因此,可以把权威性域名理解成一个数据行。
需要注意:在某些情况下,主域名的权威名称服务器可能并不直接存储子域名的记录,而是委托给另一个专门管理子域名的名称服务器。比如,CNAME记录,子域名的记录指向另一个域名,因此,CNAME记录需要额外的查询步骤,以找到实际的 IP地址或进一步的 DNS记录。
DNS是一个分布式系统,内部的域名服务器以及其保存的域名是一个树状结构,如下图:
5.DNS查找过程
DNS 查找主要有以下 8个步骤:
上述 8个 DNS查找步骤可以返回“yuanjava.com”的 IP地址后,最后,浏览器使用该 IP地址向服务器发出 HTTP请求,获取对应的数据显示在网页中。
整个过程如下图:
三、DNS查询类型
在上述 DNS工作原理讲解时,我们提到了 DNS查询类型,那么 DNS查询类型有哪些呢?
通常来说,DNS查询类型有 3种:
1.递归查询
在递归查询中,DNS客户端要求 DNS服务器(通常是递归解析器)返回请求的资源记录或错误消息。如果递归解析器找不到记录,就会返回一个错误。
2.迭代查询
在迭代查询中,DNS客户端允许 DNS服务器返回它能提供的最佳答案。如果查询的 DNS服务器没有匹配的记录,它会返回一个指向更低层域名空间的 DNS服务器的引用,客户端再向引用地址发出查询。这个过程会继续,直到找到结果或出现错误或超时。
3.非递归查询
非递归查询通常发生在 DNS解析器客户端查询 DNS服务器时,DNS服务器能直接查到记录,要么因为它是该记录的权威服务器,要么因为该记录存在于它的缓存中。通常,DNS服务器会缓存 DNS记录以减少带宽消耗和上游服务器的负载。
DNS解析器通过组合上述 3种查询方式,可以优化 DNS解析过程和缩短传输距离。在理想情况下,可以使用缓存的记录数据,从而使 DNS 域名服务器能够返回非递归查询。
四、DNS查询实例演示
为了更好的演示域名的整个 DNS查询过程,本文通过对我的技术博客www.yuanjava.com这个域名进行 DNS解析,使用到的工具有dig命令,然后使用 3种方式进行解析:
在进入正式的解析之前,我们先来了解下 dig指令。
dig(Domain Information Groper,域名信息搜索器)是一个用于查询 DNS信息的命令,dig可以执行各种类型的 DNS查询,并显示详细的响应信息,包括查询的解析过程、响应时间、返回的记录等。
dig的基本语法:
dig @server name type
2.使用示例
(1) 查询记录
dig yuanjavacom # 返回 yuanjavacom的 IPv4地址记录dig yuanjavacom # 返回 yuanjavacom的IPv6地址记录dig yuanjavacom # 返回 yuanjavacom的邮件交换记录dig @ yuanjavacom #指定 Google公共的 dig @ yuanjavacom #指定 cloudflare公共的
(2) 结果返回
dig的输出通常包含以下 6个部分:
讲解完 dig指令后,我们正式进入 DNS解析的实战演习:
3.使用指定的DNS服务器
首先,使用 13台根域名服务器的任意一台进行解析,这里以”198.41.0.4”为例,指令如下:
dig @ yuanjavacom
指令执行如下图:
因为根域名服务器给不了”yuanjava.com”的 IP地址,所以执行结果中没有 ANSWER SECTION,但是返回了.com对应的顶级域名服务器的 IPv4和 IPv6,选择第一台顶级域名服务器的IPv4,继续解析,指令如下:
dig @ yuanjavacom
指令执行如下图:
顶级域名服务器也给不了”yuanjava.com”的 IP地址,但返回了权威服务器的 IP地址,选择第一台权威域名服务器的 IP,继续解析,指令如下:
dig @ yuanjavacom
指令执行如下图:
最后,权威域名服务器查到了域名对应的 IP,到此,DNS域名解析的整个过程我们就通过手动的方法进行了演示。
4.使用公开的DNS服务器
使用公开的 DNS服务器,会屏蔽内部域名服务器查询过程,最终给出 IP地址,分别执行下面 2个指令:
dig @ yuanjavacomdig @ yuanjavacom
指令执行结果截图如下(截图中没有 Additional部分):
5.使用运营商的DNS服务器
除了上述两种方式,我们还可以使用运营商自动配置的 DNS服务器,比如下面为家庭 wifi网络的示例截图:
五、DNS缓存
因为一个域名对应的 IP地址变动的频率很低,所以,可以将域名和 IP的映射关系缓存起来并且设置一定的失效时间,从而提高数据请求的性能和可靠性。那么,DNS缓存有哪些呢?
1.浏览器的DNS缓存
在 Chrome浏览器中,可以通过chrome://net-internals/#dns 查看 DNS缓存的状态,如下图:
2.操作系统的DNS缓存
除了浏览器会设置 DNS缓存外,在每一层的域名服务器也会设计对应的 DNS缓存,缓存查询的过程如下:
本网站的文章部分内容可能来源于网络和网友发布,仅供大家学习与参考,如有侵权,请联系站长进行删除处理,不代表本网站立场,转载者并注明出处:https://www.jmbhsh.com/shenghuozixun/35559.html