HTTP 2.0 与HTTP1.1的差别

2023-10-26

前面的话

在说HTTP2.0前,先说一说发展到HTTP1.1做了哪些升级。

推荐好文:一文读懂HTTP/2及HTTP/3特性

HTTP1.1的升级

目前使用最广泛的HTTP1.1做了哪些重大升级?

  • 默认长连接。HTTP1.0也提供长连接,但是默认是短连接,要想长连接必须将头部的connection设置为keep-alive。而HTTP1.1默认开启connection:keep-alive,不用设置。
  • 强制设置Host请求首部字段Host字段是HTTP1.1唯一一个强制要求设置的字段。
  • 管线化(pipelining):不用等待响应,就可以发送下一个请求。
  • 缓存处理的扩展:HTTP1.1增加的Cache-control可以控制缓存行为,并且支持断点续传。
  • 带宽优化:HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了 ,并且不支持断点续传。HTTP1.1增加了range请求头部字段,允许客户端只请求服务器某个对象的一部分资源。返回206状态码表示请求一部分资源成功,否则返回200的状态码,并且返回对象的全部资源。

小结:
在 HTTP/1.1 时代主要增加了:
(1)默认长连接:建立连接后,在一定时间内不会断开,其他请求都可以使用这条连接。
(2)pipelining 管线化:通过这个管道,浏览器的多个请求可以同时发到服务器,但是服务器必须按照客户端请求的先后顺序依次回送相应的结果,以保证客户端能够区分出每次请求的响应内容。

HTTP1.1的瓶颈

HTTP1.1有很多优点,但是其标准会使其成为发展的瓶颈。

  • 队头阻塞(Head of line blocking):虽然HTTP1.1支持管线化,允许一次发起多个请求,但是服务器会按照请求的顺序依次响应。一旦响应某个请求出现了阻塞,那么后面的请求即使已经处理完毕了,仍然需要等待阻塞的请求处理完毕。
  • 多个TCP连接: 虽然http1.1支持管道化,但是很多浏览器根本不支持它。(因为它真的很鸡肋)。HTTP1.1的请求并发还是基于多个TCP连接,但建立tcp连接的本较高,比较耗时。
  • 头部信息冗余,每一次请求都会带上一些相同的首部。头部数据都是以纯文本的形式发送的,通常会给每个请求增加500~800字节的负荷。
  • 请求只能从客户端开始。客户端不能接受除响之外的指令。
SPDY时代

SPDY的出现就是为了消除HTTP1.1协议的瓶颈,它并没有改写HTTP协议, 而是以会话层的形式加入到应用层与传输层之间,控制对数据的流动,但是还是采用HTTP建立通信连接。

SPDY的设计:
在这里插入图片描述

使用SPAY协议之后,HTTP协议获得了以下功能:

  • 多路复用(multiplexing):通过单一的TCP连接,可以无限制处理多个HTTP请求。所以请求的处理都在一条TCP连接上完成,因此TCP的处理效率得到提高。解决了(head of line blocking)的问题。

  • 请求优先级(request priorityzation): SPDY不仅可以无限制的并发处理请求,还可以给请求逐个分配优先级顺序。这样重要的请求就会优先响应。

  • header压缩:HTTP1.1的头部是冗余的,SPDY协议会采用合适的压缩算法压缩HTTP请求和响应的首部。这样,通信产生的数据包数量和发送的字节数就更少了。

  • 推送功能(server push):SPDY协议支持服务器主动向客户端推送数据的功能。
    到底推送了什么?比如客户端请求了一个index.html文件,服务器会将客户端所需要的资源伴随index.html文件一起发送给客户端,不必等待客户端请求。

    普通的客户端请求:
    在这里插入图片描述
    服务器推送:
    在这里插入图片描述

HTTP2.0时代
二进制分帧层

HTTP2.0是SPDY的升级版,它的核心就是在应用层与传输层之间添加一层二进制分帧层HTTP2.0是二进制协议,他采用二进制格式传输数据而不是1.x的文本格式。文本格式对计算机解析不友好。

HTTP2.0设计:
在这里插入图片描述
上面的图中清晰的表达了HTTP1.1与HTTP2.0的区别,1.1是以文本格式进行传输,而2.0是将消息分为两个帧(HEADERS与 DATA两种帧类型)来传输。并且每个帧采用二进制编码。 首部信息被封装在HEADERS帧,实体信息则封装在DATA帧中。

  • 帧:这个新协议通信的最小单位。
  • 消息:指HTTP的消息,请求、响应等,由一个或多个帧组成。
  • 流:是连接中的一个虚拟信道,可承载双向的消息(一个或者多个),每个流都有一个唯一的整数标识符。

