关于 firefox 里面和 HTTP 连接有关的参数设置

January 28, 2005 11:22 am UTC | In Tech

发信人: atppp (Big Mouse), 信区: Firefox
标 题: 关于 firefox 里面和 HTTP 连接有关的参数设置
发信站: BBS 水木清华站 (Sun Nov 21 08:14:43 2004), 站内

关于 firefox 里面和 HTTP 连接有关的参数设置

本文是我和一个大牛啰里啰唆的聊天记录整理翻译,属于科普,有些地方可能说得不准确,大家不要当作专业技术文章看。欢迎拍砖。

一个典型的网页,是由一个 html 文件和内嵌的各类元素组成的,这些元素包括页面内的图片,css 文件,javascript 文件等等。每一个内嵌的元素在 HTTP 协议的层面上和那个 html 文件是没有区别的:也就是都需要浏览器去服务器上抓下来。一个早期典型的浏览器是这样实现的:当用户敲入网址之后,浏览器和服务器建立连接,请求这个 html 页面,然后边接收服务器发送的 html 页面,边解析,碰到内嵌元素,可以立即开第二条连接请求。另外,如果内嵌元素很多,他可能会开多条连接同时请求。当所有需要的元素都下载完毕之后,浏览器 就会将页面画出来。这个过程就是最早期的 HTTP/1.0 协议所设想的浏览器实现。

HTTP/1.0 这种多连接的运作模式是可以改进的。建立 TCP 连接的过程是这样:客户端给服务器发一个网络包说我要和你建立连接,服务器收到之后回一个网络包说“我愿意”,然后客户端要再发给服务器一个网络包说“好 那咱们开始传数据吧”。这一来一去三个包才能建立 TCP 连接。连接建立之后,浏览器给服务器发请求,服务器给浏览器回应。完事之后又要来回几个网络包关闭 TCP 连接。如果页面有很多文件长度很短的元素,每个元素都需要单建一条连接就会导致网络上大量的都是 TCP 建立连接和断开连接的网络包。另外,TCP 有一个特性叫做 slow start,其含义可以大致这样解释:TCP 连接要求发送端发送一定数量的网络包之后接收端就要回一个“我收到”的网络包,而且网络包在经过每个路由器的时候包头都要被重写,所以在网络不丢包的情况 下网络包越大网络的效率就越高。TCP 连接寻找最优网络包大小的方法是,在 TCP 连接建立的初期,网络包的大小是很小的,根据网络状况,两端的程序才会逐步增大网络包的大小以适应带宽提高网络传输的效率。所以浏览器给服务器发请求,如 果每发一个请求就关闭连接的话,那这个连接的数据传输很难达到带宽所能承载的速度。

基于这种种原因,HTTP/1.1 很快出来了,提出了持久连接(persistent connection)的概念,也就是说同一条 HTTP 连接,可以依次处理多个请求,同时用一定的机制保证各个请求之间的分离性。具体的操作过程是:服务器给浏览器发送回应之后,并不马上关闭连接;浏览器判断 上一个请求的回应已经收完的情况下,可以在这同一个连接上发第二个请求。这种运作模式大大减少了网络包,实验也表明这种做法很有效。但是,由于服务器上保 持连接要占用一定的资源,所以一般服务器不会永久保持持久连接,而且也不推荐浏览器和服务器之间建立过多的持久连接。

持久连接可以进一步提速。这就是 pipelining 了。上面可以看到,浏览器需要等待持久连接里上一个请求的回应完全收完才能发送后面的请求。如果和服务器的连接比较慢,往往持久连接大部分时间都花在等待 而非数据发送/接收上。pipelining 的意思是,浏览器可以在一个持久连接里一次给服务器发送多个请求,服务器在这个连接上依次回应这些请求。这种运作方式和浏览器缓存结合起来的时候会尤其有 效果。比方,图片浏览过后会存在浏览器缓存中,再次请求的时候浏览器会对服务器说,我这里已经有这个图片的缓存了,修改时间是XXXX,如果服务器上这个 图片在这之后没有修改过,就不用重发了。这种情况下,服务器会发一个很短的 304 Not Modified 类型的回应。如果没有 pipelining,每次这样问一下都要等待网络上传输打一个来回;而如果有 pipelining,浏览器可以同时问服务器我这里 4 个图片是否有修改,如果服务器对 pipelining 支持的好,它甚至可以将四个回应放到同一个网络包里面传回来,这是一个大大的加速。

pipelining 最早提出的时候还有一种设想的用法是,如果服务器对 pipelining 支持的好,可以把同一个 pipeline 里面的两个请求放到两个 CPU 上去处理,这样能进一步加快响应速度。当然这个可能也没什么用。

好咯,回过来看一下 firefox about:config network.http.* 的相关参数

network.http.keep-alive 默认是 true
是否允许持久连接,这个默认就是 true,改成 false 的是大傻瓜。

network.http.keep-alive.timeout 默认是 300
持久连接允许的保持时间,这个调大了没意义,因为一般 server 设置的就是 300。
server 把你咔嚓了你还能有什么办法。

network.http.max-connections-per-server 默认是 8
连接同一个服务器允许的最大连接数,一般认为在开启持久连接的情况下把这个数值调大没什么作用,而且不太道德。需要调大的情况比方:你同时从网站下 10 个大文件。

network.http.max-persistent-connections-per-server 默认是 2
连接同一个服务器允许的最大持久连接数,这个数值 HTTP/1.1 标准推荐的是 2。调大了反而增加你自己的网络消耗,而且一般一个服务器允许的持久连接数是有限的,你调大了就可能造成别人可用的减少,如果大家都调大,就意味着网络效 率的丧失。我个人建议不要动这个数值。

network.http.pipelining 默认是 false
是否允许 pipelining,这个功能因为目前还是试验阶段,所以默认没有打开。强烈建议打开。

network.http.pipelining.maxrequests 默认是 4
每个持久连接允许一次发送的请求数。如果 pipeline 里面有一个大图片或者执行时间较长的脚本,后面已经发送的请求就会被阻塞(注意服务器必须是依次回应请求);而在这种情况下,如果没有使用 pipelining,浏览器发现一个请求处理时间很长,自然会使用另一条持久连接用作后续请求,甚至进一步开启非持久连接。另外,如果服务器支持 pipelining 不好而过早的关闭连接,浏览器势必要重新发送请求。基于这种种原因,有人认为这个数字设置得比 2 大反而会降低浏览速度。我个人的推荐是,这个数值一般情况可以保持默认值 4,如果浏览的网站有大量的静态小图片,或者网络速度较慢,可以尝试将其调大。

network.http.max-persistent-connections-per-proxy 默认是 4
每个代理服务器允许的最大持久连接数。4 是目前比较公认的最合适的数值,尽管HTTP/1.1 的推荐值是 2。

network.http.proxy.keep-alive 默认是 true
连接代理服务器是否允许持久连接。true 挺好的。

network.http.proxy.pipelining 默认是 false
连接代理服务器是否允许 pipelining。目前普遍认为大多数代理服务器支持 pipelining 并不好,所以一般不建议打开。

pipelining 目前是一个有争议的,仍旧在实验阶段的特性。虽然它可能确实会加快浏览速度,但是这在一定程度上取决于网络的各项因素,所以不要盲目的按照网上建议的方式设置相关的参数。

Tags: , ,

3 Comments »

RSS feed for comments on this post.

  1. 一个连接可以向服务器发送4个请求,服务器端是怎么响应的?如果服务器上一个页面有1000张静态图片,那么会产生1000个请求,会分1000/4个连接来完成吗?

    Comment by peter — July 12, 2008 8:09 pm UTC #

  2. network.http.keep-alive 默认是 true
    是否允许持久连接,这个默认就是 true,改成 false 的是大傻瓜。

    但是我的应用需要页面上的每个链接都需要新建连接,在我的php页面中,可以用什么语句来设置不允许持久连接呢?

    如果知道的话,发到我邮箱,感谢大侠帮助!
    longyongxia@gmail.com

    Comment by longyongxia — August 5, 2008 6:58 am UTC #

  3. web 服务器可以设置吧。。。

    Comment by atppp — August 5, 2008 8:12 am UTC #

Leave a comment

XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

This weblog is licensed under a Creative Commons License.
Powered by WordPress. Theme based on Pool by Borja Fernandez.