【Http2特性——Binary framing layer--push---HPACK】

2023-05-16

google文档

Http2

  • http2 引入了不兼容的new binary framing layer, 所以大版本号增加了
  • 除非使用tcp socket,否则看不出http的版本区别 (指Http向上层暴露的API接口一致,内部实现不同)
  • 基于SPDY

SPDY

google在2009年弄的项目,最大的目标是减少 减低网页加载延迟,通过解决http1.1 性能瓶颈

  • Target a 50% reduction in page load time (PLT).
  • Avoid the need for any changes to content by website authors.
  • Minimize deployment complexity, and avoid changes in network infrastructure.
  • Develop this new protocol in partnership with the open-source community.
  • Gather real performance data to (in)validate the experimental protocol.

通过新的 binary framing layer来实现 请求和相应的 多路复用(multiplexing)、优先级排序(prioritization)、首部压缩

最终提高了55%的速度。

2015年早起,http 2协议被IESG(Steering 指导、操控)通过。

版本比较

http 1.*

  • client需要多个connection,来实现 并发(concurrency)、减低延迟(reduce latency)
  • 不对request、response的首部压缩,浪费流量
  • 不支持对资源的优先级排序,导致对tcp连接的利用新能底下

http 2

  • Binary framing layer
  • 首部压缩
    • 更高效使用资源
    • 降低延迟
  • 允许在 同一 connection上多concurrent(并发)交换信息
    • 特别是: 它允许在同一连接上交错请求和响应消息,并对HTTP头字段使用高效的编码。
  • 允许对请求进行 优先级排序
    • 使重要的请求,优先完成
  • push

比较

  • 使用更少的tcp connection,降低了 资源的竞争、提高了connection的存活时间
  • http2通过binary message framing 更高效处理信息

总结

http2是对http的拓展,而不是替代。status code、header等都保持不变,下面讨论关于 底层API的修改。

Binary framing layer (二进制 帧 层)

  • http2的核心更改
  • 规定http信息的封装 和 传输

在这里插入图片描述

  • layer:在暴露给应用的 高级http接口 和 底层socket接口之间的 优化的编码机制
  • 不同于 http 1.*在普通文本中通过 换行符分割
  • http 2通信都被分割为 小的message和frame,并采用 二进制的编码格式

影响

  • http 2.0的client、server端必须处理、解析 binary frame格式
  • http1.0的client不会理解只支持http2.0的server,反之亦然
  • 可幸的是,应用层 对此无感知

术语 (terminology)

  • Streams
    • 在connection上建立的 双向byte通信流
    • 用于传输message
  • Messages
    • 完整的 一串 frame
    • 可以映射逻辑上 request或response信息
  • frames
    • http2.0中最小的通信单元
    • 都包含 frame header

联系

  • 所有的通信通过 一个tcp链接完成。
  • 一个tcp链接可carry(进行、搬运) 多个双向的 Stream
  • 每个Stream都有 独有的识别信息 和 可选的优先级信息
  • Stream用于carry 双向的message
  • 每个Message,都代表逻辑上的 Http message(request or response)
  • 每个Message,都包含一个或多个frame
  • frame是最小的通信单元,用于carry指定的数据类型(例如:header、 部分message等等)
  • 不同stream的frame,可以在connection中交错传输,最后通过frame的header里嵌入的 stream 识别信息 来重新组装。

在这里插入图片描述

小结

  • http2.0 将 Http协议的通信 分解为 binary-encoded frames的交换。
  • 将其映射为 属于指定stream的 message
  • 在一个TCP连接上 通过 多路复用 通信

Request and response multiplexing

Http1.*

  • 如果想 多路 并行(parallel)请求 提高效率
  • 必须需要 多个TCP connection (例如加载网页时,多线程加载 图片、JS、CSS、html)
  • 这是Http1.*的交付模型直接导致的
    • 在任意时间,只允许一个response在一个connection内传递
  • 导致 head-of-line blocking,和底层TCP connection的浪费
    • 因顺序完成,所以相同Connection内,head头阻塞,后续信息就无法传递了

Http 2

  • 在new binary framing layer中打破,一个connection同时只能有一个response的限制
  • 允许一个connction,完全的 多路request、response
  • 将一个http信息分解成独立的 frames
  • frames可交叉传递
  • 最终frame再组装

在这里插入图片描述

HTTP/2最重要的能力

  1. 将HTTP message分割为独立的frames(帧)
  2. 可交错传递(interleave them)
  3. 并在接收端 重新组装frames

由此也引入了其他的好处

  1. 交叉多个 request, 并行(parallel)处理,而不会被 其中任意一个阻塞
  2. 交叉多个 response, 并行(parallel)处理,而不会被 其中任意一个阻塞
  3. 使用 一个 connection,并行 传递多个request、response
  4. 移走不再需要HTTP/1.x的变通方法(concatenated files, image sprites, and domain sharding)
  5. 提高网络的可用容量,通过消除不必要的延迟,降低 page 加载时间

好处

  1. resolves the head-of-line blocking problem found in HTTP/1.x
  2. eliminates the need for multiple connections to enable parallel processing and delivery of requests and responses

As a result, this makes our applications faster, simpler, and cheaper to deploy.

Stream prioritization

因为multiplex,使得frame的顺序很重要,通过 weight 和 dependence控制:

  • 给stream分配weight,区间[1, 256]
  • stream可以显式的dependence (依赖) 其他stream
    • 依赖可以构成一个树形结构
    • 顶部的依赖优先执行
    • 顶部为虚拟的一个 root stream

在这里插入图片描述

  • stream通过 另一个stream唯一识别码 可以指定依赖,将其作为parent,parent将优先执行
  • 没指定依赖,则被认为依赖于 root stream(即优先级最高)
  • 当dependence相同时,即多个stream 为兄弟 stream,则通过 weight占比,来按比例分配资源
  • dependence、weight可以动态调整

One connection per origin

因为 new binary framing 机制,Http 2不再需要多个TCP连接,来达到并发(parallel)处理。
每个stream可以interleave(交替传输)和prioritized(设置优先级)。

因此HTTP/2 连接都是持久的,每个origin(起源)只需一个connection。

  • 降低操作的性能消耗
  • 降低延迟
  • 还提高了server的吞吐量,增大了网络的容量(capacity)

特别是HTTPS,耗性能的 TLS handshacks
- Https的TCP建立,需要TLS握手,用于确定https的证书、非对称加密,生成对称加密的key

Flow control

Server push

在这里插入图片描述

打破了 严格的request-response语音,enables one-to-many and server-initiated push workflows(允许1对多 和 服务端推送的工作流)

  • PUSH_PROMISE frames

Header compression

HTTP/1.x

这些元数据都是plain text(纯文本),一次请求要占 500–800 bytes ,如果 HTTP cook被使用还会到 kb,

HTTP/2

使用HPACK压缩格式,压缩 request、response请求头的元数据

HPACK压缩格式:

  1. It allows the transmitted header fields to be encoded via a static Huffman code, which reduces their individual transfer size.(使用霍夫曼编码,降低单次transfer消耗)
  2. It requires that both the client and server maintain and update an indexed list of previously seen header fields (in other words, it establishes a shared compression context), which is then used as a reference to efficiently encode previously transmitted values.(采用index,复用相同header)

在这里插入图片描述

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

