DNS 简史
前言
刚刚在刷知乎的时候,看到了这个问题

个人对这个话题比较感兴趣,也就有了本文。
正文
要想知道 DNS 对上网体验有什么影响,首先得先知道 DNS 是做什么的。
互联网现在最常用的协议 TCP/IP 协议在 1974 年被提出,而 DNS 最早在 1983 年由南加州大学计算机科学家 Paul Mockapetris 发明。
hosts 时代
在此之前,如果两台计算机想要通过 TCP/IP 协议进行通信,那么主要有两种方式。
- 第一种是直接通过 IP 地址进行通信,比如
10.0.0.1< – >10.0.0.2,但是这种方式需要手动记忆 IP 地址。如果只是简单的地址还好,如果一台计算机的地址是255.236.125.85,那记忆起来就麻烦了,更别提现在 IPv6 地址是像0000:0000:0000:0000:0000:0000:0000:0000这样的地址,一个一个记忆简直是灾难; - 第二种是通过一个叫
hosts的文件来进行通信,这种方式实际上也是通过 IP 地址进行通信,只不过是这个文件对 IP 地址进行了一个映射。
比如映射 a.example.com 到 10.0.0.1,映射 b.example.com 到 10.0.0.2,这样的话如果计算机 A 要访问 10.0.0.1,有了 hosts 的映射关系,只需要访问 a.example.com 就可以访问到 10.0.0.1 了。
当然,互联网的地址并不像 10.0.0.1 这种地址这么好记,更多的是 255.236.125.85 这种地址,这时候映射 c.example.com 到 255.236.125.85 就会好记很多。
但是随着互联网(当时为 ARPANET 阿帕网)的不断发展,越来越多的计算机加入了这个网络,所需要通信的 IP 地址也越来越多。
最初 SRI International 维护了一个 HOSTNAMES SERVER,托管的就是上面提到的 hosts 文件,但是因为网络的发展,需要维护的文件越来越大,维护起来也越来越麻烦了。
DNS 的发明
在 1983 年,南加州大学计算机科学家 Paul Mockapetris 发明了域名系统 Domain Name System,简写就是 DNS。
在随后,有许多 DNS 相关的 RFC(请求意见稿,或者叫备忘录)被提出,比如 RFC 882 和 RFC 883。但是初版的 RFC 在技术规范上还存在一些问题,于是后面的 RFC 1034 和 RFC 1035 被提出,修正了这些问题并取代了 RFC 882 和 RFC 883。
现在我们访问一个网站,比如百度。网站地址为 www.baidu.com 但是我们的电脑或者智能手机并不认识这个域名,那么我们的设备会自动向 DNS 服务器发起查询请求 query www.baidu.com ,这时候被查询的 DNS 服务器会有两种行为。
- 如果此时服务器上有
www.baidu.com的缓存,并且没有到期(TTL没有超时),那么会直接返回缓存的结果 - 如果此时服务器上没有
www.baidu.com的缓存,或者缓存到期(TTL超时),DNS 服务器会向上游服务器发起www.baidu.com的查询请求。如果上游服务器也没有缓存,会开始使用“最纯粹的力量”,就像高中数学的求根公式一样,向根服务器发起查询.com的顶级域名服务器地址。查询到后,DNS 服务器再向查询到的地址发起查询请求,以此类推,直到取得www.baidu.com的解析结果。
DNS 的重要性
现在,我们已经知道了 DNS 的用途,那么讨论下 DNS 一旦故障,对我们上网的影响吧。
我们在给电脑设置 DNS 服务器的时候,会看到两项有关 DNS 服务器的设置:首选 DNS 服务器、备用 DNS 服务器

设置备用 DNS 服务器的目的,就是在主 DNS 服务器故障的时候,自动由 备用 DNS 服务器给出解析结果。
那如果两个 DNS 服务器都故障了,那么我们的访问真就只能成这样了

故障代码可能是 DNS_PROBE_FINISHED_NXDOMAIN 或 ERR_NAME_NOT_RESOLVED
另一种故障就是 DNS 劫持,不过随着 HTTPS 协议被越来越多网站使用,DNS 劫持已经很少见了,就简单讲一下吧
还是刚刚提到的 www.baidu.com ,正确的解析结果是 CNAME 到 www.a.shifen.com. 再由 DNS 服务器去解析 www.a.shifen.com. 才能取得正确的 IP 地址。
但是如果哪天,我使用的 DNS 服务器被劫持了,把 www.baidu.com 劫持到了自己的服务器 114.51.41.91 上,那么我访问的网站可能根本就不是百度。或者哪怕内容是百度的(这个服务器对百度做反代了),也可能会被监听。
当然,访问百度被劫持可能问题不大,但是如果你访问的是银行的网站呢?
当然,因为现在有 HTTPS 协议,哪怕 DNS 服务器被劫持,问题也不大,因为服务器不是百度的,根本无法提供 www.baidu.com 的可信 SSL 证书,我的浏览器会自动提示这个网站不安全的~
第三种故障就是解析到的结果并不是最优结果(其实也不算故障,算是优化不到位吧)
比如我是一个河南移动的用户,我去访问百度,最优的解析结果应该是 39.156.70.46 。但是因为 DNS 服务器故障,解析的结果跑到了 119.63.197.151, 这是一个海外的地址,虽然也是百度的,但是访问体验会很差。因为距离远,从理论上延迟就会高一些,再加上现实的各种因素,延迟只会高上加高。
综上,对于一个普通网民来说,DNS 对上网体验影响十分重要,它决定了我们能不能正确访问到一个网站的服务器,能不能访问到最优的服务器。正是因为 DNS 服务器稳定、可靠的运行,我们才能愉快的刷知乎、逛B站、看抖音。