-
Notifications
You must be signed in to change notification settings - Fork 88
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
性能优化之 DNS Prefetch #3
Comments
我来试试吧(✿◡‿◡) |
原理DNS原理DNS(Domain Name System, 域名系统),作为域名和IP地址相互映射的一个分布式数据库。 DNS Prefetch原理DNS Prefetch就是根据浏览器定义的规则,提前解析之后可能会用到的域名,使解析结果缓存到
Chromium不使用浏览器的网络堆栈,直接使用操作系统的缓存。通过8个异步线程执行预解析,每个线程处理一个队列,来等待域名的响应,最终操作系统会响应一个DNS结果给线程,然后线程丢弃它,等待下一个预解析请求。 如何使用DNS Prefetch
解决的问题及收益DNS Prefetch有效缩短了DNS的解析时间。 如何不漏掉域名
参考资料 |
DNS Prefetch一个网络请求的生命周期,需要经过这么几个步骤:DNS 查询、建立 TCP 连接、数据传输、断开连接。 DNS 查询就是将域名转换成 IP 的过程,这个过程短的话 2ms 几乎无感,长则可能达到几秒钟。DNS Prefetch 的原理就是在 HTTP 建立之前,将 DNS 查询的结果缓存到系统/浏览器中,提升网页的加载效率。 现代浏览器在 DNS Prefetch 上做了两项工作:
这个能力,各浏览器厂商很早就已经支持了,包括 IE9+、Firefox 3.5+、Chrome 等,具体可以查看 Caniuse DNS prefetch. 效果查看打开 WebPageTest,输入 由于是从其他国家访问大陆的淘宝网首页,所以看到加载速度是很慢的;有 6 个域名的查询时间超过了 100ms,也就是说这 6 个域名下的资源,至少需要在 100ms 后才会开始加载, 用这个栗子来解说还是可以很好说明 DNS Prefetch 对性能的影响的。 使用场景如果你对 DNS Prefetch 有了比较全面的理解,那应该也会更加清楚这项技术的使用场景。并非所有页面都要加上此项,一般在整个站点的入口页做这个工作就行了,毕竟一个站点下用到的大多数域名都会在首页体现。 还有几个比较常见的场景:
并非所有的域名都需要提前 Prefetch,超过 10 个(左右)并发的 Preftch 并不一定会提升网页的加载效率,你可以在网页上写 1000 个 Prefetch (随机域名,系统肯定无混存)试试看,是否对页面性能有损耗。 小结DNS Prefetch 是对网页性能优化的一个通用方案,对国际化的站点来说可能效果更加明显。学习成本和理解成本低,开发者可以放心大胆地用到自己的网页上。 |
但是看一些资料上说,安全方面建议将dns prefetch关闭 |
看到一篇文章讲 DNS-prefetch 存在的安全隐患 https://www.htmlgoodies.com/beyond/webmaster/how-your-browser-speeds-up-cross-domain-loading-using-dns-prefetching.html |
DNS prefetch即DNS预解析,通过向DNS服务器提前获取域名的实际指向,可以有效减少浏览器在发送请求时的DNS解析时间。 DNS解析是一个多级处理的过程,通过向不同层级的DNS服务器查询,最终得到域名指向。当然不同层级都可实现各自的缓存,我们电脑本地就有一层DNS缓存,一般缓存有50-200个域名解析。在这里不深入解释DNS解析的过程。 如何设置DNS Prefetch1、浏览器自动处理 浏览器在加载一个html页面的时候,会自动获取当前页面所有a标签href属性中的域名,并且执行DNS预解析。a标签以外的标签不做处理。 需要注意的是,当浏览器遇到https页面,处于安全性考虑,不会自动进行DNS预解析。需要手动加上一个meta开关。 <meta http-equiv="x-dns-prefetch-control" content="on"> 2、手动配置 在页面顶部加入如下标签即可。 <link rel="dns-prefetch" href="//host_name_to_prefetch.com"> Chromium实现DNS解析可能耗费大量的时间,在某些系统上(如Windows)甚至不支持异步的DNS解析。为了防止DNS预解析阻塞页面渲染影响用户体验,Chromium内核没有使用浏览器的网络堆栈实现DNS prefetch。而是启动了8个异步的worker线程专门负责DNS预解析。因此DNS预解析与首屏加载没有直接关系,既不会加速首屏渲染,也不会阻塞首屏渲染 应用场景参考上面的结论,我们知道声明在html中的JavaScript、CSS、图片等静态资源的加载,并不会直接受益于DNS prefetch。 那么我们什么时候会用上DNS预解析呢? 1、在整个站点的入口声明DNS预解析。 通过在站点入口声明了后续其他子页面和子站点可能会访问的域名,浏览器提前进行了DNS预解析。这样用户在访问其他子站点的时候将会间接受益于入口的预解析,降低了DNS lookup所消耗的时间。 2、根据实际情况配置当前页面的DNS预解析。 声明后续操作可能会用到的域名,如发送的异步请求、动态加载图片等等。 3、并不是DNS prefetch设置的越多越好,虽然是异步线程,实际上还是占用设备的带宽,造成资源竞争。 RefererThe Chromium Projects - DNS Prefetching Done. |
认领人须知
The text was updated successfully, but these errors were encountered: