DNS自述:我是如何为域名找到家的
<p>对于互联网一代的我们,一出生就学会使用电脑。当我们对着浏览器地址栏输入<code>www.baidu.com</code>的时候,百度的首页就出现在面前。但你可曾想过,为什么我们输入<code>www.baidu.com</code>就可以弹出百度首页?在这弹指一挥间,到底发生了什么?今天就让我带你来揭开这背后发生的一切。</p><p>当我们开始之前,我们需要明白:虽然我们每次访问网页,都是使用域名的方式(例如:www.baidu.com)。但对于计算机来说,它最终访问的是域名对应的IP(例如:10.102.201.253)。所以今天我们要讲的这一切,其实就为了说清楚一件事情:DNS是如何为域名找到对应的 IP 地址的。</p>
<h2 id="浏览器dns缓存">浏览器DNS缓存</h2>
<p>当我们在浏览器地址栏输入域名后,浏览器首先会去其本身的 DNS 缓存中查找是否有对应域名的记录。如果有,那么直接访问对应的服务器。</p>
<p><img src="https://www-shuyi-me.oss-cn-shenzhen.aliyuncs.com/15772834350592.jpg" alt="" loading="lazy"></p>
<p>不同浏览器会设置不同的 DNS 缓存时间,一般来说是 2-30 分钟之间。如果当你修改了系统 DNS 缓存后,发现访问还是没生效,你可以尝试清除下浏览器的 DNS 缓存。</p>
<h2 id="系统dns缓存">系统DNS缓存</h2>
<p>当浏览器在其自身的缓存中找不到对应域名的记录时,其将会去系统的 DNS 缓存中寻找记录。在 Windows 系统中,DNS 缓存信息存储在 <code>C:/windows/system32/drivers/etc/hosts</code> 中。而在 Mac OSX 系统中,DNS 缓存信息存储在 <code>/etc/hosts</code> 文件中。</p>
<p>但无论在哪个系统,该文件的格式都是域名的 IP 地址的映射。每一行是一个映射,前面是域名对应的 IP 地址,后面是对应的域名。</p>
<pre><code>127.0.0.1 www.baidu.com
192.168.1.1 www.google.com
</code></pre>
<p>如上面的范例所示,其设置了当我们访问 <code>www.baidu.com</code> 时,我们直接访问 <code>127.0.0.1</code> 这台机器。而当我们访问 <code>www.google.com</code> 时,我们直接访问 <code>192.168.1.1</code> 这台机器。</p>
<p>所以很多时候,当我们在本地调试时我们可以设置任意的域名,只要该域名对应的 IP 存在对应的服务即可。例如像我这样喜爱写文章的程序员,我可以写这样设置一个域名的映射:</p>
<pre><code>127.0.0.1 top-writer.google.com
</code></pre>
<p>当你的机子上访问 <code>top-writer.google.com</code> 的时候,请求自然就会转发到本机上,即使你并不是这个域名的所有者。</p>
<h2 id="本地dns服务器">本地DNS服务器</h2>
<p>如果在系统 DNS 也找不到域名的记录,那么浏览器就会去本地的 DNS 服务器(LDNS)上寻找该域名的记录。在这里的 LDNS 一般是指本机所设置的 DNS 服务器地址。例如在我的电脑上,其对应的 DNS 地址为:10.xxx.xxx.253。那么浏览器就会去这个 DNS 服务器上寻找域名对应的记录。</p>
<p><img src="https://www-shuyi-me.oss-cn-shenzhen.aliyuncs.com/15784747169388.jpg" alt="" loading="lazy"></p>
<p>如果在 LDNS 服务器上找到了记录,那么就直接返回就可以。但如果还是没找到记录,那么就得进一步深入查找了。</p>
<h2 id="根dns服务器">根DNS服务器</h2>
<p>当 LDNS 服务器还是招不到域名对应的记录时,那么其就会去根 DNS 服务器去寻找域名对应的记录。根 DNS 服务器全球只有 13 台,所以在 LDNS 服务器建立的时候,其会写死一个根 DNS 服务器的 IP 地址列表。</p>
<p>但实际上根 DNS 服务器并不存储所有域名的信息,其只存储顶级域名的解析记录。即对于我们访问的域名 <code>www.baidu.com</code> 来说,根 DNS 服务器并不能告诉我们 <code>www.baidu.com</code> 这个域名对应的 IP 是多少,它只能告诉我们 <code>.com</code> 这个顶级域名应该找哪个 DNS 服务器解析,然后把对应顶级 DNS 服务器的 IP 地址告诉我们。</p>
<h2 id="顶级dns服务器">顶级DNS服务器</h2>
<p>我们访问域名 <code>www.baidu.com</code> 后,根 DNS 服务器告诉我们可以找对应的 <code>.com</code> 顶级 DNS 服务器解析。但实际上顶级 DNS 服务器只能解析二级域名的地址,即它只能告诉你:<code>baidu.com</code> 这个域名应该找哪台 DNS 服务器去解析。</p>
<p>这里我们从顶级 DNS 服务器解析 <code>baidu.com</code> 这个域名得到的 DNS 服务器,其实就是你买域名时用于管理解析的服务器。而且也是你设置域名 NS 记录时,设置的 DNS 服务器的地址。</p>
<p><em>注:关于什么是 NS 记录,可以在公众号后台回复「域名解析类型」,查看我写的另一篇文章。</em></p>
<h2 id="域名dns服务器">域名DNS服务器</h2>
<p>上一步我们知道 <code>baidu.com</code> 这个顶级域名应该找哪台 DNS 服务器去解析,其实这台 DNS 服务器就是我们购买域名时设置的用于解析的 DNS 服务器。在这台 DNS 服务器上,我们通过设置一条 A 记录(A 记录就是域名到 IP 地址的映射)就可以让某个域名与 IP 联系起来。</p>
<p>当浏览器去请求 <code>baidu.com</code> 对应的 DNS 服务器时,其会尝试寻找解析类型为 A ,并且主机名为 <code>www</code> 的解析记录。如果找到了,那么就返回对应的 IP 地址。否则就报告 DNS 解析错误,其不会再去其他 DNS 服务器上寻找了。</p>
<h2 id="总结">总结</h2>
<p>看到这里,相信大家都清楚了 DNS 寻址的整个流程了。总的来说,DNS 寻址的顺序为:</p>
<ul>
<li>浏览器 DNS 缓存</li>
<li>系统 DNS 缓存</li>
<li>本地 DNS 服务器</li>
<li>根 DNS 服务器</li>
<li>顶级 DNS 服务器</li>
<li>域名 DNS 服务器</li>
</ul>
<p>如果到最后还是找不到解析记录,那么就直接报域名解析错误。在这个过程中,我们还可以学到两个重要的知识点,即:</p>
<p><strong>第一,域名 DNS 服务器就是 NS 记录设置的地址。</strong> 我们在域名服务商可以设置 NS 记录,将域名托管给另外一台 DNS 服务器进行解析,这个时候顶级 DNS 服务器注册的域名 DNS 服务器,就是我们 NS 记录配置的值。</p>
<p><img src="https://www-shuyi-me.oss-cn-shenzhen.aliyuncs.com/15784746065902.jpg" alt="" loading="lazy"></p>
<p>上图我为 doc.csyimg.com 子域名设置了一条 NS 解析记录。那么当我访问 doc.csyimg.com 的时候,当解析到顶级 DNS 服务器时,顶级 DNS 服务器应该是返回 csyimg.com 对应的域名 DNS 服务器地址。接着浏览器访问 csyimg.com 对应的域名 DNS 服务器时,发现是要访问 doc.csyimg.com 域名,因为设置了 NS 记录,于是告诉它去 ns.baidu.com DNS 服务器上去寻找对应的解析记录。</p>
<p><em>注:这里说的找 ns.baidu.com 解析,其实应该是该域名对应的 IP,这里为了表述方便,没有做过多解释。</em></p>
<p><strong>第二,域名最终得到的 IP 地址,是通过域名的 A 解析类型。</strong> 通过上面的解释,你会发现无论怎样设置,最终都会有一台 DNS 服务器去解析该域名。而在该 DNS 服务器上,必然存在一条解析类型为 A 的解析记录。如下图所示,我设置的是一条针对 hello.csyimg.com 域名的 A 记录,其指向了 192.168.1.1 这个 IP。如果最终找不到 A 记录,那浏览器就会报 DNS 解析错误。</p>
<p><img src="https://www-shuyi-me.oss-cn-shenzhen.aliyuncs.com/15784746169914.jpg" alt="" loading="lazy"></p>
<p><strong>第三,域名是由:主机名.二级域名.顶级域名.根域名组成的。</strong> 例如:www.baidu.com 中,<code>www</code> 就是主机名,<code>.baidu</code> 就是二级域名,<code>.com</code> 就是顶级域名。而在 <code>.com</code> 后面省略的 <code>.</code> 就是根域名。</p>
<p>通过这两个知识点,你会发现域名的解析类型与 DNS 的解析原理息息相关的。如果你感兴趣可以在公众号后台回复「域名解析类型」,查看我写的另一篇文章。</p>
</div>
<div id="MySignature" role="contentinfo">
<div id="sign">
<img style="width: 80%; margin: 50px" src="https://images.cnblogs.com/cnblogs_com/chanshuyi/1943043/o_220725133529_%E5%BE%AE%E4%BF%A1%E6%90%9C%E4%B8%80%E6%90%9C-%E6%A0%91%E5%93%A5%E8%81%8A%E7%BC%96%E7%A8%8B.png" alt="扫描关注微信公众号">
</div><br><br>
来源:https://www.cnblogs.com/chanshuyi/p/head_first_of_dns.html
頁:
[1]