先介绍背景知识,一个网页连接所花的大概时间:
没有本地缓存,相对较快的DNS lookup(50ms),
TCP握手,SSL协商,以及一个较快服务器响应时间(100ms)和一次延迟(80ms,在美国国内的平均值): 50ms for DNS 80ms for TCP
handshake (one RTT)
160ms for SSL handshake (two RTT’s)
40ms (发送请求到服务器)
100ms (服务器处理)
40ms (服务器回传响应数据)
一个请求花了470毫秒, 其中80%的时间被网络延迟占去了。
Google
Chrome做到“快”,下的功夫在DNS预解析(pre-resolve) 上,做到“越来越快”,功夫在预测功能优化上,即根据用户习惯得出用户这厮的浏览习惯而预测未来。
预解析会参考以下几个场景得出是否解析的结论:
1)鼠标悬停于某个标签上
2)Omnibox建议(与搜索引擎结合,据说是Chrome的一项创新)
3)之前浏览记录
4)浏览器自己猜测
而根据预解析这猜测是否成功,记录下来,下次就有了更好的猜测依据。打开 chrome://predictors ,可以看到chrome对解析网页命中率的记录,对于记录的删除,采用的算法是LRU(Least
Recently Used)。
还有些预解析的,比如每次打开chrome,都会先把用户最常访问的10个网站给解了(过两天闲下来就验证下=。=不过这惰性,估计是过两天就忘了这事。。。)
除了DNS pre-resolve,chrome中我觉得比较有意思的还有:
- Socket reuse: 在Socket Pool中提供持久可用的TCP connections
- 预渲染(猜你会到哪个网站,先把它藏在后台)
至于用预测功能优化,这里面扯到算法,跟其他的预测算法在我看来有相似之处,就不想再写了。
参考:
https://www.igvita.com/posa/high-performance-networking-in-google-chrome/
http://news.cnblogs.com/n/192502/