前言

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属性。

结束

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

点赞是认可,在看是支持

阅读更多文章

Http2.0详解的更多相关文章

  1. 百度大脑UNIT3.0详解之嵌入式对话理解技术

    相信很多人都体验过手机没有网时的焦虑,没有网什么也做不了.而机器人也会遇到这样的时刻,没有网或者网络环境不好的情况下,无法识别用户在说什么,也无法回复用户.在AIoT(AI+物联网)飞速普及的现在,智 ...

  2. 百度大脑UNIT3.0详解之知识图谱与对话

    如今,越来越多的企业想要在电商客服.法律顾问等领域做一套包含行业知识的智能对话系统,而行业或领域知识的积累.构建.抽取等工作对于企业来说是个不小的难题,百度大脑UNIT3.0推出「我的知识」版块专门为 ...

  3. 百度大脑UNIT3.0详解之数据生产工具DataKit

    在智能对话项目搭建的过程中,高效筛选.处理对话日志并将其转化为新的训练数据,是对话系统效果持续提升的重要环节,也是当前开发者面临的难题之一.为此百度大脑UNIT推出学习反馈闭环机制,提供数据获取.辅助 ...

  4. Mongostat 3.0详解

    可以参考之前写的这篇博客: Mongostat 2.6详解 mapped Changed in version 3.0.0. Only for MMAPv1 Storage Engine. The t ...

  5. setTimout( , 0) 详解

    setTimout( , 0) 一.前言 前端工程师们工作久了,一般都会在某些地方看见过这样的代码: setTimeout(function(){ // TODO }, 0); 举个实例,移动端我们经 ...

  6. CM自动化安装CDH5.14.0详解

    CDH5.14.0版本说明 CDH最早版本只包含hadoop.hive.hbase等基础组件,CDH5.14.0版本目前已经封装了spark.impala.kudu(CDH 5.13.x开始)等众多组 ...

  7. Android数据存储之GreenDao 3.0 详解

    前言: 今天一大早收到GreenDao 3.0 正式发布的消息,自从2014年接触GreenDao至今,项目中一直使用GreenDao框架处理数据库操作,本人使用数据库路线 Sqlite----> ...

  8. iOS中 蓝牙2.0详解/ios蓝牙设备详解 韩俊强的博客

    每日更新关注:http://weibo.com/hanjunqiang  新浪微博 整体布局如下:     程序结构如右图: 每日更新关注:http://weibo.com/hanjunqiang  ...

  9. OAuth 2.0详解

    OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版. 本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为R ...

随机推荐

  1. TVM交叉编译和远程RPC

    TVM交叉编译和远程RPC 本文介绍了TVM中使用RPC的交叉编译和远程设备执行. 使用交叉编译和RPC,可以在本地计算机上编译程序,然后在远程设备上运行它.当远程设备资源受到限制时(如Raspber ...

  2. 人脸照片自动生成游戏角色_ICCV2019论文解析

    人脸照片自动生成游戏角色_ICCV2019论文解析 Face-to-Parameter Translation for Game Character Auto-Creation 论文链接: http: ...

  3. 从单一图像中提取文档图像:ICCV2019论文解读

    从单一图像中提取文档图像:ICCV2019论文解读 DewarpNet: Single-Image Document Unwarping With Stacked 3D and 2D Regressi ...

  4. MegEngine基本概念

    MegEngine基本概念 基本概念 MegEngine 是基于计算图的深度神经网络学习框架. 本文内容会简要介绍计算图及其相关基本概念,以及在 MegEngine 中的实现. 计算图 结合一个简单的 ...

  5. 简单的Java面向对象程序

    上一篇随笔Java静态方法和实例方法的区别以及this的用法,老师看了以后说我还是面向过程的编程,不是面向对象的编程,经过修改以后,整了一个面向对象的出来: /** * 3 延续任务2, 定义表示圆形 ...

  6. .NET平台系列26:在 Windows 上安装 .NET Core/.NET5/.NET6

    系列目录     [已更新最新开发文章,点击查看详细] 本文介绍如何在 Windows 上安装 .NET. .NET 由运行时和 SDK 组成. 运行时用于运行 .NET 应用,应用可能包含也可能不包 ...

  7. PAT甲级 1093 Count PAT‘s (25 分) 状态机解法

    题目 原题链接 The string APPAPT contains two PAT's as substrings. The first one is formed by the 2nd, the ...

  8. 从谭浩强的《C语言程序设计》到《电容应用分析精粹》

    不记得具体从什么时候开始(反正很多年前的事了)的,不少人都陆续批评过谭浩强的<C语言程序设计>,各方面都有扒过.例如,与实践脱节,很多例子在不同编译器上运行是错误的,代码风格糟糕等等方面. ...

  9. 『无为则无心』Python基础 — 10、Python字符串的格式化输出

    目录 1.什么是格式化输出 2.Python格式化输出的五种方式 方式一:字符串之间用+号拼接 方式二:print()函数可同时输出多个字符串 方式三:占位符方式 方式四:f格式化方式(推荐) 方式五 ...

  10. 微信订阅号中获取openid以及个人信息

    采用的方式是利用另一个服务号获取用户信息. 其中有一个问题就是不关注这个服务号获取不了用户头像等信息.