ChuChencheng / note

菜鸡零碎知识笔记
Creative Commons Zero v1.0 Universal
3 stars 0 forks source link

HTTP/2 与 HTTP/3 #38

Open ChuChencheng opened 4 years ago

ChuChencheng commented 4 years ago

HTTP/1.1 的缺陷

队头阻塞

虽然长连接可以减少 TCP 握手的次数,但是 HTTP 请求的发送是按顺序的,当前请求没有响应就不会发送下一个请求,这样就会导致队头阻塞,降低页面加载速度。

解决方案:

  1. 将资源分散到不同域名。浏览器对每个域名有 TCP 连接数量限制,对同一个域名,在 Chrome 下最多允许同时建立 6 个 TCP 连接。将资源分散到不同域名,可以提高同时建立 TCP 连接的数量。
  2. 雪碧图。将多个小图片组合成一个图片,减少网络请求。
  3. 使用内联写法。将样式表与脚本以内联的形式写在 HTML 中,减少网络请求。

HTTP 头部信息巨大

由于无状态的特性,每次发送的 HTTP 请求都要带上一个巨大的头部,即使请求体或者响应体的内容非常少。

明文传输

HTTP/1.1 传输内容使用的是明文,会带来安全性隐患。

HTTP/2 新特性

HTTP/2 基于 Google 开发的 SPDY 协议,目的是提高性能。

二进制传输

HTTP/2 采用二进制格式传输数据,相比于 HTTP/1.1 使用纯文本形式的报文,二进制协议解析更高效。 HTTP/2 将请求数据与响应数据分割为更小的帧,多个帧可以乱序发送,根据帧首部的流标识重新组装。

Header 压缩

多路复用

HTTP/2 实现多路复用,同一个域名可以只占用一个 TCP 连接,可以在一个 TCP 连接里传输所有的数据。

主动推送

在 HTTP/1.1 中,服务端只能被动响应请求,请求由客户端发起。

在 HTTP/2 中,服务端可以主动推送资源到客户端,例如,在浏览器请求 HTML 文件时,把相应的脚本、 CSS 也推送到浏览器,而不必等待浏览器解析 HTML 的时候再发送。

客户端也可选择是否接收服务端的主动推送。

主动推送也遵守同源策略,服务端不能随便将第三方资源推送给客户端,而需要经过双方确认。

安全性

HTTP/2 实际上兼容 HTTP/1.1 的明文传输,不强制加密,但 HTTPS 是趋势,互联网上见到的 HTTP/2 都是使用的 HTTPS ,所以 HTTP/2 在事实上是加密的。

HTTP/2 缺点

建立 TCP 协议的时延

HTTP/2 也是基于 TCP 的,意味着无法避免 TCP 握手的过程。

另外,如果使用 HTTPS ,则还要加上 TLS 的握手过程。

TCP 队头阻塞

虽然减少了 TCP 的连接数量,但是没有解决 TCP 队头阻塞的问题。

TCP 有丢包重传的机制,当出现丢包时,整个 TCP 连接都要等待重传,在这种情况下, HTTP/2 的延迟可能还高于有多个 TCP 连接的 HTTP/1.1 。

HTTP/3 新特性

要避免 TCP 队头阻塞的问题,只能不用 TCP 。

Google 开发了基于 UDP 的 QUIC 协议

QUIC 协议特点:

参考

ChuChencheng commented 4 years ago

有关于 HTTP/2.0 多路复用

在 HTTP/1.1 中,如果要并发多个请求,需要开多个 TCP 连接,每个 TCP 连接中同一时刻只能处理一个请求。

而使用管线化技术,虽然可以同时发送多个请求,但响应的顺序需要与请求发送的顺序一致,而有队头阻塞问题(HTTP)。

HTTP/2.0 的多路复用,就能解决上述 HTTP 队头阻塞问题。 HTTP/2.0 传输的数据是二进制帧,每个 TCP 连接都承载着双向流通的流,每一个流都有一个独一无二的标识和优先级,而流就是由二进制帧组成的。二进制帧的头部信息会标识自己属于哪一个流,所以这些帧可以交错传输。

但是 HTTP/2.0 无法解决 TCP 的队头阻塞问题。

参考