1. DNS
DNS就是URL和实际宿主服务器之间的一个间接层,将主机名映射到IP地址上。
如果一个服务器被另外一个具有不同IP地址的服务器替代了,DNS允许用户用同样的主机名来连接到新的服务器。可以将多个IP地址关联到一个主机名,为网站提供高冗余度。
2. DNS和TTL
a. DNS可以被DNS服务器(ISP或局域网的一台特殊的缓存服务器)、操作系统、浏览器缓存;
b. 只要浏览器在其缓存中保留了DNS记录,就无需请求操作系统。浏览器丢弃该记录时,就会向操作系统询问IP地址,操作系统或者通过其DNS缓存响应,或者将请求发送给远程DNS服务器;
c. 考虑到IP地址变化以及缓存会消耗内存,因此会有不同的策略周期性的清除缓存中的DNS记录;
d. Web服务器可以表明记录可以被缓存多久,查找返回的DNS记录包含一个存活时间TTL,该值告诉客户端可以对记录缓存多久;
e. 操作系统缓存会考虑TTL,浏览器通常忽略并设置自己的时间限制;
f. 客户端收到的DNS记录的平均TTL值只有最大TTL值的一半,因为DNS解析器自身也拥有TTL。浏览器进行DNS查找时,DNS解析器返回的时间是其记录的剩余时间。对于给定主机,每次执行DNS查找时接收到的TTL值都会变化;
3. 浏览器视角
a. MS Windows 上的DNS缓存由DNS Client服务管理。可以使用ipconfig来查看和刷新DNS Client服务:
ipconfig /displaydns
ipconfig /flushdns
重启系统也可以清空DNS Client服务缓存。重启浏览器会清空浏览器缓存;
b. IE DNS缓存默认设置
DnsCacheTimeout——30分钟
KeepAliveTimeout——1分钟
ServerInfoTimeout——2分钟
如果DNS TTL值小于30分钟,对IE浏览器DNS查找频率影响小,因为一旦浏览器缓存了DNS就会设置TTL为30分钟;
如果发生了错误,就会刷新DNS查找TTL就会比30分钟小;
Keep-Alive:一个持久的TCP连接将会一直使用(不会进行DNS查找)直到空闲1分钟为止;
ServerInfoTimeout说明尽管没有Keep-Alive,如果一个主机名没两分钟重用了一次,也无需进行DNS查找。这样如果至少没两分钟重用一个主机名,就可以超过30分钟不需要进行DNS查找;(假设访问IP时没发生错误)
c. Firefox 配置设置
network.dnsCacheExpiration——1分钟
network.dnsCacheEntries——20
network.http.keep-alive.timeout——5分钟
DNS记录的缓存时间比其TTL多一分钟,因为这个值很小,所以将TTL设置得很低(低于一小时)很可能增加Firefox中DNS查找次数;
只能缓存20条DNS记录;
Fasterfox插件可以修改以上值为1小时、512、30秒;
4, 减小DNS查找
当客户端的DNS缓存为空(浏览器和操作系统都为空),DNS查找数量和Web页面中的唯一主机名数量相等。这包括页面URL、图片、脚本文件、样式表、Flash对象等主机名。
减少唯一主机名可以减少DNS查找,但是也会潜在的减小页面中并行下载的数量。对于google.com来说,页面只有两个组件,由于每个主机名可以并行下载两个组件,使用一个主机名既减少DNS查找,又优化了并行下载。
Note: 将组件分别放至少两个,至多4个的主机名下(可以使用CDN),在减少DNS查找和允许并行下载间做出很好的权衡。