【Http2特性——Binary framing layer--push---HPACK】 的相关文章

  • 如何将 NSInteger 或 NSString 转换为二进制(字符串)值

    有人在 Objective C 中有一些代码可以将 NSInteger 或 NSString 转换为二进制字符串吗 example 56 gt 111000 stackoverflow 中有一些代码尝试执行此操作 但不起作用 Thanks
  • 如何修复 Nodejs 中的“无法读取未定义的属性推送”错误?

    我编写了一个简单的应用程序来学习 Nodejs 但是当我在 cmd 中运行 nodemon index js 时出现此错误 类型错误 无法读取未定义的属性 push 应用程序崩溃 启动前等待文件更改 我已遵循 udemy 课程中的所有说明来
  • 为什么 Chrome 在使用 HTTP/2 时会对请求进行排队?

    我有一个使用 HTTP 2 的网站 该网站加载图像的速度很慢 看看 Chrome 的 Devtools 大部分时间都花在 排队 图像的网络请求上 我的理解是 使用 HTTP 2 可以通过同一个 TCP 连接同时发出多个请求 但我看到 Chr
  • JQuery 和 PHP - 我可以从服务器推送吗?

    我刚刚开始研究 JQuery 到目前为止 一切都是 PHP 只是好奇 如果服务器检测到事件并想要更新用户的浏览器 我可以进行服务器推送 还是客户端必须轮询 客户端必须进行轮询 但你可以这样做长轮询 http en wikipedia org
  • PHP:获取 HTTP 协议版本(HTTP/1.1 与 HTTP/2)

    到目前为止 我的 php 应用程序到处都采用 HTTP 1 1 所以我定义了所有标题 如下所示 header HTTP 1 1 500 Internal Server Error 但现在我的服务器也支持 HTTP 2 我想使用正确的 HTT
  • 尝试将 CABasicAnimation 位置和图层不透明度延迟 3 秒,但是

    我试图使用 setBeginTime 将图层的不透明度和位置的动画延迟 3 秒 我将图层命名为boxLayer 动画进展顺利 但在前 3 秒内 该图层不应显示 该图层以其最终位置和不透明度显示 不应该 组动画并不能解决该问题 有人可以帮忙吗
  • Mercurial 工作流程是否可以通过未提交的更改进行更新?

    因此 我的网站从 CVS 切换到 Mercurial 我遇到的最大问题是 如果我正在处理一些我不想提交的文件 我只需保存它们 然后我还有其他文件想要推送到服务器 但是如果其他人已经制作了对存储库进行更改 然后我将它们拉下来 它要求我合并或变
  • 将数据从 ASP.NET MVC 控制器推送到视图

    我正在构建一个网站的后端 该网站的前端将有多个需要实时更新的 小部件 现在我只是有一个加载方法 它用数据填充所有小部件 显然是在页面加载时 我的问题是如何处理进一步更新的实时方面 我想过只进行多个 ajax 调用 它可以每秒左右查询一个服务
  • 迅速关闭模态并推送到新的 VC

    我有 tableview 1 表显示一个新的模式窗口 当我按下按钮时 我想关闭模式窗口并推送到 VC 我的代码仅隐藏模式视图 但不进行推送 IBAction func registrationBtn sender AnyObject let
  • 二进制文件的结构验证

    我正在研究正式指定各种二进制流格式的方法 并使用工具检查流是否符合规范 类似于 XSD 任何 XML 验证工具 或者就像在二进制级别上工作的极其复杂的 grep 表达式 最好不是 这真的很难阅读 有人知道有用的规范 工具吗 理由 我们每天都
  • 什么是低位和高位?

    谁能告诉我什么是低位和高位 如何识别高位和低位 下面是二进制形式 如何0110里面有更高位吗 0110 0111 1100 1010 1100 0111 1001 1011 就像十进制一样 二进制中较高位通常写在左侧 所以如果你看到0111
  • GraphQL 中的二进制

    根据关于标量的文档 https graphql org learn schema scalar types在 GraphQL 中 到目前为止还不支持二进制数据 根据上面的页面 可以定义自己的类型 如何在 GraphQL 中实现二进制标量 我
  • 删除最低位

    给定一个二进制数 删除最低位的最快方法是什么 01001001010 gt 01001001000 它将在代码中用于迭代变量的位 伪代码如下 while bits 0 index getIndexOfLowestOrderBit bits
  • 如果使用推送服务关闭应用程序,应用程序会崩溃:parse.com

    我将清单中的接收器替换为我的
  • 生成 xcframework 库时 xcodebuild 错误“不支持具有多个平台的二进制文件”

    我正在尝试从 MyFramework framework 文件生成 xcframework 文件 我正在运行以下命令 xcodebuild create xcframework framework MyFramework framework
  • 在 android studio 上单击推送通知后重定向到特定活动

    我正在努力开发一个 Android 应用程序 以便在单击所有传入的推送通知时将应用程序重定向到特定的活动页面 我是 Android 开发新手 对我的编程感到抱歉 下面是推送通知部分的 android manifest xml 如果对此主题有
  • 使用 R 读取和转换二进制原始数据

    我有一个file https drive google com file d 0BxMpk0nhnJy6SFhxd2xuMzJYYlk edit usp sharing其中包含原始 二进制数据和 ascii 它包含一个时间戳和一个代表速度的
  • python 2.7 中的 HTTP 2 请求

    在 python 中向 HTTP 1 和 HTTP 2 发出请求有什么区别吗 我可以像这样在 python 中进行 HTTP 1 x 调用 url http someURL values param1 key param2 key2 dat
  • 使用 IE11 的工作程序使用 multipart/form-data 发送二进制数据

    我正在尝试发送multipart form data来自 IE 的工作人员 我已经使用 Chrome Firefox Safari 完成了此操作formData对象 不支持IE 我需要一个手动的 我发送的二进制数据是 crypto js 加
  • 按位运算符简单地翻转整数中的所有位?

    我必须翻转整数的二进制表示形式中的所有位 鉴于 10101 输出应该是 01010 当与整数一起使用时 完成此操作的按位运算符是什么 例如 如果我正在编写类似的方法int flipBits int n 什么会进入身体 我只需要翻转数字中已经

