HTTP是一个构建在传输层的TCP协议之上的应用层的协议,在这个层的协议,是一种网络交互需要遵守的一种协议规范。
HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。这个过程大概可以描述为:
1、建立连接:首先DNS解析过程。如把域名变成一个ip,如果url不包含端口号,则会使用该协议的默认端口号,HTTP协议的默认端口号为80。然后三次握手建立一个TCP连接;
2、请求:连接成功后,开始向web服务器发送请求,这个请求一般是GET或POST请求。
3、应答:web服务器收到这个请求,进行处理。web服务器会把文件内容传送给响应的web浏览器。包括:HTTP头信息,体信息。
4、关闭连接:当应答结束后,web浏览器与web服务器必须四次握手断开连接,以保证其它web浏览器能够与web服务器建立连接。
但是HTTP1.1开始默认建立的是长连接,即一旦浏览器发起HTTP请求,建立的连接不会请求应答之后立刻断掉。
1、 一个复杂的具备很多HTTP资源的网页会建立多少TCP连接,如何使用这些连接?
2、 已经建立的TCP连接是否会自动断开,时间是多久?
对于第一个问题。现在浏览器都有最大并发连接数限制,应该说如果需要,就会尽量在允许范围内建立更多的TCP持久连接来处理HTTP请求,同样滴,一个TCP持久连接可以不断传输多个HTTP请求,但是如果上一个请求的响应还未收到,则不能处理下一个请求(Pipeling管道技术可以解决这个问题从而进一步提升性能),所以说很多浏览器其实都可以修改允许最大并发连接数以提升浏览网页的速度。
对于第二个问题。问题在于服务器端对于长连接的实现,特别是在对长连接的维护上。FTP协议及SMTP协议中有NOOP消息,这个就可以认为是心跳报文,但HTTP协议没有类似的消息,这样服务器端只能使用超时断开的策略来维护连接。设想超时时间非常短,那么有效空闲时间就非常短,换句话讲:一旦链路上没有数据发送,服务器端很快就关闭连接。
也就是说其实HTTP的长连接很容易在空闲后自动断开,一般来说这个时间是300s左右。
=====================================================================
1、HTTP1.1提升性能的手段
著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:Saviio
链接:http://www.zhihu.com/question/36469741/answer/67608570
来源:知乎
HTTP1.1里大概规范了几项提高性能的手段:
第一点之前已经说过了,所以不表。
第二点,由于现代网页通常包含了复数个(>=10)资源,而按照默认设定,一个连接中的每一个请求必须等待收到响应后才能发送下一个请求,所以如果复数的资源请求全部在一个连接one by one发送给服务器显然会很慢,而为了弥补这一缺陷,浏览器通常会默认开启多个TCP连接,然后再根据每个连接的状态在其中依次发送数据请求,而且客户端有权任意关闭超发的连接。各个浏览器允许的并行连接数大致是这样的(From SO):
Firefox 2: 2
Firefox 3+: 6
Opera 9.26: 4
Opera 12: 6
Safari 3: 4
Safari 5: 6
IE 7: 2
IE 8: 6
IE 10: 8
Chrome: 6
由于TCP协议本身有慢启动的特征,会随着时间调谐连接的最大速度,因此在现代浏览器中持久连接和并行连接通常是搭配在一起使用的—— 一方面由于持久连接的存在,每个TCP连接已经处于调谐后的状态,另一方面持久连接可以避免重新三次握手的开销。
关于第三点,
按照HTTP1.1的描述,还有种可以提升性能的方案是管道化,可以在一个连接中发送多个请求不必等待前一个请求返回。但这项技术比较容易踩坑,所以主流面向用户的浏览器,这项技术是被默认关闭。
关于HTTP2:
HTTP2为了性能做了不少努力,比如提供了规范以支持连接的多路复用。
HTTP1.0需要加上keep-alive的请求首部,否则默认一个请求一个连接。
HTTP1.1之后keep-alive(持久连接)被默认启用,除非在响应中指定connection:close,否则webserver会假定所有连接都是持久的。
=====================================================================
葛佳祥,程序员/PHPer/开源爱好者
石建文、小小的寂寞、知乎用户 等人赞同
@Saviio没有正面回答这个问题,不过关于HTTP中的持久连接理解得不错。
关于楼主的问题:如果第一个请求完成后,再开始发送的第二个请求,就是1个tcp连接,如果是两个请求同时开始,或者第一个请求还未结束就开始第二个请求,就是两个tcp连接。
因为HTTP协议是同步的没有多路复用支持。一个管道同时只能做一件事。
不过幸好现代计算机已经完全不用在乎几个tcp连接了,协议简单其实挺好的。
=============================================================
2、关于火狐中HTTP参数的设置:
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 目前是一个有争议的,仍旧在实验阶段的特性。虽然它可能确实会加快浏览速度,但是这在一定程度上取决于网络的各项因素,所以不要盲目的按照网上建议的方式设置相关的参数。
============================================================
3、详解浏览器最大并发连接数
当我们在浏览网页的时候,对浏览速度有一个重要的影响因素,就是浏览器的并发数量。并发数量简单通俗的讲就是,当浏览器网页的时候同时工作的进行数量。
如果同时只有2个并发连接数数量,那网页打开的时候只能依赖于这2条线程,前面如果有打开慢的内容,就会直接影响到后面的内容打开。但是如果同时有更多的并发连接数,这样就会大大的提高网页加载速度。详情可查看我们之前发布的文章:并发连接数对浏览器加载速度的测试。浏览器的并发连接数也并非越大越好。
下表概括了基于主机上运行的IE浏览器的版本的最大并发连接数、主机的连接速度和服务器的受支持的协议版本。<>
版本 |
HTTP 1.0 服务器(宽带连接) |
HTTP 1.1 服务器(宽带连接) |
HTTP 1.0 服务器(拨号连接) |
HTTP 1.1 服务器(拨号连接) |
Internet Explorer 7 和早期版本 |
4 |
2 |
4 |
2 |
Internet Explorer 8 |
6 |
6 |
4 |
2 |
Internet Explorer 9 |
10 |
10 |
? |
? |
Internet Explorer 10 |
6 |
6 |
? |
? |
Internet Explorer 11 |
6 |
6 |
? |
? |
chrome、firefox |
6 |
6 |
? |
? |
InternetExplorer 8+ 提供了一个 window. maxConnectionsPerServer 对象,服务器可以利用此对象来确定客户端计算机上的可用连接数。
在 Internet Explorer 8+ 中,maxConnectionsPerServer对于宽带连接将返回 6,除非用户或管理员已重写此默认值。在客户端计算机通过拨号连接时,如果连接到 HTTP 1.1 服务器,则 maxConnectionsPerServer 将返回 2;如果连接到 HTTP 1.0 服务器,则 maxConnectionsPerServer 将返回 4。
很多人都说是:
实际情况(china):
很多客户端软件可以修改电脑的最大连接数,比如:迅雷、暴风影音等。
之前我们曾跟大家分享过如何修改IE浏览器的并发连接数,如果你正在使用IE7及以下的更低版本,不妨尝试将连接数修改到6,这将有助于提升打开网站的速度。