前言

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. week-01

    week-01 1. 计算机组成 从底层开始: 硬件: CPU.内存.硬盘.网卡.主板.显卡.风扇.电源.鼠标键盘 等: 系统: Linux.Windows.Mac 等: 软件: QQ.微信.吃鸡.农 ...

  2. 五种开源API网关实现组件对比

    五种开源API网关实现组件对比     API 网关一些实现 使用一个组件时,尤其是这种比较流行的架构,组件肯定存在开源的,我们不必自己去从零开始去实现一个网关,自己开发一个网关的工作量是相当可观的, ...

  3. Ajax|看这一篇就够了!详解Ajax工作原理及开发步骤

    传统开发的缺点,是对于浏览器的页面,全部都是全局刷新的体验.如果我们只是想取得或是更新页面中的部分信息那么就必须要应用到局部刷新的技术. 局部刷新也是有效提升用户体验的一种非常重要的方式. Ajax技 ...

  4. 八、Pandas 表格处理

    pandas有两个数据结构,一个是series 另一个是DataFrame from matplotlib import pyplot as plt import numpy as np import ...

  5. Vue中的三种Watcher

    Vue中的三种Watcher Vue可以说存在三种watcher,第一种是在定义data函数时定义数据的render watcher:第二种是computed watcher,是computed函数在 ...

  6. HiCar人-车-家全场景智慧互联

    HiCar人-车-家全场景智慧互联 (HUAWEI HiCar Smart Connection)解决方案,具备如下特点: 安全交互:以安全为前提的极简交互(Safety) 无感互联:手机/IoT 设 ...

  7. 包及权限配置&java存储机理绘制

    包及权限配置 包的声明和导入 //声明 package aa.bb.cc; public class A{;} class B{;} //即在java输出目录aa.bb.cc中放入编译后的A.clas ...

  8. 【NX二次开发】Block UI 反向

    属性说明 属性   类型   描述   常规           BlockID    String    控件ID    Enable    Logical    是否可操作    Group    ...

  9. 【UG二次开发】 UF_OBJ_ask_name 获取对象名字

    代码 char name[256]; UF_OBJ_ask_name(objTag, name);

  10. 【NX二次开发】调整视图大小

    调整视图大小 tag_t tagView; UF_VIEW_ask_work_view(&tagView); UF_VIEW_fit_view(tagView, 0.7);//if NULL_ ...