致命链问:TCP连接可以发送多少HTTP请求?

发布者:上海IT外包来源:http://www.lanmon.net点击数:1419

曾经有过这样一个面试问题:从URL输入到页面的过程中发生了什么?
我相信大多数准备好的学生都可以回答它,但是如果你继续问:如果收到的HTML包含几十个图像标签,方式和顺序,建立了多少连接,以及用于下载的协议他们。怎么样?
要理解这个问题,我们需要解决以下五个问题:
在与服务器建立TCP连接后,在完成HTTP请求后,现代浏览器是否会断开连接?在什么情况下会断开连接?
TCP连接可以对应多个HTTP请求吗?
可以将TCP连接中的HTTP请求一起发送(例如,一起发送三个请求,并一起接收三个响应)?
为什么我有时需要在刷新页面时重新建立SSL连接?
浏览器可以对同一主机建立的TCP连接数量是否有限制?
第一个问题
在与服务器建立TCP连接后,在完成HTTP请求后,现代浏览器是否会断开连接?在什么情况下会断开连接?
在HTTP/1.0中,服务器在发送HTTP响应后断开TCP链接。但是这样,每个请求都会重新建立并断开TCP连接,这太贵了。因此,尽管未在标准中设置,但某些服务器支持连接头:保持活动状态。这意味着在完成此HTTP请求后,请勿断开HTTP请求使用的TCP连接。这样做的好处是可以重用连接,然后不需要HTTP请求来重新建立TCP连接,并且如果保持连接,则可以避免SSL的开销。这两张照片是我两次访问https://www。 github.com的时间统计:
致命链问:TCP连接可以发送多少HTTP请求?
第一次访问时,存在初始连接和SSL开销。
致命链问:TCP连接可以发送多少HTTP请求?初始连接和SSL开销消失,表明正在使用相同的TCP连接。
持久连接:由于维护TCP连接有很多好处,HTTP/1.1会将Connection头写入标准,默认情况下启用持久连接,除非请求说连接:关闭,然后浏览器和服务器将保持一段时间。请求结束时,TCP连接不会中断。
所以第一个问题的答案是:默认情况下,TCP连接不会中断。请求标头中仅连接:关闭将在请求完成后关闭连接。
第二个问题
TCP连接可以对应多个HTTP请求吗?
在理解了第一个问题之后,这个问题已经有了答案。如果保持连接,则TCP连接可以发送多个HTTP请求。
第三个问题
可以将TCP连接中的HTTP请求一起发送(例如,一起发送三个请求,并一起接收三个响应)?
HTTP/1.1存在问题。单个TCP连接一次只能处理一个请求,这意味着两个请求的生命周期不能重叠。从任何两个HTTP请求的任何开始到结束的时间不能在同一TCP连接中。重叠。
尽管在HTTP/1.1规范中指定了Pipelining以尝试解决此问题,但默认情况下,此功能在浏览器中处于关闭状态。
让我们首先看一下Pipelining是什么,如RFC 2616中所规定:
支持持久连接的客户端可以“管道化”其请求(即,在不等待每个响应的情况下发送多个请求)。服务器必须按照收到索赔的顺序发送对这些请求的响应。端点可以在一个连接中发送多个请求(无需等待任何请求的响应)。接收请求的服务器必须按接收顺序发送响应。
至于为什么标准设置到目前为止,我们可能推测一个原因:由于HTTP/1.1是文本协议,并且返回的内容不区分发送哪个请求,因此顺序必须一致。例如,如果向服务器发送两个请求,GET/query?q=A和GET/query?q=B,则服务器返回两个结果。浏览器无法根据响应判断响应对应的响应。流水线这个想法似乎更好,但实践中存在许多问题:
某些代理服务器无法正确处理HTTP管道传输。
正确的管道实现很复杂。
行头阻塞:建立TCP连接后,假设客户端在此连接上连续向服务器发送多个请求。按照标准,服务器应按接收请求的顺序返回结果。假设服务器花费大量时间处理第一个请求,所有后续请求都需要等待第一个请求在响应之前完成。
因此,现代浏览器默认情况下不启用HTTP Pipelining。
但是,HTTP2提供了多路复用多播功能,允许在单个TCP连接上同时进行多个HTTP请求。至于如何实现多路复用,这是另一个问题。我们来看看使用HTTP2的效果。
致命链问:TCP连接可以发送多少HTTP请求?
绿色是发起请求返回请求的等待时间,蓝色是响应的下载时间。可以看出,所有都在同一个Connection中并且是并行完成的。
所以这个问题也有一个答案:HTTP/1.1中的流水线技术可以完成多个请求的同时执行,但由于浏览器默认关闭,因此可以认为它不可行。由于Multiplexing功能,可以在HTTP2中的同一TCP连接上并行进行多个HTTP请求。
那么在HTTP/1.1时代,浏览器如何提高页面加载效率?有两个要点:
与已建立的服务器保持TCP连接,在同一连接上按顺序处理多个请求。
与服务器建立多个TCP连接。
第四个问题
为什么我有时需要在刷新页面时重新建立SSL连接?
在第一个问题的讨论中已经有了答案。有时,浏览器和服务器会维护TCP连接。 TCP不需要重新建立,SSL自然会使用前一个。
第五个问题
浏览器可以对同一主机建立的TCP连接数量是否有限制?
假设我们仍处于HTTP/1.1时代。那时,没有多路复用。如果浏览器获得包含数十个图像的网页,我该怎么办?它不能仅以TCP连接顺序下载,因此用户必须等待它。这很难接受,但如果每张图片都有TCP连接并发送HTTP请求,那么计算机或服务器可能无法接受它。如果有1000张图片,则无法打开1000个TCP连接。您的计算机同意NAT并不一定意味着同意。所以答案是:是的。 Chrome允许最多六个TCP连接到同一主机。不同浏览器之间存在一些差异。
https://developers.google.com/web/tools/chrome-devtools/network/issues#queued-or-stalled-requestsdevelopers.google.com
回到问题的开头,如果收到的HTML包含几十个图像标签,如何以及以什么顺序,建立了多少连接,以及使用什么协议下载它们?
如果图像都是HTTPS连接并且位于相同的域名下,则浏览器将能够在SSL握手后使用HTTP2,如果可能,使用Multiplexing功能在此连接上进行多路复用。但是,没有必要使用TCP连接获取挂在此域名上的所有资源,但可以肯定可能会使用多路复用。
如果您发现无法使用HTTP2,或者您无法使用HTTPS(实际上HTTP2是在HTTPS上实现的,那么您只能使用HTTP/1.1)。浏览器将在HOST上创建多个TCP连接。最大连接数取决于浏览器设置。如果所有连接都在发送请求,则浏览器使用这些连接在空闲时发送新请求。什么?其他请求只能等待。
IT外包
>
400-635-8089
立即
咨询
电话咨询
服务热线
400-635-8089
微信咨询
微信咨询
微信咨询
公众号
公众号
公众号
返回顶部