HTTP/2

来自站长百科
跳转至: 导航、​ 搜索

HTTP/2是HTTP协议的第二个主要版本,设计目标是提升网络传输性能和效率。它在保留HTTP/1.x的核心概念的同时,引入了一些重要的新特性,主要用于改善网页加载速度和用户体验。

HTTP/2发展历史[ ]

  • HTTP/0.9:这是最早的原型,发布于1991年,仅支持GET方法,不支持MIME类型和各种HTTP首部等。
  • HTTP/1.0:发布于1996年,引入了多种方法和首部,支持多媒体对象的处理,丰富了浏览器与服务器的互动手段。
  • HTTP/1.1:于1999年正式发布,完善了结构性缺陷,明确了语义,支持更复杂的Web应用,至今仍被广泛使用。
  • SPDY:由Google开发,旨在解决HTTP/1.1效率不高的问题,于2009年公开,到2016年初结束使命,因为HTTP/2已被IETF标准化。
  • HTTP/2:最新的HTTP协议,于2015年5月份正式发布,主流浏览器均已支持。

HTTP/2主要特性[ ]

1、多路复用(Multiplexing)

HTTP/2允许在一个连接上并发处理多个请求和响应,而不需要等待前一个请求完成。减少了因队头阻塞(Head-of-Line Blocking)引起的延迟,从而提高了网络效率。

2、头部压缩(Header Compression)

HTTP/2使用HPACK压缩算法对HTTP头部信息进行压缩,减少数据传输量。减小了请求和响应的开销,尤其在重复的请求中,压缩效果显著。

3、服务器推送(Server Push)

服务器可以主动向客户端推送资源,而不仅仅是响应客户端的请求,预加载页面上可能需要的资源,提高页面加载速度。

4、二进制分帧(Binary Framing)

HTTP/2将数据转换为二进制格式并分成小的帧进行传输。比 HTTP/1.x 的文本格式更高效,能够更好地处理网络流量。

5、流量控制(Flow Control)

HTTP/2允许客户端和服务器对数据流进行流量控制,以避免过度的数据传输。优化了带宽的使用,防止数据传输过程中的拥塞和丢包。

6、优先级(Prioritization)

HTTP/2允许客户端为不同的请求设置优先级,以便服务器可以优先处理重要的资源。提高了重要资源的加载速度,优化了用户体验。

兼容性与实施[ ]

  • 向下兼容:HTTP/2 设计为与 HTTP/1.x 兼容,因此可以在支持 HTTP/2 的服务器和客户端之间进行无缝升级。
  • 使用 HTTPS:尽管 HTTP/2 规范本身不强制要求使用 HTTPS,但大多数浏览器和服务器将 HTTP/2 实现与 HTTPS 结合使用,以提升安全性。

性能改进[ ]

  • 减少延迟:通过多路复用和服务器推送技术,HTTP/2 大幅减少了页面加载的延迟。
  • 更高效率:二进制分帧和头部压缩降低了数据传输量,提升了带宽利用率。
  • 优化用户体验:流量控制和优先级机制使得重要资源可以优先加载,从而改善用户体验。

实施情况[ ]

  • 浏览器支持:现代主流浏览器(如 Chrome、Firefox、Safari 和 Edge)均支持 HTTP/2。
  • 服务器支持:大多数现代 web 服务器(如 Apache、Nginx 和 IIS)都支持 HTTP/2。

协议制定[ ]

协议制定伊始,工作组章程关注了下列目标和受关心的问题:

1、创建一个协商协议标准,即应用层协议协商(ALPN),以便客户端能够从HTTP/1.0、HTTP/1.1、HTTP/2乃至其他非HTTP协议中做出选择。

2、与HTTP/1.1在请求方法、状态码乃至URI和绝大多数HTTP头部字段等方面保持高度兼容性。

3、通过以下举措,减少网络延迟,提高浏览器的页面加载速度:

  • 对HTTP头字段进行数据压缩(即HPACK算法);
  • HTTP/2 服务端推送(Server Push);
  • 请求管线化;
  • 修复HTTP/1.0版本以来未修复的队头阻塞问题;
  • 对数据传输采用多路复用,让多个请求合并在同一TCP连接内。

4、支持现有的HTTP应用场景,包括桌面和移动设备浏览器,网络API,不同规格的网络服务器和正向代理、反向代理服务器软件,防火墙,CDN等。

HPACK算法[ ]

HPACK算法是新引入HTTP/2的一个算法,用于对HTTP头部做压缩。其原理在于:

  • 客户端与服务端根据RFC 7541的附录A,维护一份共同的静态字典(Static Table),其中包含了常见头部名及常见头部名称与值的组合的代码;
  • 客户端和服务端根据先入先出的原则,维护一份可动态添加内容的共同动态字典(Dynamic Table);
  • 客户端和服务端根据RFC 7541的附录B,支持基于该静态哈夫曼码表的哈夫曼编码(Huffman Coding)。

相关条目[ ]