关于HTTP/2,最近你可能没少听到过他,首先,若是你了解过Java 9的特性,那么你会发如今Java9中,提供了新的方式来处理HTTP调用,提供了新的HTTP Client,将替代HttpURLConnection,并提供对WebSocket和HTTP/2
的支持。还有前两天刚刚发布的Spring Boot 2.0 的新特性中,也会看到,Spring Boot 2.0支持的Web容器中Tomcat、Undertow和Jetty均已支持HTTP/2。php
那么,这篇文章,咱们就来了解下,到底什么是HTTP/2。html
超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协做式和超媒体信息系统的应用层协议。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。经过HTTP或者HTTPS协议请求的资源由统一资源标识符(Uniform Resource Identifiers,URI)来标识。算法
HTTP 协议是以 ASCII 码传输,基于请求与响应模式的、无状态的,创建在 TCP/IP 协议之上的应用层规范。。它不涉及数据包(packet)传输,主要规定了客户端和服务器之间的通讯格式,默认使用80端口。浏览器
HTTP协议主要的版本有3个,分别是HTTP/1.0、HTTP/1.1和HTTP/2。HTTPS是另一个协议,简单讲是HTTP的安全版。缓存
1996年5月,HTTP/1.0 版本发布,为了提升系统的效率,HTTP/1.0规定浏览器与服务器只保持短暂的链接,浏览器的每次请求都须要与服务器创建一个TCP链接,服务器完成请求处理后当即断开TCP链接,服务器不跟踪每一个客户也不记录过去的请求。安全
请注意上面提到的HTTP/1.0中浏览器与服务器只保持短暂的链接,链接没法复用。也就是说每一个TCP链接只能发送一个请求。发送数据完毕,链接就关闭,若是还要请求其余资源,就必须再新建一个链接。服务器
咱们知道TCP链接的创建须要三次握手,是很耗费时间的一个过程。因此,HTTP/1.0版本的性能比较差。如今,随便打开一个网页,上面都会有不少图片、视频等资源,HTTP/1.0显然没法知足性能要求。网络
为了解决HTTP/1.0存在的缺陷,HTTP/1.1于1999年诞生。相比较于HTTP/1.0来讲,最主要的改进就是引入了持久链接。所谓的持久链接就是:在一个TCP链接上能够传送多个HTTP请求和响应,减小了创建和关闭链接的消耗和延迟。tcp
引入了持久链接以后,在性能方面,HTTP协议有了明显的提高,基本能够用于平常使用,这也是这一版本一直延用至今的缘由。固然仍是有些力不从心的,后面会详细介绍。分布式
关于HTTP/1.0和HTTP/1.1还有些其余区别,这里就不展开介绍了。网上也不少资料,能够自行查阅。
虽然,HTTP/1.1在HTTP/1.0的基础上提供了持久链接,提高了很大的效率,可是,仍是有很大的提高空间。
正所谓时势造英雄,正是由于HTTP存在着诸多不足,因此,才诞生了SPDY。2009年,谷歌公开了自行研发的 SPDY 协议,主要解决 HTTP/1.1 效率不高的问题。它的设计目标是下降 50% 的页面加载时间。SPDY主要提供了如下功能(后文介绍HTTP2的时候再详细介绍):
SPDY位于HTTP之下,TCP和SSL之上,这样能够轻松兼容老版本的HTTP协议。
实际上在 HTTP2 提出来以前,SPDY 流行了很长一段时间。当下不少著名的互联网公司都在本身的网站或 APP 中采用了 SPDY 系列协议(当前最新版本是 SPDY/3.1),由于它对性能的提高是显而易见的。主流的浏览器(谷歌、火狐、Opera)也都早已经支持 SPDY,它已经成为了工业标准。HTTP Working-Group 最终决定以 SPDY/2 为基础,开发 HTTP/2。
下图是Akamai 公司创建的一个官方的演示,主要用来讲明在性能上HTTP/1.1和HTTP/2在性能升的差异。同时请求 379 张图片,HTTP/1.1加载用时4.54s,HTTP/2加载用时1.47s。
HTTP/2 是 HTTP 协议自 1999 年 HTTP 1.1 发布后的首个更新,主要基于 SPDY 协议。由互联网工程任务组(IETF)的 Hypertext Transfer Protocol Bis(httpbis)工做小组进行开发。该组织于2014年12月将HTTP/2标准提议递交至IESG进行讨论,于2015年2月17日被批准。HTTP/2标准于2015年5月以RFC 7540正式发表。
下面来看下,HTTP/2相对于HTTP/1.1有哪些改进:
在HTTP/2中,在应用层(HTTP2.0)和传输层(TCP或者UDP)之间加了一层:二进制分帧层。这是HTTP2中最大的改变。HTTP2之因此性能会比HTTP1.1有那么大的提升,很大程度上正是因为这一层的引入。
在二进制分帧层中, HTTP/2 会将全部传输的信息分割为更小的消息和帧(frame),并对它们采用二进制格式的编码。
这种单链接多资源的方式,减小了服务端的压力,使得内存占用更少,链接吞吐量更大。并且,TCP链接数的减小使得网络拥塞情况得以改善,同时慢启动时间的减小,使拥塞和丢包恢复速度更快。
多路复用容许同时经过单一的HTTP/2.0链接发起多重的请求-响应消息。在HTTP1.1协议中,浏览器客户端在同一时间,针对同一域名下的请求有必定数量的限制,超过了这个限制的请求就会被阻塞。而多路复用容许同时经过单一的 HTTP2.0 链接发起多重的“请求-响应”消息。
HTTP2的请求的TCP的connection一旦创建,后续请求以stream的方式发送。每一个stream的基本组成单位是frame(二进制帧)。客户端和服务器能够把 HTTP 消息分解为互不依赖的帧,而后乱序发送,最后再在另外一端把它们从新组合起来。
也就是说, HTTP2.0 通讯都在一个链接上完成,这个链接能够承载任意数量的双向数据流。就比如,我请求一个页面 http://www.hollischuang.com 。页面上全部的资源请求都是客户端与服务器上的一条 TCP 上请求和响应的!
HTTP/1.1的header带有大量信息,并且每次都要重复发送。HTTP/2 为了减小这部分开销,采用了HPACK 头部压缩算法对Header进行压缩。
简单来说就是当用户的浏览器和服务器在创建链接后,服务器主动将一些资源推送给浏览器并缓存起来的机制。有了缓存,当浏览器想要访问已缓存的资源的时候就能够直接从缓存中读取了。
HTTP2.0 的总结 HTTP 1.0/1.1/2.0、HTTPS HTTP2.0,SPDY,HTTPS你应该知道的一些事 HTTP2.0关于多路复用的研究