【转】优化页面加载时间,有关浏览器本身并发的控制(Pipelining).

原文地址:http://www.php-oa.com/2008/03/07/ie-load.html

当前浏览器默认并发连接数

下面表格列出了当前浏览器在HTTP/1.1和HTTP/1.0协议下默认的并发连接数设置:
Browser HTTP/1.1 HTTP/1.0
IE 6,7 2    4
IE 8           6 6
Firefox 2 2 8
Firefox 3 6 6
Safari 3,4 4 4
Chrome 1,2 6 ?
Chrome 3 4 4
Chrome 4 6 ?
iPhone 2 4 ?
iPhone 3 6 ?
iPhone 4 4 ?
Opera 9.63,10.00alpha 4 4
Opera 10.51 8 ?

上面同时提供了HTTP/1.0协议下的浏览器并发连接数,主要是因为在早期,某些浏览器在HTTP/1.0协议和HTTP/1.1协议下默认设置的并发连接数不同,IE7在HTTP/1.0协议下支持4连接数,而在HTTP/1.1协议下仅支持2连接数。为了加快并行下载从而优化Web性能,AOL当时就降级使用HTTP/1.0协议从而提高了并行连接数。

浏览器的默认并发连接数是可以修改的,针对IE可以通过修改注册表来实现,相应的,Firefox的修改更容易和安全些,在地址栏输入:about:config,找到

    network.http.max-persistent-connections-per-server
    network.http.max-connections-per-server

分别进行相应的修改即可。

注意:IE8针对拨号上网用户自动减少到2个连接数。

对于开发者,可以通过Javascript来探测浏览器当前生效的连接数:

    window.maxConnectionsPerServer
    window.maxConnectionsPer1_0Server

这些属性都是只读的。
浏览器打开的连接数上限

浏览器最多能同时打开多少连接数?

这与我们为增加并行连接数的浏览器所做的直至浏览器失效的设置有关。

作者进行了一翻测试论证(由于年代久远,演示已不可用),他做了一个测试页面,包含180张图片,这些图片分别保存在30个不同的主机名下,每个主机名下放置6张图片。为了得出浏览器支持的同时打开的连接数的上限值,他打开该页面,通过抓包工具计算同时请求数。结果发现,Firefox1.5和2.0能够同时打开的最大连接数是24个(解析12个主机名,每个主机名保持2个连接数),这个限制是通过Firefox的netword.http.max-connections设置的,默认值是24。

针对IE6、7&8并未得出这个上限值,在2连接数下,IE6&7同时打开了60个连接,在6连接数下,IE8同时打开了180个连接。说明作者测试用的30个主机名还要增加才能测试出何时IE超出最大连接数。



谈到浏览器的并发Pipelining,就一谈要讲到HTTP的连接方式.我们知道HTTP/1.0 的运作模式是由客户端与服务器端的三次握手的连接过程, 在你来我往中建立连接,但完事后是需要发回网络包来关闭建立的TCP连接.

   那么这里会有个效率问题: 一个页面有很多小数据元素时,或者 页面元素很多时, 这建立与关闭的网络包将充斥在你的网络中, 这无疑会影响页面载入的速度. 那么在改良版(HTTP/1.1)终于提出了个持久连接(persistent connection)的概念, 简单而形象的描述就是一个绳(一个HTTP连接)上拴多个蚱蜢(多个请求), 在服务器端发送回响后并不马上关闭连接, 好处当然是连接数少了,但维持连接对服务器端来说是需要消耗资源的,所以我们在配置Apache部分时可以酌情修改自己的KeepAlive Timeout.

    那么这里又会有个问题,如果前一个请求没完,后一个就肯定是在等待状态了,那么持久连接就是个等待状态的连接,而不是把时间花在数据的发送/接受上了.所以有时打开网页的速度和你和网络,服务器的压力,网络之外,还有一个原因,就是浏览器本身的并发.

开启Pipelining的话,它可以在持久连接上再次提速, 即浏览器在一个持久连接里一次给服务器端发送多个请求,而如果有缓存的话服务器端回个304就可告之浏览器此数据无更改,即可呈现给用户.

默认状态IE每个主机名只允许两次请求状态,IE 同时只能从同一域名下载两个文件的限制。如果超过两个文件,IE 将会以队列形式等待两个文件下载完毕,再去下载接下来的两个文件。这样,当在一个页面显示多张图片时,IE 用户的图片下载速度就会受到影响。

HTTP pipelining, 默认IE是关闭的,Mozilla firefox 中已经内置这一技术并打开了,你要查看你的Firefox是否打开,可以用下面的方法.

在地址栏中输入:about:config

在Filter栏中输入:pipe

在下面窗口中出现了以下项目:network.http.pipelining

双击这一行,则其 Value 变成了 True。

下面还有 network.http.proxy.pipelining,也可以改为 True。

至于 Maxrequest,最大请求数,则可以保留原来的 4,太多了也不太好。

你可以使用多个主机名来突破这个HTTP规范.举个例子: host[1-5].example.net的服务器访问地址, 同样的数据内容呈现.例如百度、新浪、雅虎等网站采用了同一组图片服务器,使用多个二级域名的方式来解决这个问题。

百度的图片搜索采用了 t1.baidu.com ~ t8.baidu.com 八个域名来显示图片,消耗在 IE 浏览器端的 Blocked 时间小于0.001秒.新浪的图片 CDN 同样采用了 i0.sinaimg.cn ~ i3.sinaimg.cn 四个域名来显示图片.新浪采用独立的顶级域名 sinaimg.cn 而非 ***.sina.com.cn 域名作为图片服务器域名,还有一个好处,就是 sina.com.cn 域下的 Cookie 信息不会被带到 sinaimg.cn 域下,提高了图片服务器解析 header 头的速度。

你可能感兴趣的:(浏览器)