Hibop.github.io icon indicating copy to clipboard operation
Hibop.github.io copied to clipboard

关于http1.0-1.1-2.0 对请求并发数和tcp连接

Open Hibop opened this issue 6 years ago • 0 comments

Q:

  • 浏览器与服务器建立一个TCP连接后,是否会在完成一个http请求后断开?什么条件下会断开?

  • 一个TCP连接可以同时发送几个HTTP请求?

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

  • 总:: 从 URL 在浏览器被被输入到页面展现的过程中发生了什么?

  • 展开::网页中的图片资源为什么分放在不同的域名下?

一、浏览器与服务器建立一个TCP连接后,是否会在完成一个http请求后断开?什么条件下会断开?

在 HTTP/1.0 中,一个服务器在发送完一个 HTTP 响应后,会断开 TCP 链接。但是这样每次请求都会重新建立和断开 TCP 连接,代价过大。所以虽然标准中没有设定,某些服务器对 Connection: keep-alive 的 Header 进行了支持。意思是说,完成这个 HTTP 请求之后,不要断开 HTTP 请求使用的 TCP 连接。这样的好处是连接可以被重新使用,之后发送 HTTP 请求的时候不需要重新建立 TCP 连接,以及如果维持连接,那么 SSL 的开销也可以避免。

持久连接:既然维持 TCP 连接好处这么多,HTTP/1.1 就把 Connection 头写进标准,并且默认开启持久连接,除非请求中写明 Connection: close,那么浏览器和服务器之间是会维持一段时间的 TCP 连接,不会一个请求结束就断掉。

A: 默认情况下建立 TCP 连接不会断开,只有在请求报头中声明 Connection: close 才会在请求完成后关闭连接。

二、一个 TCP 连接可以同时发送几个 HTTP 请求?

  • 维持连接,一个 TCP 连接是可以发送多个 HTTP 请求的。

  • HTTP/1.1 存在一个问题:单个 TCP 连接在同一时刻只能处理一个请求; 虽然 HTTP/1.1 规范中规定了 Pipelining 来试图解决这个问题,但是这个功能在浏览器中默认是关闭的。 image

  • HTTP2 提供了 Multiplexing 多路传输特性,可以在一个 TCP 连接中同时完成多个 HTTP 请求。 多路复用也有弊端吧,基于TCP也受限于TCP,若TCP丢包,整个TCP需要等待重传,这会造成后边数据阻塞?所以谷歌就整了一个既基于TCP又基于UDP的HTTP3(基于QUIC)。

A: 在 HTTP/1.1 存在 Pipelining 技术可以完成这个多个请求同时发送,但是由于浏览器默认关闭,所以可以认为这是不可行的。在 HTTP2 中由于 Multiplexing 特点的存在,多个 HTTP 请求可以在同一个 TCP 连接中并行进行。

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

页面资源请求时,浏览器会同时和服务器建立多个TCP连接,在同一个TCP连接上顺序处理多个HTTP请求。所以浏览器的并发性就体现在可以建立多个TCP连接,来支持多个http同时请求。

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

link

  • https://zhuanlan.zhihu.com/p/61423830

Hibop avatar Dec 11 '19 02:12 Hibop