DNS服务到底是怎么工作的

  对于我们平时访问网页, www.baidu.com, DNS服务器就像是黑盒一般, 我们向其输入地址, 它会向我们返回地址对应的IP. 而后我们通过IP访问对方的服务器 (如果不知道为什么需要IP才能访问, 请恶补计算机网络相关知识, 下面从 “网站工作原理” 开始也不要看了), 这是离我们最近的一层缓存DNS服务器所做的事情, 看似简单的功能, 其内部实现全然不是那么容易. 这一台DNS可是很”忙”的.

假设我们现在的电脑是一台DNS服务器

而目前我们没有缓存任何网址的信息, 用户请求了www.163.com这样的域名, 我们该怎么做?

![DNS查找过程][4] 这是来自[权威 DNS 和递归 DNS][2]的一张图, 我们现在要做的就是类似Local DNS这一台 服务器所做的动作.

大致过程是, 我们先向Root DNS服务器请求, Root DNS返回了TLD DNS的地址, 我们继续请求, 最终在Domain Auth-DNS上获得了结果.

  我们首先要要获得Root DNS的地址, 向其发出查询请求. Root DNS 地址不是随便来的, 从[named.root][5]获得.

![rootdns][14]

而后, 我们可以借助dig这个简单的小工具查找DNS服务器, @指定这次查询所使用的DNS服务器.

![dig][6]

图片中没有ANSWER SECTION, 但是有AUTHORITY SECTION. 这次响应的意思就是, 我Root DNS不知道你的这个域名对应的地址, 但我知道com后缀的域名对应的地址, 你可以向这些服务器查看, 也就是AUTHORITY SECTION中的结果, 但是你也一定发现了 类似e.gtld-servers.net这样的, 也是域名, 我们还不知道它的地址.

![dig][7]

好的是在AUTHORITY SECTION之后有一个ADDITIONAL SECTION, 指明了DNS服务器的地址, 我们可以利用这一地址继续查询.

![dig][8]

这次的查询同样没有得到想要的结果, 我们又获得了一批DNS服务器的地址. 这帮服务器能解决163.com.后缀的DNS查询. 需要继续查看ADDITIONAL SECTION部分了.

![dig][9]

![dig][10]

最后一次查询, 我们终于得到了一个ANSWER SECTION, 但是它是CNAME类型, 也是 一个地址, 我们需要继续查看这个地址所对应的IP, 是不是很难过, 这意味着我们还要 将上面流程重走一遍来查www.163.com.lxdns.com.的IP地址, 

这里如果你不想再一遍遍手动查询了, 可以使用dig +trace www.163.com.lxdns.com. 再查几次就能查到结果了.

![dig][11]

我就问你, 对于一个官网网址, DNS服务器都这么辛苦, 它怎么可以不缓存!!

如何得知我们的DNS服务器地址

上面描述的, 是一台缓存DNS的工作过程, 与我们日常生活相关的也就是向它发送一个 类似www.163.com的地址, 而后获得了网站真正的IP. 因为我们查询DNS服务在前, 访问该网站在后. 这一前一后完全是两个世界, 一个网站无论如何也无法得知我们的 DNS服务器地址.

培训中, 介绍了这么一个网址 http://nstool.netease.com/.

![][15]

通过nstool这个网页, 可以获取本机所使用的DNS服务器.

那为什么会有[nstool][3]这的网站呢? 除非, 除非这个网站后台同样提供了DNS的解析服务, 在我们访问网站前就获得了 我们的DNS服务器地址, 而后只是简单的做一次应答操作.

我所理解的工作原理

看到奇特的网站了, 首先要开F12以示尊敬. ![nstool][12] 可以看到, 网页中嵌套了一个iframe, iframe中有一个奇怪的网址.

当你请求该网页时, 发生了两次请求:

  1. 首先请求http://nstool.netease.com/, 获得了一个带有iframe的HTML页面.
  2. 有了iframe之后, 你所做的就是, 再发一次请求, 这次的请求, 为我们带回了DNS服务器的地址.
  • 缓存DNS服务器的地址是何时被远端得知的呢?