随机推荐

  • python读取文件失败解决方案

    python读取文件失败解决方法 我的目录如下 python text files pi digits txt python text files file reader py 1 python默认读取当前根目录 注意 Linux 目录间用
  • from matplotlib.cbook import is_string_like, el ImportError: cannot import name 'is_string_like'

    Traceback most recent call last File 34 321 py 34 line 2 in lt module gt import matplotlib pyplot as pt File 34 C Progra
  • STM32F4XX 采集编码器的溢出处理

    STM32F4XX定时器16位 xff0c 采集编码器时候会在0xFFFF溢出 xff08 假设配置period 61 0xFFFF xff09 假设不溢出的情况下1ms之内编码器变化的最大范围小于0x7FFF xff0c 则关于溢出则可以
  • dependencyManagement和dependencies的区别

    dependencyManagement和dependencies的区别 参考 xff1a http zhaoshijie iteye com blog 2094478 pom xml中build标签 cpf2016的博客 CSDN博客 还
  • VScode播放网易云音乐(详细讲解)

    步骤 安装插件 xff1a VSC Netease Music 按shift 43 ctrl 43 p xff0c 输入 nete 出现下图 在按shift 43 ctrl 43 p xff0c 输入 nete 即可选择播放音乐 xff08
  • 安装和配置openssl

    Steps to download compile and install are as follows Note Replace 0 9 8e with your version number Downloading OpenSSL Ru
  • 自定义异常的使用

    下面是定义一个自定义异常的例子 xff0c 开发中可以以此作为参考 xff0c 根据项目需求编写自己的异常类 package com thinkgem wlw modules job service 自定义异常要继承 Exception 类
  • Ant中的classpath配置和使用

    Ant手册中配置classpath采用classpath标签 xff0c 可是我发现这样配置总是不好用 xff0c 还是直接用path设置classpath 一 xff09 设置classpath的方法 lt path id 61 34 p
  • 在运行jar包中正确读取资源文件

    可能有不少初学者会有这样的困惑 xff1a 在你的代码里调用了一些资源文件 xff0c 如图片 xff0c 音乐等 xff0c 在调试环境或单独运行的时候可以正常显示或播放 xff0c 而一旦打包到jar文件中 xff0c 这些东东就再也出
  • Ant发布war包时,任务卡住不动也不报错

    使用ant给项目发布环境时 xff0c 任务卡住不动也不报错 xff0c 在网上查询了些资料 xff0c 估计是ant执行任务时虚拟机内存不够用 针对这个问题 xff0c 可以通过以下两种方法解决 xff1a 1 xff09 在javac节
  • Oracle函数:sys_connect_by_path

    Oracle函数 sys connect by path 主要用于树查询 层次查询 以及 多列转行 其语法一般为 xff1a select sys connect by path column name 39 connect symbol
  • JVM(Java虚拟机)中进程工作目录讲解

    每次我们用Java命令运行我们的Java程序 xff0c 都会在JVM中开启一个进程 xff0c 对于每一个进程 xff0c 都会有一个相对应的工作目录 xff0c 这个工作目录在虚拟机初始化的时候就已经设置好了 xff0c 默认的情况下
  • Java调用外部程序命令时线程阻塞问题分析

    文章参考 http www qqread com java 2010 05 w493489 html 今天要写个远程重启服务的功能 xff0c 为了开发速度 xff0c 暂时定为Java代码 43 WMIC命令的方法 xff0c 简单的说
  • 打造一台“苹果范儿”的 Linux 系统,桌面美化攻略来了~

    点击关注公众号 xff0c 实用技术文章及时了解 目录 前言参考文章1 安装工具gnome tweaks2 修改窗口的按钮位置3 安装gnome扩展并设置4 美化桌面主题5 美化图标6 美化光标7 美化桌面背景 xff0c 锁屏和登陆页面8
  • Android中的onConfigurationChanged方法没有被调用的原因

    在 Android中的onConfigurationChanged方法没有被调用的原因有很多 而刚入门是经常犯的两个错误直接导致onConfigurationChanged方法没有被调用 下面看看程序 package cn com impo
  • 31岁转行的我

    2011年从一所普通二本师范大学毕业后先后从事了两年的教育工作 xff0c 但都没有挣到钱 xff0c 12年从深圳回到西安 xff0c 参加了几次公务员和事业单位的招考 xff0c 几次因0 1分的微小差距与国家饭碗擦肩而过 后来决定不再
  • 吴军老师《给中学生/大学生的书单》----Yohao整理

    2018 7 27记录 span class hljs code 给中学生的书单 span 一 文学类 18本 span class hljs code 1 金庸和琼瑶各一本 长篇的比短篇的好 span span class hljs co
  • javaweb利用钉钉机器人向钉钉群推送消息(解决中文乱码)

    可以参考 官方文档 xff1a https open doc dingtalk com docs doc htm spm 61 a219a 7629140 0 0 karFPe amp treeId 61 257 amp articleId
  • HDFS命令

    HDFS命令 1 hdfs基本操作 HDFS命令有两种风格 xff1a hadoop fs开头的 hdfs dfs开头的 两种命令均可使用 xff0c 效果相同 1 1 常用命令 如何查看hdfs或hadoop子命令的帮助信息 xff0c
  • 【Http2特性——Binary framing layer--push---HPACK】

    google文档 Http2 http2 引入了不兼容的new binary framing layer 所以大版本号增加了除非使用tcp socket xff0c 否则看不出http的版本区别 指Http向上层暴露的API接口一致 xff