Skip to content

DNS 解析优化

DNS 解析优化

浏览器对网站第一次的域名 DNS 解析查找流程依次为:

浏览器缓存--系统缓存--路由器缓存--ISP DNS缓存--递归搜索

DNS 解析优化的主要方法

  • 减少 DNS 的请求查询次数(前端)

DNS 查询也消耗响应时间,若网页内容来自各个不同的 domain,则客户端首次解析这些 domain 需要消耗一定的时间,但由于 DNS 查询结果会缓存在本地系统和浏览器中一段时间,所以 DNS 查询一般只是对首次访问时的速度有影响

  • 进行 DNS 预获取:DNS Prefetch(前端)

DNS 请求需要的带宽少,但延迟高,DNS 预解析可以让延迟明显减少一些。在某些浏览器中这个预读取行为将会与页面实际内容并行发生(而不是串行)。所以某些高延迟的域名的解析过程才不会卡住资源的加载。这样可以加大的加速页面的加载。


DNS Prefetch 是尝试在请求资源之前解析域名,这可能是后面要加载的文件,也可能是用户尝试打开的链接目标,域名解析和内容载入时串行的网络行为,所以可以减少用户的等待时间,提升用户体验。

DNS-prefetch 可以帮助开发人员掩盖 DNS 解析延迟。HTML 的 link 元素通过dns-prefetchrel属性值提供此功能,然后在href属性中指要跨域的域名。


设置 dns-prefetch

X-DNS-Prefetch-Control头控制着浏览器的 DNS 预解析功能 X-DNS_prefetch-Control: on|off on:启用 DNS 预解析。在浏览器支持 DNS 预解析的特性时及时不适用该标签浏览器依然会进行预解析。 off:关闭 DNS 预解析。这个属性在页面上的链接并不是由你控制的或是你根本不想向这些域名引导数据时非常有用。 DNS Prefetch 应该尽量的放在网页的前面,推荐放在 <meta charset="UTF-8"> 后面。

html
// 打开和关闭DNS预读取
<meta http-equiv="x-dns-prefetch-control" content="on" />
// 强制查询特定主机名
<link rel="dns-prefetch" href="https://www.baidu.com" />
<link rel="dns-prefetch" href="https://blog.csdn.net" />

每当站点引用跨域资源的时候,都应在 head 元素中放置 dns-prefetch 提示,但是要记住下面的注意事项。

1、dns-prefetch 仅对跨域的 DNS 查找有效。

2、dns-prefetch 要谨慎使用,多页面重复 DNS 预解析会增加 DNS 查询次数。

3、默认情况下浏览器会对页面中和当前域名不在同一个域的域名进行预获取,并且缓存结果,这就是隐式的 dns-prefetch。如果想对页面中没有出现的域进行获取,那么就要使用显示的 dns-prefetch 了。

4、虽然使用 dns-prefetch 能够加快页面的解析速度,但是也不能滥用,因为有开发者指出禁用 DNS 预获取能节省每月 100 亿的 DNS 查询。

  • 延长 DNS 缓存时间(运维)

不同浏览器的缓存机制不同: IE 对 DNS 记录默认的缓存时间为 30 分钟,Firefox 对 DNS 记录默认的缓存时间为 1 分钟,Chrome 对 DNS 记录默认的缓存时间为 1 分钟。

缓存时间长:减少 DNS 的重复查找,节省时间。

缓存时间短:及时检测服务器的 IP 变化,保证访问的正确性。

  • 使用 CDN 加速域名(运维)

CDN的原理:

浏览器输入URL后,DNS解析过程如下:

1、检查浏览器缓存

2、检查操作系统缓存,常见的如hosts文件

3、检查路由器缓存

4、如果前几步都没有找到,会向ISP(网络服务提供商)的LDNS服务器查询

5、如果LDNS服务器没找到,会向根域名服务器(Root Server)请求解析(DNS解析流程)

CDN的原理:

1、用户未使用CDN缓存资源时:浏览器通过DNS对域名进行解析,依次得到此域名对应的IP地址;浏览器根据得到的IP向服务器发送数据请求;服务器向浏览器返回响应数据

2、用户使用CDN缓存资源的过程:

  • 对于点击URL,经过本地DNS系统解析,发现URL对应的是一个CDN专用的DNS服务器,DNS系统就会将域名解析权交给CNAME指向的CDN专用的DNS服务器

  • CDN专用DNS服务器将CDN的全局负载均衡设备IP地址返回给用户

  • 用户向CDN的全局负载均衡设备发起数据请求

  • CDN的全局负载均衡设备根据用户的IP地址,以及用户请求的内容URL,选择一台用户所属区域的区域负载均衡设备,告诉用户向这台设备发起请求

  • 区域负载均衡设备选择一台合适的缓存服务器来提供服务,将该缓存服务器的IP地址返回给全局负载均衡设备

  • 全局负载均衡设备把服务器的IP地址返回给用户

  • 用户向该缓存服务器发起请求,缓存服务器响应用户的请求,将用户所需内容发送至用户中断

如果缓存服务器没有用户想要的内容,那么缓存服务器就会向它的上一级缓存服务器请求内容,以此类推,直到获取到需要的资源,最后如果还是没有,就会回到自己的服务器去获取资源

参考

https://blog.csdn.net/weixin_39550080/article/details/126040498

https://cloud.tencent.com/developer/article/2223455