DNS优化,从入门到放弃。
前段时间掉进了网站加载缓慢,数据还会丢包的大坑。
在产品其他方面加紧优化的基础上,又赶紧研究了一下DNS的工作原理以及通常使用的优化技巧。
现在从坑里爬出来了。
喘口气
本文将从以下六个方面对DNS优化进行了一些细碎的小结。
我是看不见的分割线
一、域名DNS解析原理和过程
DNS是怎么来的?
DNS 是域名系统 (Domain Name System) 的缩写。在Internet上域名与IP地址之间是一对一(或者多对一)的,域名虽然便于人们记忆,但机器之间只能互相认识IP地址,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,DNS就是进行域名解析的服务器。
DNS的树形结构
如上图所示,DNS服务器类型主要有:
-
内部 DNS :位于内网中,提供内网 DNS 服务,也具备 Internet DNS 缓存与转发能力
-
外部 DNS:位于 Internet 中,提供 Internet 的 DNS 服务(包括 DNS 缓存与转发)
-
主 DNS:提供 DNS 服务(包括查询,缓存写入)
-
辅 DNS:只提供 DNS 查询服务,与主 DNS 同步数据库
-
唯缓存 DNS:自身不具备 DNS 解析能力,但具有 DNS 缓存数据库
-
转发 DNS:具备转发特性,能将 DNS 请求转发给其他 DNS 服务器
-
权威 DNS: 自身数据库中存在与 DNS 请求相对应的映射
-
非权威 DNS:不存在相对应的映射,而存在对应缓存查询结果
DNS解析进程
上图的DNS解析过程如下:
-
龟龟(192.168.1.1) 在浏览器访问 http://www.lawootrip.com
-
192.168.1.1 检查本地 hosts 文件中是否存在 www.lawootrip.com 对应的 IP
-
若无,192.168.1.1 继续检查本地 DNS 缓存中是否存在 www.lawootrip.com 对应的 IP
-
若无, 192.168.1.1 向本地 DNS 服务器发起 DNS 查询请求
-
路由器接收到 DNS 查询请求后,检查路由器 DNS 缓存
-
若无,路由器以外网地址 202.202.202.202 向本地 DSN 服务器 (ISP DNS)发起 DNS 查询请求
-
ISP DNS 接收到 DNS 查询请求后,发现自己不是权威 DNS ,且无对应的缓存数据,于是将请求转发给 其他 DNS 服务器
-
其他 DNS 服务器 接收到请求后,一样发现自己不是权威 DNS,且无对应的缓存数据,于是开始进行 DNS 迭代查询:将请求发送给根域名服务器
-
根域名服务器接收到请求后,将顶级域名服务器 (.com) IP 发送给其他 DNS 服务器
-
其他 DNS 服务器根据 IP 将 DNS 查询请求发送给 顶级域名服务器
-
顶级域名服务器接收到请求后,将 二级域名服务器 (jianshu.com) IP 发送给其他 DNS 服务器
-
其他域名服务器根据 IP 将 DNS 查询请求发送给二级域名服务器
-
二级域名服务器 接收到请求后,发现自己是权威 DNS 服务器,于是将 www.lawootrip.com 映射的 IP 151.101.72.133 发送给其他域名服务器
-
其他域名服务器 接收到解析结果后,将 151.101.72.133 逐层返回传递下去,最终直至 192.168.1.1
-
15.192.168.1.1 接收到 www.lawootrip.com 解析结果 151.101.72.133 ,根据 IP 与 www.lawootrip.com 建立 TCP 连接,然后发起 HTTP 请求主页内容
二、浏览器加载网页的基本过程
1、从浏览器地址栏的请求链接开始,浏览器通过DNS解析查到域名映射的IP地址,成功之后浏览器端向此IP地址取得连接,成功连接之后,浏览器端将请求头信息通过HTTP协议向此IP地址所在服务器发起请求,服务器接受到请求之后等待处理。
2、览器加载显示html的顺序是:从上到下,渲染的顺序也是从上到下,下载和渲染是同时进行的。如果遇到语义解释性的标签嵌入文件(JS脚本,CSS 下载过程会启用单独连接进行下载,并且在下载后进行解析,解析过程中,停止页面所有往下元素的下载。
3、什么原因会导致网页加载过慢?浏览器可以在下载CSS资源的同时,并行解析HTML文件,但是,一旦发现有脚本文件的引用,则必须等待脚本文件完成下载并且执行后才能继续解析。内容下载时间主要取决于用户带宽、服务器带宽、文件大小、文件数量等。一般来说,将静态文件挂在CDN上,甚至全站CDN,往往能较好的解决这类问题。
三、合理利用DNS TTL值 增加域名的缓存命中率
1、DNS 服务器采用递归或迭代来处理客户端查询时,它们将发现并获得大量有关 DNS 命名空间的重要信息。然后这些信息由服务器缓存。缓存为 DNS 解析流行名称的后续查询提供了加速性能的方法,同时大大减少了网络上与 DNS 相关的查询通信量。
2、TTL(Time-To-Live)即一条域名解析记录在DNS服务器上缓存时间。当信息缓存时,生存时间 (TTL) 值适用于所有缓存的 RR。只要缓存 RR 的 TTL 没有到期,DNS 服务器就可继续缓存并再次使用 RR 来应答与这些 RR 相匹配的客户端提出的查询。
TTL设置
3、适当地增大TTL值可以让DNS Server缓存该域名更长时间,增加缓存的命中率。TTL一般默认为一小时,可以根据实际情况设为一天甚至一周以上。当然,如果你域名的IP经常变化,则TTL不应过大,否则各地的DNS Server会暂时无法获得新的正确的IP地址。
四、合理使用DNS-prefetch让DNS预读取
1、从上面浏览器加载网页的过程可以看出,网页的请求是可以多任务同时进行的,对于网页有多个DNS请求的情况,可以让浏览器在后台先把要使用的DNS请求默默地完成,这样当用户在打开新的网页时,就可以节省DNS查询的时间了。
2、控制浏览器的DNS预读取就是DNS-prefetch标签了,DNS Prefetch应该尽量的放在网页的前面,
格式类似是:
<link rel="dns-prefetch" href="//img.lawootrip.com">
很多网站都使用使用百度广告联盟代码,使用这个就可以预读取DNS了。
3、默认情况下浏览器会有隐式的DNS Prefetch,即会对页面中和当前域名(正在浏览网页的域名)不在同一个域的域名进行预获取,并且缓存结果,我们可以通过下面的标签禁止隐式的DNS Prefetch:
<meta http-equiv=”x-dns-prefetch-control” content=”off”>
4、需要注意的就是,DNS Prefetch只需要在用户在第一次打开网站时使用即可,没有必要每个页面都使用DNS Prefetch,否则就是重复DNS读取了,反而还无形中增加了DNS查询的次数,效果适得其反。
五、DNS域名解析拆分为多个域名增加并行下载量
1、一般来说网页的内容加载时会发生多个域名请求服务,如果你的网站JS、CSS、图片等非常多的话,建议将这些文件分别放在不同的域名上,这样浏览器在打开某一个页面时就可以同时向这些域名发送DNS解析请求了,能在一定程度上减少DNS时间。
2、网页的内容越多,分析的域名应该尽量多一些。例如html、htm,js、css,jpg、png、gif,php、asp都可以放在不同的域名上。在实际应用上,使用全站CDN或者是静态文件CDN就可以实现上述效果,并且结合css sprite一起来使用的。
3、css sprite(雪碧图)的作用恰恰相反,它不是增加域名请求,而减少域名DNS请求,主要是用在图片上。它允许你将一个页面涉及到的所有零星图片都包含到一张大图中去,这样一来,当访问该页面时,载入的图片就不会像以前那样一幅一幅地慢慢显示出来了。
六、加快域名DNS解析速度方法小结
1、以上就是一些简单的优化DNS小技巧,即时对个人开发者来说也没有什么门槛和技术难度,但是对提升网站的响应速度却有着明显的功效,大家不妨一试。
2、除了从网站本身的DNS解析来加快访问速度外,我们平常在选择DNS服务时尽量使用那些稳定可靠的DNS服务,这样的DNS服务响应速度和缓存率都是非常不错的。假如自己的网站分拆了多个二级域名,不妨好好用用CNAME,设置好TTL时间,保证网站的第一次解析,可以直接从运营商的DNS缓存中拿到。
此处顺便推荐三个神器,两个神服务。
“DNSpod”作为NS服务商,免费稳定专业。
“七牛云CDN”作为CDN服务商,免费稳定专业。
Chrles+Dig+微信web工具
MAC环境下,推荐 Charles用来进行数据抓包,网络通讯分析;Dig用来检测DNS,GUI界面,简单直观好用;微信web工具作为辅助,尤其是你的产品需要在微信内打开时,必备工具。
![]() |
![]() |
不收钱 | 加好友 |
龟龟
/
/ - 阅读量
Published under(CC) BY-NC-SA 3.0 CN.