http2解决了哪些问题_http2的特性
HTTP/2(最初称为 SPDY)是 HTTP 协议的第二个主要版本,它在 HTTP/1.1 的基础上进行了重大改进,旨在解决其在性能和效率方面的诸多瓶颈。以下是 HTTP/2 主要解决的问题:
队头阻塞(Head-of-Line Blocking)问题:
- HTTP/1.1 的问题:在 HTTP/1.1 中,虽然可以建立多个 TCP 连接来并行请求资源,但每个连接内部的请求是串行处理的。如果一个请求的响应很慢,它会阻塞后续请求的响应(尤其是在使用 keep-alive 时),造成“队头阻塞”。
- HTTP/2 的解决方案:引入了多路复用(Multiplexing)。所有请求和响应都在同一个 TCP 连接上通过流(Stream)、消息(Message) 和帧(Frame) 的分层结构并行传输。每个流都有唯一的 ID,帧可以交错发送并重新组装,从而彻底解决了应用层(HTTP层)连接内部的队头阻塞问题。
减少延迟和提升页面加载速度:
- HTTP/1.1 的问题:为了克服串行请求的限制,浏览器通常会为一个站点建立 6-8 个并发 TCP 连接。这不仅增加了建立连接的开销(TCP 握手、TLS 握手),还可能导致网络拥塞。
- HTTP/2 的解决方案:通过多路复用,一个 TCP 连接就足以处理所有资源的并行请求和响应。这大大减少了连接建立的开销和延迟,提高了网络资源的利用率,从而显著提升了页面加载速度。
头部信息冗余和传输开销大:
- HTTP/1.1 的问题:HTTP 头部信息(如 Cookie、User-Agent 等)通常很大且重复,每次请求都必须完整发送,占用了大量带宽,尤其在移动端或高延迟网络中影响明显。
- HTTP/2 的解决方案:采用了HPACK 压缩算法对 HTTP 头部进行压缩。客户端和服务器都维护一个头部字段的索引表,只传输索引和增量信息,极大地减少了头部传输的数据量。
服务器被动响应,无法主动推送资源:
- HTTP/1.1 的问题:服务器只能被动地响应客户端的请求。如果客户端请求一个 HTML 页面,服务器返回后,客户端需要再次请求其中的 CSS、JavaScript、图片等资源,增加了往返次数(RTT)。
- HTTP/2 的解决方案:引入了服务器推送(Server Push) 功能。服务器可以在客户端请求一个资源时,主动将它预测客户端接下来会需要的资源(如 HTML 页面依赖的 CSS 和 JS 文件)一并推送给客户端,减少了客户端发现和请求这些资源的延迟。
请求效率低下:
- HTTP/1.1 的问题:请求必须等待响应才能发出下一个(在单个连接上),或者需要复杂的连接管理来实现并发。
- HTTP/2 的解决方案:除了多路复用带来的并行性,HTTP/2 还允许客户端发送优先级(Priority) 信息,告知服务器哪些资源更重要,需要优先处理和传输,从而更智能地分配带宽。
总结来说,HTTP/2 的核心改进在于:
- 多路复用:解决队头阻塞,实现真正的并行。
- 二进制分帧层:将消息分解为更小的帧,支持多路复用和优先级。
- 头部压缩(HPACK):减少不必要的数据传输。
- 服务器推送:允许服务器主动发送资源。
- 请求优先级:优化资源传输顺序。