第一次请求, 就是普通的HTTP请求, 远端是无法得知我们的DNS服务器的, 第二次请求 带回来的DNS服务器地址. 所以, 一定是在第一次请求, 第二次请求之间, 网站得到了我们的 DNS服务器地址.

  • 缓存DNS服务器到底是如何被远端所得知的呢?

相信你也一定记得上面一长条的http://only-845604-218-107-55-252.nstool.netease.com/. 平心而论, 这种网址, 怎么可能会有服务器与其对应. 这就是另外一个点了, 根据前面的查询过程来看, 如果想要访问上面这一长条的网址, 我们首先 要到nstool.netease.com对应的权威DNS服务器进行查询. 而这次查询, 是由我们自己的缓存DNS服务器进行的.

而正好, 这台权威DNS服务器由我们公司内部进行配置. 那么, 它查询了什么, 从哪个IP 发来的, 这时就被权威DNS所得知了. 你看这条网址这么特别onlyxxx, 给它一存. 权威DNS服务器再返回某台可用的HTTP服务器的地址, 再由这台HTTP服务器 检查一下HOST与IP, 对应取出刚刚的缓存DNS服务器的IP, 整个流程就结束了.

![DNS查询过程][13]

我们要不要设置DNS服务器为8.8.8.8

DNS服务器存在的更多一点意义

  对于网站来说, 最初目的一定是希望更多的人以更快的速度访问到自己, 怎么实现这个效果?   给服务器加资源, 够了吗, 不够? 北京的手机访问深圳的页面, 会很快吗? 不会? 怎么办? 在北京也上服务器. 这产生了一个问题. 不论是在北京还是在深圳的服务器, 它们的IP虽然不同, 但是地址是相同的. 两地的用户如果访问相同的地址, 而请求转发到各自的服务器上, 这样的效果一定是最好的.

那怎么实现呢? 我们在北京地区的用户, 使用北京地区的DNS服务器, 深圳的用户使用深圳的服务器,  对于来自北京的DNS服务器查询请求, 我们的DNS服务器想起返回北京的服务器IP, 深圳的也同样. 这样DNS服务器承载了一部分的分流功能, 同时也让用户体验上升了.

8.8.8.8 为什么不好

这是Google的DNS服务器地址, 当然它也采用了一些黑科技, 你懂的: 如果全世界都同一台DNS服务器进行查询, 这台服务器的负载得多大啊. 对于运营商来说, 一定是使用离当前请求点最近的8.8.8.8对应的服务器进行服务的. 而后, 这台8.8.8.8 DNS服务器就会请求权威DNS服务器, 当然, 它也会有位置信息了.

不过千好万好, 有一点不好, 就是Google在中国并没有服务器. 你想要访问的8.8.8.8远在 国外呢, 假如网站认为你是国外用户, 给你返回了国外的IP, 那么, 用户体验注定是极差的.

身在中国, 老老实实用默认的DNS服务器就好, 或者用114.114.114.114这种由运营商提供 的DNS服务器, 这种时候, 并不是国外的月亮圆.

参考资料

首先感谢网易内部的这一培训, 收获很大.

[DNS工作原理以及dig的使用][1] [权威 DNS 和递归 DNS][2]

[1]: https://blog.csdn.net/YZS_L_H/article/details/69751353 [2]: https://www.alibabacloud.com/help/zh/doc-detail/60303.htm [3]: http://nstool.netease.com/ [4]: http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/pic/60303/intl_zh/1507536306873/website%20access.png [5]: https://www.internic.net/domain/named.root [6]: https://rawforcorvofeng.cn/dig1.jpg [7]: https://rawforcorvofeng.cn/dig2.jpg [8]: https://rawforcorvofeng.cn/dig3.jpg [9]: https://rawforcorvofeng.cn/dig4.jpg [10]: https://rawforcorvofeng.cn/dig5.jpg [11]: https://rawforcorvofeng.cn/dig6.jpg [12]: https://rawforcorvofeng.cn/2018-07-30-20:07:40-nstool.png [13]: https://rawforcorvofeng.cn/dns_query.png [14]: https://rawforcorvofeng.cn/2018-07-30-18:20:50-rootdns.png [15]: https://rawforcorvofeng.cn/2019-02-25-20-53-40-nstool.png