Http2.0详解

前言

HTTP/1.1协议为现在网络提供了20年的支持。从那时起,网站已经从静态的、文本驱动的文档发展为交互式的、富媒体的应用程序。在此期间底层协议保持不变这一事实正好说明了它的通用性和能力。但随着网络变得越来越大,它的局限性变得更加明显。我们需要一个替代品,而且我们很快就需要它。 于是HTTP/2诞生了。HTTP/2 于 2015 年初发布,在不改变现有应用程序语义的情况下优化了网站连接。这意味着你可以利用 HTTP/2 的特性,例如更高的性能、更新的错误处理、减少延迟和降低开销,而不需要改动你的您的 Web 应用程序。到目前为止,近 84%的现代浏览器和27% 的所有网站都支持 HTTP/2,而且这些数字还在逐渐增加。

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/2 的最大变化影响了数据在客户端和服务器之间的格式化和传输方式。

二进制数据格式

HTTP/1.1消息以文本传输,都是由起始行,首部和实体正文(可选)组成,各部分之间以文本换行符分隔。这使得请求和响应易于格式化,甚至可以使用数据包分析工具读取。HTTP/2 使用二进制协议封装数据,二进制协议的好处是它允许更紧凑、更容易压缩且不易出错的传输,HTTP/2 将请求和响应数据分割为更小的帧,并且它们采用二进制编码。HTTP/2 中,同域名下所有通信都在单个连接上完成,该连接可以承载任意数量的双向数据流。每个数据流都以消息的形式发送,而消息又由一个或多个帧组成。多个帧之间可以乱序发送,根据帧首部的流标识可以重新组装。

  • 帧:HTTP/2 数据通信的最小单位消息:指 HTTP/2 中逻辑上的 HTTP 消息。例如请求和响应等,消息由一个或多个帧组成。
  • 流:存在于连接中的一个虚拟通道。流可以承载双向消息,每个流都有一个唯一的整数ID。

二进制差别二进制差别

持久 TCP 连接

在 HTTP 的早期版本中,必须为每个请求和响应创建一个新的 TCP 连接。HTTP/1.1 引入了持久连接,允许通过单个连接进行多个请求和响应。问题是消息是按顺序交换的,Web 服务器拒绝接受新的请求,直到之前的请求得到满足。

HTTP/2 允许通过单个 TCP 连接同时进行多个下载,从而简化了这一点。建立连接后,客户端可以发送新请求,同时接收对先前请求的响应。这不仅减少了建立新连接的延迟,而且服务器不再需要维护到相同客户端的多个连接。

复用Tcp连接

Tcp多路复用,代替原来的序列和阻塞机制。所有就是请求的都是通过一个 TCP连接并发完成。 HTTP 1.x 中,如果想并发多个请求,必须使用多个 TCP 链接,且浏览器为了控制资源,还会对单个域名有 6-8个的TCP链接请求限制,如下图,红色圈出来的请求就因域名链接数已超过限制,而被挂起等待了一段时间

多路复用多路复用

头压缩和重用

在 HTTP/1.1 中,标头是不可压缩的,并且对于每个请求都是重复的。随着请求数量的增加,重复头信息的数量也在增加。HTTP/2 消除了多余的标头并压缩剩余的标头以显着减少会话期间重复的数据量。

  • HTTP/2在客户端和服务器端使用“首部表”来跟踪和存储之前发送的键-值对,对于相同的数据,不再通过每次请求和响应发送;
  • 首部表在HTTP/2的连接存续期内始终存在,由客户端和服务器共同渐进地更新;
  • 每个新的首部键-值对要么被追加到当前表的末尾,要么替换表中之前的值。

来自于网络来自于网络

服务器推送

服务器现在可以推送资源,而不是等待客户端请求资源。这允许网站抢先向用户发送内容,最大限度地减少等待时间。

体验下两者之间加载速度

网络加载速度对比

spring中如何使用http/2?

您可以使用server.http2.enabled配置属性在 Spring Boot 应用程序中启用 HTTP/2 支持 。这种支持取决于所选的 Web 服务器和应用程序环境,因为 JDK8 不支持开箱即用的协议。

Spring Boot使用HTTP/2协议必须先配置 SSL。

使用Undertow服务器

从 Undertow 1.4.0+ 开始,支持 HTTP/2,对 JDK8 没有任何额外要求。

使用Jetty服务器

从 Jetty 9.4.8 开始也支持 HTTP/2 。要使用Http/2,你的应用程序需要有两个额外的依赖项: org.eclipse.jetty:jetty-alpn-conscrypt-server和org.eclipse.jetty.http2:http2-server.

使用Tomcat服务器

默认情况下,SpringBoot随Tomcat8.5.x一起提供。对于该版本,只有在主机操作系统上安装了libtcnative库及其依赖项时,才支持HTTP/2。库文件夹必须在JVM库路径中可用(如果尚未可用)。可以使用-Djava.library.path=/usr/local/opt/tomcat-native/lib这样的JVM参数来实现。有关这方面的更多信息,请参阅Tomcat官方文档。在没有本机支持的情况下启动Tomcat 8.5.x会记录以下错误:

ERROR 8787 --- [           main] o.a.coyote.http11.Http11NioProtocol      : The upgrade handler [org.apache.coyote.http2.Http2Protocol] for [h2] only supports upgrade via ALPN but has been configured for the ["https-jsse-nio-8443"] connector that does not support ALPN.

这个错误不是致命的,应用程序仍然以HTTP/1.1ssl支持启动。使用tomcat9.0.x和JDK9运行应用程序不需要安装任何本机库。要使用Tomcat 9,可以用所选的版本覆盖Tomcat.version build属性。

结束

识别下方二维码!回复: 入群 ,扫码加入我们交流群!

点赞是认可,在看是支持点赞是认可,在看是支持

阅读更多文章

版权声明:本文为1ssqq1lxr原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/1ssqq1lxr/p/15017747.html