Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HTTP/2 与 HTTP/3 #38

Open
ChuChencheng opened this issue Feb 28, 2020 · 1 comment
Open

HTTP/2 与 HTTP/3 #38

ChuChencheng opened this issue Feb 28, 2020 · 1 comment

Comments

@ChuChencheng
Copy link
Owner

ChuChencheng commented Feb 28, 2020

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 使用专门开发的 HPACK 算法,在客户端和服务器两端建立字典,用索引号表示重复的字符串,采用哈夫曼编码来压缩整数和字符串
  • 客户端与服务端共同维护一个“首部表”来跟踪头部信息的更新,相同的数据不必在每个请求中都发送
  • 首部表在 HTTP/2 连接存续期间始终存在,由客户端与服务端共同渐进更新
  • 每个新的首部键值对要么追加在当前表的末尾,要么替换原有的值

多路复用

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 协议特点:

  • 实现了类似TCP的流量控制、传输可靠性的功能。
  • 实现了快速握手功能。
  • 集成了TLS加密功能。
  • 多路复用,彻底解决TCP中队头阻塞的问题。

参考

@ChuChencheng
Copy link
Owner Author

有关于 HTTP/2.0 多路复用

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

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

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

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

参考

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant