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