DNS(Domain Name System,域名系统),万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,不用记住能够被机器直接读取的IP数串。通过域名,得到该域名对应IP地址的过程叫做域名解析(或主机名解析)。DNS将主机名映射到IP地址上,就像电话本将人名映射到所对应的电话号码一样,当在浏览器中输入http://www.baidu.com时,连接到浏览器DNS解析器返回服务器的IP地址。像百度官网的IP地址为14.215.177.38。DNS协议运行在UDP协议之上,使用端口号53。在RFC文档中RFC 2181对DNS有规范说明,RFC 2136对DNS的动态更新进行说明,RFC 2308对DNS查询的反向缓存进行说明。
然而,DNS解析也是存在开销的,通常浏览器查找一个指定主机名的IP地址,需要花费20到120ms,在DNS解析完成之前,浏览器不能从主机名那里下载任何东西。DNS的查找有以下几个步骤:
1) 浏览器检查自身缓存中有没有被解析过的这个域名对应的IP地址,如果存在解析就结束了。
2) 如果浏览器缓存中命中,即没有找到,那么浏览器会检查操作系统缓存中有没有对应的已解析过的结果。在windows操作系统C:\Windows\System32\Drivers\etc路径下有一个hosts的文件,在这里如果指定了一个域名对应的IP地址,那么浏览器会首先使用这个IP地址进行访问。
3) 如果前面两步都没有命中域名,那么才会请求本地的域名服务器(LDNS)来解析这个域名,大约80%的域名解析会到这里完成。
4) 如果LDNS仍然没有命中,就会直接跳到Root Server域名服务器请求解析。
5) Root Server域名服务器会返回一个查询域的主域名服务器给LDNS。
6) 此时LDNS再发送一个请求给上一步返回的主域名服务器。
7) 接受请求的主域名服务器查找并返回这个域名对应的Name Server的地址,Name Server是网站注册的域名服务器。
8) Name Server根据映射关系表找一目标IP,返回给LDNS。LDNS缓存这个域名和对应的IP。
9) LDNS把解析的结果返回给用户,用户根据TTL值缓存到本地系统缓存中。
DNS解析的响应时间依赖于DNS解析器、它所承担的请求压力、客户端与服务器的距离和带宽速度。
TTL(Time To Live)表示查找返回的DNS记录包含的一个存活时间,表明记录可以被缓存多久,这个值告诉客户端可以对该记录缓存多久。过期则这个DNS记录将被抛弃。尽管操作系统缓存会考虑TTL值,但浏览器通常忽略该值,賆设置它自己的时间限制。并且浏览器对缓存DNS的记录数量也是有限制的,而不管缓存记录时间,如果用户在短时间访问了很多不同域名的网站,较早的DNS记录将被丢弃,必须重新查询该域名。
不同的浏览器对于DNS缓存有所不同,Internet Explorer的DNS缓存在[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]键下由三个设置控制:
"DnsCacheTimeout"=30分钟
"KeepAliveTimeout"=1分钟
"ServerInfoTimeOut"=2分钟
这表示如果DNS服务器TTL值小于30分钟的话,对浏览器进行DNS查找的频率产生的影响很小。
对于FireFox浏览器在about:config中设置就可以:
network.dnsCacheEntries=400
network.dnsCacheExpiration=60
network.http.keep-alive.timeout=115
在DNS解析过程中,减少唯一主机名的数量也呆以缩短DNS解析时间,如果客户端的DNS缓存为空时,DNS查找的数量与Web页面中唯一主机名的数量相等。但是减少唯一主机名的数量有可能减少页面中发生的并行下载量。减少并行下载可能会增加响应时间。我的准则是将这些组件分成至少两个但不超过四个主机名。这在减少DNS查找和允许高度并行下载之间取得了很好的折衷。
综上所述减少DNS查找通常可以提高响应性能。