Open ChuChencheng opened 4 years ago
有关于 HTTP/2.0 多路复用
在 HTTP/1.1 中,如果要并发多个请求,需要开多个 TCP 连接,每个 TCP 连接中同一时刻只能处理一个请求。
而使用管线化技术,虽然可以同时发送多个请求,但响应的顺序需要与请求发送的顺序一致,而有队头阻塞问题(HTTP)。
HTTP/2.0 的多路复用,就能解决上述 HTTP 队头阻塞问题。 HTTP/2.0 传输的数据是二进制帧,每个 TCP 连接都承载着双向流通的流,每一个流都有一个独一无二的标识和优先级,而流就是由二进制帧组成的。二进制帧的头部信息会标识自己属于哪一个流,所以这些帧可以交错传输。
但是 HTTP/2.0 无法解决 TCP 的队头阻塞问题。
HTTP/1.1 的缺陷
队头阻塞
虽然长连接可以减少 TCP 握手的次数,但是 HTTP 请求的发送是按顺序的,当前请求没有响应就不会发送下一个请求,这样就会导致队头阻塞,降低页面加载速度。
解决方案:
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 协议特点:
参考