Skip to content

TCP和HTTP请求之间有什么关系?

参考答案:

我们知道开启一个TCP链接之后,HTTP请求就会并行发出。 首先我们来思考一个问题,浏览器与服务器建立一个TCP链接之后,会不会在完成一个HTTP请求后立马断开?

  • HTTP/1.0的时候是会的,需要手动设置Connection: keep-alive
  • HTTP/1.1的时候Connection默认为keep-alive 。

一般情况下,复用的 TCP连接在等待设置的超时时间之后还没有被任何连接使用的话,就会主动断开

一个TCP链接可以对应多少个HTTP请求?

一个TCP链接可以对应多个HTTP请求,只要这个TCP链接没有断开,就可以发送HTTP请求。

这些HTTP请求可以同时发送,同时响应么,在一个TCP链接中?比如:三个HTTP请求同时发送,同时接收响应。

在HTTP/1.1中,单个TCP链接在同一时刻只能处理一个请求,意思就是:任意两个 HTTP 请求从开始到结束的时间在同一个 TCP链接里不能重叠。HTTP/1.1 规范中规定了 Pipelining 来试图解决这个问题, 但是浏览器默认关闭了这个功能。

原因:

  • 一些代理服务器不能正确的处理 HTTP Pipelining。
  • 正确的流水线实现是复杂的。
  • Head-of-line Blocking 连接头阻塞:在建立起一个 TCP 连接之后,假设客户端在这个连接连续向服务器发送了几个请求。按照标准,服务器应该按照收到请求的顺序返回结果,假设服务器在处理首个请求时花费了大量时间,那么后面所有的请求都需要等着首个请求结束才能响应。

HTTP/2.0 提供了Multiplexing 多路传输(多路复用)。可以在一个TCP链接中同时发起多个HTTP请求,同时响应多个HTTP请求。

所以,解决办法也就出现了:

  • HTTP/1.1 中可以利用 Pipelining。
  • 重用TCP

浏览器http请求的并发性是如何体现的?并发请求的数量有没有限制?

有人会说,我们客户端发起HTTP请求明明是异步,并行发送的。怎么到你这里就一个一个发送,一个一个响应了?

其实浏览器会同时与服务器建立多个TCP链接,来支持多个HTTP同时请求的。

就例如:Chrome浏览器最多允许对同一个域名Host建立6个TCP连接,不同的浏览器有所区别。

补充

关于HTTPS如果图片都是HTTPS的连接,并且在同一域名下,浏览器会先和服务器协商使用HTTP2Multiplexing功能进行多路传输,不过未必所有的挂在这个域名下的资源都会使用同一个TCP连接。如果用不了HTTPS或者HTTP2(HTTP2是在HTTPS上实现的),那么浏览器会就在同一个host建立多个TCP连接,每一个TCP连接进行顺序请求资源。

题目要点:

当浏览器与服务器建立TCP连接后,HTTP请求的发送和响应行为取决于HTTP版本和浏览器设置。以下是关于TCP连接和HTTP请求的一些关键点:

  1. TCP连接的复用
    • HTTP/1.0:默认情况下,每个HTTP请求都会建立一个新的TCP连接,并在请求完成后立即关闭。可以通过设置Connection: keep-alive头部来保持连接。
    • HTTP/1.1:默认支持长连接(Connection: keep-alive),浏览器和服务器之间可以复用同一个TCP连接。
  2. TCP连接的关闭
    • 如果在等待超时时间后,连接未被使用,它会自动断开。
  3. HTTP请求的并发性
    • HTTP/1.1:虽然单个TCP连接在同一时刻只能处理一个请求,但浏览器可以同时与服务器建立多个TCP连接,从而支持并发请求。
    • HTTP/2.0:引入了多路复用(Multiplexing),允许在一个TCP连接中同时发送和接收多个请求和响应。
  4. 浏览器限制
    • 浏览器对同一个域名Host的TCP连接数量有限制,例如Chrome浏览器最多允许建立6个TCP连接。
  5. HTTPS和HTTP/2.0
    • 如果资源都是HTTPS连接,并且处于同一域名下,浏览器会尝试使用HTTP/2.0的多路复用功能。
    • 如果无法使用HTTP/2.0,浏览器会在同一个host建立多个TCP连接,每个连接按顺序请求资源。

HTTP/1.1通过长连接和浏览器的多连接支持实现了并发性,而HTTP/2.0通过多路复用进一步提高了效率。浏览器和服务器之间的TCP连接管理和HTTP请求的并发性是确保高效网页性能的关键因素。