HTTP2.0功能

与SDPY协议的功能相似:

  • 多路复用:HTTP2建立一个TCP连接,一个连接上面可以有任意多个流,消息分割成一个或多个帧在流里面传输。帧传输过去之后,在进行重组,形成一个完整的请求和响应。

这里注意:Steam是乱序的,但同一个Sream里面的帧是按序传输的,二进制帧到达后,对方将Sream ID相同的二进制帧组装成完整的请求报文响应报文

在这里插入图片描述

  • 请求优先级:为并发的请求设置优先级,重要的请求会先响应。

  • 压缩头部:HTTP1.x中采用文本格式传输,每个传输会增加500~800字节的开销。每次请求都要带上向cookie、user-agent这样相同的首部。HTTP采用HPACK压缩双来压缩头部。在浏览器与服务器之间:
    (1) 维护一份相同的静态字典,包含常见的头部名称,以及常见的头部值
    (2) 维护一份相同的动态字典,可以动态的添加内容
    (3) 通过静态Huffman编码对传输的首部字段进行编码

    静态字典(一部分):
    在这里插入图片描述
    所以我们在传输首部字段的时候,例如要传输method:GET,我们只要传输静态字典里面的method:GET对应的索引值就可以,一个字节就搞定了。假如像user-agent、cookie这种静态字典里面只有首部名称而没有值的首部,第一次传输需要在静态字典中加入值,值会采用静态Huffman编码来减小体积。

    第一次传输过user-agent之后,浏览器和服务器就会把它添加到自己的动态字典 中,后续的传输就可以只传输一个索引就行了。

  • 服务器推送:以SPDY一样,支持服务器主动向客户端推送数据的功能。

HTTP1.1的合并请求是否用于HTTP2.0

答案是:没有必要。
HTTP2.0采用多路复用,一个TCP连接可以 并行传输多个请求,并且HTTP消息都分解为互不依赖的帧来传输,经典的队头阻塞的问题解决了。而HTTP1.1合并请求的原因也是为了防止过多的HTTP请求带来的阻塞问题。现在HTTP2.0已经可以解决这问题,所有合并请求就没有必要了。

总结

HTTP1.0

  • 无状态、无连接

HTTP1.1

  • 持久连接
  • 管线化
  • 增加缓存处理(如cache-control)
  • 增加Host字段、支持断点续传

HTTP2.0

  • 二进制分帧层
  • 多路复用
  • 头部压缩
  • 请求优先级
  • 服务器推送

参考文章:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTTP 2.0 与HTTP1.1的差别 的相关文章

随机推荐

  • 【华为机试真题 JAVA】水果搬运问题-200

    题目描述 一组工人搬运一批水果 用一维数组存储工人编号和水果名称以及搬运重量 要求先按水果分组 然后按搬运重量排序输出 输入描述 第一行包括一个整数 N 1 N 100 代表工人的个数 接下来的 N 行每行包括两个整数 p 和 q 分别代表
  • 关于STM32的SPI使用DAM首发的回调问题

    本人第一次使用HAL库 然后用SPI操作FLAH 担心数据量大 于是打算使用DMA 之前是用的LL库 然后发现了一个问题 SPI怎么都接收不到数据 想了一下应该是片选引脚的问题 我应该在DMA传输结束时关闭引脚 但是之前都是用LL库 判断标
  • spring无侵入自动生成接口文档

    背景 spring cloud多个微服务开发了很多接口 紧急对接前端 需要快速提供一批接口的文档 且不同微服务的接口由多位同事开发且注释非常的少各有不同 现在需要不修改代码不添加注释的情况下能自动的扫描接口并生成文档 本文将详细介绍实现此需
  • X264的参考帧设置

    1 以r1884为例 r ref lt 整数 gt Reference Frame 即参考帧 决定最多可能的参考帧数 有效范围值1 16 该值越大 压缩率越高 但大于6后对压缩率的贡献很低 可以看压制完后x264 info ref 项 例如
  • sqlserver 登录名和用户名

    解释 登录名 通俗的讲 平时连接数据库是用的就是登录名 而不是用户名 是数据库服务级别 登录数据库之后 这个登录名有什么权限 比如可以访问那个数据库 或者表 存储过程 视图等 甚至字段权限 是有与之对应的用户 用户名 决定 注 也可以从服务
  • 手风琴(折叠面板)

    目录 一 Layui手风琴 1 1 引用layui的css和js 1 2 开启手风琴的代码示例 1 3 静态数据 1 4 最终效果图 二 Bootstrap手风琴 2 1 引用Bootstrap的css和js 2 2 开启手风琴的代码示例
  • Python 第一章 基础知识(6) 函数

    函数就像可以用来实现特定功能的小程序一样 Python的很多函数都能做很奇妙的事情 先来介绍一个内建函数 即是Python自带的已经定义好的函数 可以直接用 gt gt gt pow 2 3 8 这个函数实现了2 2 2的算法 这种使用函数
  • Angular 中 web worker的使用

    web worker就是在web应用程序中使用的worker 这个worker是独立于web主线程的 在后台运行的线程 web worker的优点就是可以将工作交给独立的其他线程去做 这样就不会阻塞主线程 第一步 ng g webWorke
  • 快速生成26个英文字母

    在学习中经常会拿26个英文字母序列做为字符串的例子来说明 但是自己又不想每次都自己手动输入 所以就想写个方法能快速的生成这个字符串 generate 26 english Characters return void public stat
  • C# 9.0:Records

    转自 翁智华 cnblogs com wzh2010 p 13950647 html 概述 在C 9 0下record是一个关键字 微软官方目前暂时将它翻译为记录类型 传统面向对象的编程的核心思想是一个对象有着唯一标识 封装着随时可变的状态
  • JenKins结合cppcheck及cpplint进行代码风格及静态代码检测

    JenKins结合cppcheck及cpplint 最近公司需要在Jenkins上安装cppcheck及cpplint进行代码风格及静态代码检测 这里记录下过程 前提条件 安装了Jenkins 步骤如下 第一步 安装cppcheck并配置环
  • [Linux] yum和apt-get用法及区别

    一般来说著名的linux系统基本上分两大类 1 RedHat系列 Redhat Centos Fedora等 2 Debian系列 Debian Ubuntu等 RedHat 系列 1 常见的安装包格式 rpm包 安装rpm包的命令是 rp
  • vs2019调试时中文乱码解决办法

    vs2013 vs2019系列文章目录 文章目录 vs2013 vs2019系列文章目录 问题描述 一 解决 解决方法1 在我机器上仍然未解决 解决方法2 在我机器上可行 调试时中文显示效果 问题描述 vs2019调试时中文乱码 但是在vs
  • except Exception as e作用

    小记 今天在查看poc时 发现这段代码不理解 所以B站搜索了一下 把别人讲的内容爬了一下 coding utf 8 a int input 请输入数字0 try if a 0 print a except Exception as e 作用
  • Redis高可用集群(哨兵、集群)

    文章目录 前言 一 主从复制 1 1 主从复制的作用 1 2 主从复制流程 1 3 主从复制搭建 二 哨兵模式 2 1 哨兵模式的作用 2 2 哨兵结构的组成 2 3 故障转移机制 2 4 哨兵模式搭建 三 集群模式 3 1 集群的作用 3
  • shell 脚本调试工具

    bashdb 是一个类似GDB的脚本调试软件 具有断点 单步执行 观察变量等功能 安装方法 sudo apt get install bashdb bashdb 使用方法 bashdb options script name script
  • vue element-ui el-table表格二次封装 自定义el-table表格组件 vue封装表格组件

    CommTable vue table组件
  • 多人连线的枪战游戏

    Simple Blueprint Multiplayer 是一个完全由 蓝图 和 UMG 界面 编写的游戏 可以作为如何使用蓝图的 Session Nodes 打造游戏中的多人部分的使用示例 这里有一个主菜单 一个服务器列表 以及一个简单的
  • java如何将null转化为空串也就是empty

    java如何将null转化为空串也就是empty 前言 在说转换之前 简单说一下它们之间的区别 如下 1 null不指向任何对象 相当于没有任何值 而 代表一个长度为0的字符串 2 null不分配内存空间 而 会分配内存空间 那如何将nul
  • HTTP 2.0 与HTTP1.1的差别

    前面的话 在说HTTP2 0前 先说一说发展到HTTP1 1做了哪些升级 推荐好文 一文读懂HTTP 2及HTTP 3特性 HTTP1 1的升级 目前使用最广泛的HTTP1 1做了哪些重大升级 默认长连接 HTTP1 0也提供长连接 但是默