# HTTP 1.0 和 2.0 有什么区别?
9 min read
Table of Contents
HTTP 1.0 和 2.0 有什么区别?
HTTP/1.0 与 HTTP/2.0 核心区别详解
【核心定义】
HTTP/2.0 是 HTTP/1.0/1.1 协议的二进制、多路复用、头部压缩的重大升级版本,旨在解决 HTTP/1.x 时代因文本协议、队头阻塞和低效头部传输导致的网络性能瓶颈。
【关键要点】
-
二进制分帧层 vs 文本协议
- HTTP/1.0/1.1: 基于文本(ASCII)的协议,请求和响应消息都是可读的文本格式,解析复杂且容易出错。
- HTTP/2.0: 引入二进制分帧层,将所有传输的信息分割为更小的消息和帧(Frame),并采用二进制格式编码。帧是通信的最小单位,承载着特定类型的数据,如 HEADERS 帧、DATA 帧等。二进制协议解析更高效、更紧凑,且减少了错误。
-
多路复用 vs 单连接串行/有限并发
- HTTP/1.0: 每个 TCP 连接只能处理一个请求-响应周期(短连接),严重浪费资源。
- HTTP/1.1: 引入了持久连接(默认
Connection: keep-alive)和管道化(Pipelining),但管道化存在队头阻塞问题,且浏览器默认禁用。实际中通过开启多个 TCP 连接(通常6-8个)来实现并发,但连接建立成本高。 - HTTP/2.0: 真正的多路复用。在单个 TCP 连接上,可以同时交错发送多个请求和响应消息,而不会互相阻塞。每个请求/响应流被分配一个唯一的流ID,帧通过流ID进行关联和重组。这彻底解决了 HTTP/1.x 的队头阻塞问题,极大提升了连接利用率和页面加载速度。
-
头部压缩(HPACK)
- HTTP/1.x: 头部以纯文本形式发送,且每个请求都携带大量重复的头部字段(如Cookie、User-Agent),导致冗余和带宽浪费。
- HTTP/2.0: 采用 HPACK 压缩算法。其原理是:
- 静态表: 包含61个高频出现的头部字段及其常见值。
- 动态表: 在连接生命周期内,将首次出现的头部字段添加到动态表中,后续传输只需发送索引号。
- 哈夫曼编码: 对字面值进行高效压缩。 这通常能将头部大小减少85%以上。
-
服务器推送
- HTTP/1.x: 服务器只能被动响应客户端请求。
- HTTP/2.0: 服务器可以主动向客户端推送资源,而无需客户端明确请求。例如,当客户端请求一个 HTML 页面时,服务器可以预测并同时推送该页面所需的 CSS 和 JS 文件,减少额外的往返延迟。
-
流优先级
- HTTP/2.0: 允许客户端为每个流指定优先级(依赖关系和权重),告知服务器哪些资源更重要(如CSS优先于图片)。服务器可以根据优先级优化资源分配,确保关键资源优先传输。
【深度推导/细节】
核心矛盾:队头阻塞的演进与解决
- HTTP/1.1 管道化的队头阻塞: 在管道化中,请求可以批量发送,但响应必须按请求顺序返回。如果第一个请求的处理很慢(如一个复杂查询),它会阻塞后续所有已发送请求的响应,即使后续资源已准备就绪。
- HTTP/2 多路复用如何解决: 通过二进制分帧,将每个请求/响应分解为多个独立的帧。这些帧可以乱序发送和接收,然后在客户端根据流ID重新组装。慢请求的 DATA 帧不会阻塞其他流的帧传输,从而在应用层消除了队头阻塞。
注意:HTTP/2 解决了应用层的队头阻塞,但底层 TCP 协议本身的队头阻塞(一个TCP包丢失会阻塞该连接上所有后续包的重传)依然存在。这是后来QUIC/HTTP3要解决的问题。
性能优化数字与设计合理性
- 多个TCP连接(通常6个): 这是浏览器在 HTTP/1.1 下的妥协方案,用以绕过单连接串行限制。但每个连接都有TCP握手、慢启动开销,且占用服务器和客户端资源。
- 单个TCP连接: HTTP/2 的设计目标就是用一个连接承载所有流量。这减少了连接管理开销,更符合TCP拥塞控制的本意(公平性),并能更好地利用带宽。
【关联/对比】
- HTTP/1.1 与 HTTP/2 的兼容性: HTTP/2 没有改变 HTTP 的语义(方法、状态码、URI等),只是改变了传输格式。它通常通过 TLS(
h2)或基于 TCP(h2c)协商升级。 - HTTP/2 与 HTTPS: 虽然协议本身不强制加密,但所有主流浏览器(Chrome, Firefox)只支持基于 TLS 的 HTTP/2(即
h2),这推动了全站 HTTPS 的普及。 - HTTP/2 与 HTTP/3(QUIC): HTTP/3 是下一代协议,它基于 UDP 的 QUIC 协议,旨在彻底解决 TCP 层的队头阻塞。HTTP/2 的多路复用等高级特性被继承,但传输层被替换。
『面试官追问』
-
HTTP/2 的多路复用如何实现的?画一下帧、流、消息的关系图。
- 答: 流是连接中的一个虚拟信道,承载双向消息。消息是对应逻辑请求或响应的完整帧序列。帧是最小通信单位。一个消息(如响应)可能被拆成多个 DATA 帧发送。所有帧都共享一个TCP连接,通过帧头中的流ID来区分归属。
-
HPACK 压缩原理是什么?静态表和动态表有什么区别?
- 答: 如上文所述。静态表是预定义的、只读的。动态表是连接特有的、可变的,通过索引号实现增量编码。
-
服务器推送有什么缺点或注意事项?
- 答: 可能推送客户端已缓存的资源,造成浪费。客户端可以拒绝不需要的推送流(发送 RST_STREAM 帧)。需要精心设计推送策略。
-
既然 HTTP/2 这么好,为什么没有完全取代 HTTP/1.1?
- 答: 中间设备(如老旧代理、防火墙)可能不支持或错误处理二进制帧;对于非常简单的请求,建立 TLS 连接(
h2必须)的开销可能抵消其优势;服务器和客户端实现复杂度更高。
- 答: 中间设备(如老旧代理、防火墙)可能不支持或错误处理二进制帧;对于非常简单的请求,建立 TLS 连接(
-
HTTP/2 还有队头阻塞吗?
- 答: 应用层(HTTP层)的队头阻塞已解决。但传输层(TCP层)的队头阻塞依然存在。这是 HTTP/3 要解决的核心问题。
总结陈述: HTTP/2 通过二进制分帧、多路复用、头部压缩、服务器推送和流优先级这五大核心特性,对 HTTP/1.x 进行了革命性升级,显著降低了延迟,提升了带宽利用率和网络性能,为现代Web应用提供了强大的基础协议支持。