DNS知识点梳理

DNS 服务器

DNS( Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是用来将主机名和域名转换为IP地址的工作。DNS就是这样的一位“翻译官”,它的基本工作原理可用下图来表示。

全世界所有的人每天上网都会使用DNS服务器,如果大家都去同一个地方访问某一台服务器,时延将会非常大,所以DNS服务器的架构必须是分布式、高并发、高可用,如下图:

  • 根 DNS 服务器 :返回顶级域 DNS 服务器的 IP 地址
  • 顶级域 DNS 服务器:返回权威 DNS 服务器的 IP 地址
  • 权威 DNS 服务器 :返回相应主机的 IP 地址

DNS域名解析过程

当用户在浏览器中输入www.abc.com并按下回车键后:

第一步查找本地DNS缓存

本地DNS缓存有浏览器DNS缓存,操作系统(OS)DNS缓存,路由器DNS缓存,按照浏览器、操作系统、路由器的顺序依次查找www.abc.com对应的DNS缓存,如果缓存命中则停止。

1、浏览器DNS缓存

浏览器在获取网站域名的实际IP地址后会对其IP进行缓存,减少网络请求的损耗。
当浏览器收到一个DNS解析请求后,首先会检查缓存中有没有这个域名对应的解析过的IP地址,如果缓存中有,这个解析过程就将结束。浏览器缓存域名也是有限制的,不仅浏览器缓存大小有限制,而且缓存的时间也有限制,通常情况下为几分钟到几小时不等。这个缓存时间太长和太短都不好,如果缓存时间太长,一旦域名被解析到的IP有变化,会导致被客户端缓存的域名无法解析到变化后的IP地址,以致该域名不能正常解析,这段时间内有可能会有一部分用户无法访问网站。如果时间设置太短,会导致用户每次访问网站都要重新解析一次域名。
浏览器DNS缓存的时间跟DNS服务器返回的TTL值无关。
通常每种浏览器都有一个固定的DNS缓存时间,其中Chrome的过期时间是1分钟,在这个期限内不会重新请求DNS。Chrome浏览器看本身的DNS缓存时间比较方便,在地址栏输入

1
chrome://net-internals/#dns

2、系统(OS)DNS缓存

如果用户浏览器缓存中没有数据,浏览器会查找操作系统缓存中是否有这个域名对应的DNS解析结果。其实操作系统也有一个域名解析的过程,在Windows中可以通过C:\Windows\System32\drivers\etc\hosts文件来设置,在Linux中可以通过/etc/hosts文件来设置,用户可以将任何域名解析到任何能够访问的IP地址。例如,我们在测试时可以将一个域名解析到一台测试服务器上,这样不用修改任何代码就能测试到单独服务器上的代码的业务逻辑是否正确。正是因为有这种本地DNS解析的规程,所以有黑客就可能通过修改用户的域名来把特定的域名解析到他指定的IP地址上,导致这些域名被劫持。

第二步查找ISP DNS缓存

如果本地DNS缓存没有对应的记录,就要用到我们网络配置中的”DNS服务器地址”了。操作系统会把这个域名发送给这个ISP,也就是本地区的域名服务器。这个DNS通常都提供给用户本地互联网接入的一个DNS解析服务,例如用户是在学校接入互联网,那么用户的DNS服务器肯定在学校;如果用户是在小区接入互联网,那么用户的DNS就是再提供接入互联网的应用提供商,即电信或联通,也就是通常说的SPA,那么这个DNS通常也会在用户所在城市的某个角落,不会很远。Windows环境下通过命令行输入ipconfig,Linux环境下通过cat /etc/resolv.conf就可以查询配置的DNS服务器了。这个专门的域名解析服务器性能都会很好,它们一般都会缓存域名解析结果,当然缓存时间是受到域名的失效时间控制的。大约80%的域名解析到这里就结束了,所以ISP主要承担了域名的解析工作。

递归搜索

在前面都没有办法命中的DNS缓存的情况下,(1)本地 DNS服务器即将该请求转发到互联网上的根DNS(即一个完整域名最后面的那个点,通常省略不写)。(2)根DNS将所要查询域名中的顶级域(假设要查询www.abc.com,该域名的顶级域就是.com)的服务器IP地址返回到本地DNS。(3) 本地DNS根据返回的IP地址,再向顶级域(就是.com域)发送请求。(4) .com域服务器再将域名中的权威域名服务器(abc.com)的IP地址返回给本地DNS。(5) 本地DNS再向权威域名服务器(abc.com)发送请求进行查询。(6) 权威DNS查询到对应的IP后,就将IP返回给本地DNS服务器,本地 DNS 再将 IP 地址返回客户端。

DNS有关的网络性能优化

1、减少DNS查找,避免重定向,浏览器DNS缓存 、计算机DNS缓存、 服务器DNS缓存、使用Keep-Alive特性 来减少DNS查找。考虑影响DNS缓存的因素:

  • 服务器可以设置TTL值表示DNS记录的存活时间。本机DNS缓存将根据这个TTL值判断DNS记录什么时候被抛弃,这个TTL值一般都不会设置很大,主要是考虑到快速故障转移的问题。
  • 浏览器DNS缓存也有自己的过期时间,这个时间是独立于本机DNS缓存的,相对也比较短,例如chrome只有1分钟左右。
  • 浏览器DNS记录的数量也有限制,如果短时间内访问了大量不同域名的网站,则较早的DNS记录将被抛弃,必须重新查找。不过即使浏览器丢弃了DNS记录,操作系统的DNS缓存也有很大机率保留着该记录,这样可以避免通过网络查询而带来的延迟。

2、DNS的预解析
DNS 请求需要的带宽非常小,但是延迟却有点高,这点在手机网络上特别明显。预读取 DNS 能让延迟明显减少一些,例如用户点击链接时。在某些情况下,延迟能减少一秒钟。

在某些浏览器中这个预读取的行为将会与页面实际内容并行发生(而不是串行)。正因如此,某些高延迟的域名的解析过程才不会卡住资源的加载。

这样可以极大的加速(尤其是移动网络环境下)页面的加载。在某些图片较多的页面中,在发起图片加载请求之前预先把域名解析好将会有至少 5% 的图片加载速度提升。

  • 打开和关闭 DNS 预读取
    你可以通过在服务器端发送 X-DNS-Prefetch-Control 报头,或是在文档中使用值为 http-equiv<meta> 标签:
    1
    <meta http-equiv="x-dns-prefetch-control" content="off">

您可以通过将 content 的参数设置为on来改变设置。

  • 强制查询特定主机名
    你可以通过使用 rel 属性值为 link type 中的 dns-prefetch<link> 标签来对特定域名进行预读取:
    1
    <link rel="dns-prefetch" href="http://www.spreadfirefox.com/">

在这个例子中,Firefox将预解析域名”www.spreadfirefox.com"。

而且,<link> 元素也可以使用不完整的 URL 的主机名来标记预解析,但这些主机名前必需要有双斜线:

1
<link rel="dns-prefetch" href="//www.spreadfirefox.com">

强制对域名进行预读取在有的情况下很有用, 比如, 在网站的主页上,强制在整个网站上频繁引用的域名的预解析,即使它们不在主页本身上使用。即使主页的性能可能不受影响,这将提高整体站点性能。

当客户端的DNS缓存为空时,DNS查找的数量与Web页面中唯一主机名的数量相等。减少唯一主机名的数量就可以减少DNS查找的数量。较少的域名来减少DNS查找(2-4个主机)

几种域名解析方式

域名解析记录主要分为A记录、MX记录、CNAME记录、NS记录和TXT记录:

A记录

A代表Address,用来指定域名对应的IP地址,如将item.taobao.com指定到115.238.23.xxx,将switch.taobao.com指定到121.14.24.xxx。A记录可以将多个域名解析到一个IP地址,但是不能将一个域名解析到多个IP地址

MX记录

Mail Exchange,就是可以将某个域名下的邮件服务器指向自己的Mail Server,如taobao.com域名的A记录IP地址是115.238.25.xxx,如果将MX记录设置为115.238.25.xxx,即xxx@taobao.com的邮件路由,DNS会将邮件发送到115.238.25.xxx所在的服务器,而正常通过Web请求的话仍然解析到A记录的IP地址

CNAME记录

Canonical Name,即别名解析。所谓别名解析就是可以为一个域名设置一个或者多个别名,如将aaa.com解析到bbb.net、将ccc.com也解析到bbb.net,其中bbb.net分别是aaa.com和ccc.com的别名

NS记录

为某个域名指定DNS解析服务器,也就是这个域名由指定的IP地址的DNS服务器取解析

TXT记录

为某个主机名或域名设置说明,如可以为ddd.net设置TXT记录为”这是XXX的博客”这样的说明


参考链接:
https://www.cnblogs.com/xrq730/p/4931418.html
http://imweb.
https://blog.csdn.net/kkdelta/article/details/53404005io/topic/55e3ba46771670e207a16bc8s
https://time.geekbang.org/column/article/9895
https://developer.mozilla.org/zh-CN/docs/Controlling_DNS_prefetching

© 2020 GOYTH All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero