http2

news2024/11/15 11:11:13

HTTP: HTTP/2 - High Performance Browser Networking (O'Reilly)

以下内容都是上面这篇文章的一些总结(或者说翻译hiahia)

http2是由谷歌的SPDY之上演变而来的。主要涉及的技术包括:

头部压缩,多路复用,请求优先级

http2在socket和http之间,增加了一个binary framing层(二进制分帧层)。所以不会影响Http原先定义的任何header字段,但会影响他们传输时的编码方式。

在http2,所有的http通信都被分成了更小的message和frames来进行传输,message和frame都是二进制编码。基于这一点,服务端和客户端都必须有识别二进制分帧的机制,否则他们无法进行通信。比如http1的client是没办法识别Http2的server的。但是应用层是没办法识别底层是使用http1还是http2的。所以对应用层上的应用来说是没有影响的。

Streams,Messages,and Frames

  1. Stream:在一个connection之上的一次双向通信,可以携带一个或多个messages。
  2. Message:一个Request或Response(message)会映射成一个序列的frame。
  3. Frame:http2中的最小沟通单位。每一个frame都包含一个frame header。这个header至少会包含这个帧属于哪个stream的标识。

他们之间的关系:

  1. 一个TCP connection之上,会携带很多双向的Streams(一个HttpRequest对应一个HttpResponse)。
  2. 每个Stream都有一个唯一的标识,和一些额外的信息,比如优先级(请求优先级)等。
  3. 每个Message都是一个logical Http Message,比如一个Request或是一个Response,一个message包含一个或多个frames。
  4. 每个frame都是通信的最小单位,一般会携带一个specific type data,比如http headers,或message payload(body?)。不同streams上的frame有可能会交错在一起,然后在最后通过stream标识符,重新组合在一起。

这个图中,一个单向的红色箭头,是一个message,两个单向的箭头(Request和Response)合在一起称为stream。一个message由多个frame组成,比如图中Response Message由Headers frame,和data frame。

 

 

Stream Prioritization

http2给每一个stream(Request/Response)都创建了一个权重(weight)的概念,权重的值在1-255之间。

  1. 每一个stream都有可能有自己的权重(也有可能没有权重?)
  2. 一个stream有可能会对另一个stream有明显的依赖关系。

以上两点,可以让客户端创建出一个stream之间的依赖树。

 

对于上面这个图,可以解释为:

  1. A和B占用资源的全部,其中A占3/4,B占1/4(这里说的资源代表带宽,内存等)。
  2. D是C的parent,所以,D先被分配全部资源,然后再到C被分配全部资源。
  3. D先被分配全部资源,C再被分配全部资源,然后A,B再按1中的比例分配资源。
  4. D先被分配全部资源,E,C平分资源,再到A,B按1中比例分配资源。

比如对于浏览器,由于HTML对于构建DOM很重要,而CSS都构建CSSON很重要,而DOM和CSSOM都会被JS阻塞。而剩余的images等资源,会被赋予更低的优先级。

ONE Connection Per Origin

一个Origin,一个Connection,这个可以减少资源的消耗,增加网络吞吐量,减少传输延时。

但同时也有一些由于TCP协议而产生的开销:

  1. TCP层级的head-of-line blocking 头部阻塞(好像是一个packet丢了,整个序列重传?)
  2. 禁用TCP窗口缩放,带宽延迟及会限制连接吞吐量。
  3. 当有一个packet丢失,TCP的拥塞窗口大小会减小,这会降低整个连接的最大吞吐量。

Less effective header compression due to distinct compression contexts

由于不同的压缩上下文,http 头部的压缩效率较低

Less effective request prioritization due to distinct TCP streams

不同的TCP stream导致request的优先级效率较低

Less effective utilization of each TCP stream and higher likelihood of congestion due to more competing flows

更多的竞争流导致TCP stream的利用率变低,以及拥塞的可能性提高。

Increased resource overhead due to more TCP flows

Flow Control 流量控制

流量控制是放置发送方一次性发送太多数据给接收方,导致接收方的接受缓存存储不下发送的数据,导致丢包。

TCP有自己的流量控制机制,但控制的不够精细。现在HTTP2也提出一套流量控制机制:

  1. 流量控制是有方向性的,接收方会有可能选定对每一个stream和整个connection,它所期望的window size。
  2. 流量控制是基于信用的,当reciever给定它的stream和connection初始window size之后,这个window size会在收到sender发送的data frame减少,或当reciver发送WINDOW_UPDATE帧之后增加。
  3. 流量控制是关闭不了的。当HTTP2 connection建立之后,client和server将会交换SETTINGS frame,这个frame会设置流量控制的window size。默认的window size是65536 bytes。但是reciever可以在收到任意数据后,通过WINDOW_UPDATE frame设置更大的window size。
  4. 流量控制是逐跳的,而不是端到端的。

HTTP2似乎将流量控制下发到了client和server,client和server可以自己去实现流量控制的机制。

比如,应用层级别的流量控制可以表现为:

先允许浏览器获取一部分关键的资源,然后将流量窗口设置为0,先让浏览器获取更高优先级的请求,然后再恢复这个stream的获取?即,比如先获取一个图片的缩略图,展示它,然后再去获取更高优先级的资源。然后等这个资源获取到之后,再继续回去获取这个图片。

Server push

http2的新增功能,服务端的push。client端可能只发送了一个请求html的Request,server端可以返回多个response,比如html,css,js的response。

Header compression 头部压缩

头部压缩主要有两个方面:

  1. 使用HPACK的压缩机制对头部进行压缩:对每一个传输的header fields都编码成huffman编码(哈夫曼编码),可以减少传输的大小。
  2. 允许client和server保持先前看到的header的值,每次传输,只会传输head fields改了的field。

Frame种类

DATA

Used to transport HTTP message bodies

HEADERS

Used to communicate header fields for a stream

PRIORITY

Used to communicate sender-advised priority of a stream

RST_STREAM

Used to signal termination of a stream

SETTINGS

Used to communicate configuration parameters for the connection

PUSH_PROMISE

Used to signal a promise to serve the referenced resource

PING

Used to measure the roundtrip time and perform "liveness" checks

GOAWAY

Used to inform the peer to stop creating streams for current connection

WINDOW_UPDATE

Used to implement flow stream and connection flow control

CONTINUATION

Used to continue a sequence of header block fragments

Frame头部

一个frame的头部,一般是固定的9 byte。

flags一般代表的是保留字段,3 byte的容量存储frame的长度,代表一个frame最多可以携带2^24 bytes。但是http2一般规定一个frame的最大长度为16KB。

type代表的意思是上面的10个type,代表这是个header frame,或是data frame或,,,type代表的意思是上面的10个type,代表这是个header frame,或是data frame或,,,

stream identifier代表这个frame从属于哪个stream。

Frame例子

这里type显示这是个 HEADER type类型的帧

这是个DATA 帧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/548162.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Docker Dockerfile构建php LNMP集成开发环境,并运行Thinkphp5

宿主机环境 系统:MAC、Windows10 Docker版本:Docker version 23.0.5 Docker Desktop:Dockerdesktop官方地址 前言 这篇主要介绍如何在Mac、Windows10使用docker搭建LNMP集成开发环境。下面我会写Dockerfile编译安装Nginxphp基础环境。mysql、redis基…

多维时序 | MATLAB实现基于贝叶斯线性回归(Bayesian Regression)的多变量时间序列预测

多维时序 | MATLAB实现基于贝叶斯线性回归(Bayesian Regression)的多变量输入回归预测 目录 多维时序 | MATLAB实现基于贝叶斯线性回归(Bayesian Regression)的多变量输入回归预测预测效果基本介绍模型描述程序设计参考资料预测效果 基本介绍 多维时序 | MATLAB实现基于贝叶斯线…

Rocky Linux 8.8 发布 - CentOS 的权威替代

Rocky Linux 8.8 发布 - CentOS 的权威替代 Rocky Linux 由 CentOS 项目的创始人 Gregory Kurtzer 领导 请访问原文链接:https://sysin.org/blog/rocky-linux-8/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org 以…

Linux-Shell编程

一,shell编程的概念 1.0Shell与内核的关系 内核是Linux系统的核心,它是操作系统的最底层部分,负责管理计算机的硬件资源,例如CPU、内存、磁盘等。内核还提供了许多系统调用,供应用程序使用,例如打开文件、…

数字员工IN淄博:淄博烧烤火出圈,政务服务很圈粉!

“小饼烤炉加蘸料,灵魂烧烤三件套”,淄博烧烤近期在各大社交媒体平台火爆出圈,不少人慕名前往亲身体验人间烟火气,让这座传统工业城市再度名声鹊起,焕活了淄博文旅市场的发展潜能。淄博人民的淳朴热情造就了这一次淄博…

STM32F401RET6 LQFP64 (Nucleo-F401RE) SPI通信(主从双机SPI通信)

STM32F401RET6 LQFP64 (Nucleo-F401RE) SPI通信(主从双机SPI通信) 1.1 SPI总线介绍 SPI 通讯使用 3 条总线及片选线,3 条总线分别为 SCK、MOSI、MISO,片选线为NSS(CS) NSS 信号线由高变低 ,是 SPI 通讯的起始信号 。…

Redis系列--redis集群

一、redis集群介绍 一、简介与注意事项 由于数据量过大,当单个master挂了再slave进行选举时,会有一定时间内无法进行写操作,会出现数据的丢失。也就数说单个master复制集难以承担,因此需要对多个复制集进行集群,形成水…

AcWing 243. 一个简单的整数问题2

题目描述 题目链接:AcWing 243. 一个简单的整数问题2 给定一个长度为 N 的数列 A,以及 M 条指令,每条指令可能是以下两种之一: C l r d,表示把 A[l],A[l1],…,A[r] 都加上 d。 Q l r,表示询问数列中第 l∼…

【5.20】五、安全测试——安全测试工具

目录 5.4 常见的安全测试工具 1. Web漏洞扫描工具——AppScan 2. 端口扫描工具——Nmap 3. 抓包工具——Fiddler 4. Web渗透测试工具——Metasploit 小提示:Kali Linux 5.4 常见的安全测试工具 安全测试是一个非常复杂的过程,测试所使用到的工具也…

自学网络安全/Web安全,一般人我还是劝你算了吧

由于我之前写了不少网络安全技术相关的文章,不少读者朋友知道我是从事网络安全相关的工作,于是经常有人私信问我: 我刚入门网络安全,该怎么学? 要学哪些东西? 有哪些方向? 怎么选&a…

【leetcode】1373. 二叉搜索子树的最大键值和

二叉搜索子树的最大键值和 问题描述问题简单分析提交之旅第一次提交-失败第二次提交-失败第三次提交-成功 问题描述 二叉搜索子树的最大键值和 给你一棵以 root 为根的 二叉树 ,请你返回 任意 二叉搜索子树的最大键值和。 二叉搜索树的定义如下: 任意节…

JVM学习(六)

1. JAVA 集合 1.1. 接口继承关系和实现 集合类存放于 Java.util 包中,主要有 3 种:set(集)、list(列表包含 Queue)和 map(映射)。 1. Collection:Collection 是集合 List、Set、Queue 的最基本的接口。 2. Iterato…

Apple Safari 16.5 发布- macOS 专属浏览器 (独立安装包下载)

Apple Safari 16.5 - macOS 专属浏览器 (独立安装包下载) Safari 浏览器 16 for macOS Montery, Big Sur 请访问原文链接:https://sysin.org/blog/apple-safari-16/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org…

DevOps系列文章-Kubernetes实现CI与CD配置

Kubernetes实现CI与CD配置 一、基本介绍 基于 Kubernetes 实现 CI/CD 配置,其实和往常那些 CI/CD 配置并没有太大区别。都是通过 提交代码,拉取代码,构建代码,发布代码来实现的。 只不过要是通过 K8s 来实现的话,则是…

HNU-计算机系统-讨论课7

选题三 、我们自己来写,太“库”啦 ~ ( 1 ) 在 Linux 里用 C 语言进行代码设计,能对某一个班级、某一门 课程、某一名学生的分数进行分析,比如分数段、最高分、最低 分、排名、优势课程等,具体涉及分析…

【计算机系统基础bomb lab】CSAPP实验:Bomb Lab

CSAPP 实验:Bomb Lab 实验内容简述 作为实验目标的二进制炸弹 “Bomb Lab” Linux可执行程序包含了多个阶段(或关卡),在每个阶段程序要求输入一-个特定字符串,如果输入满足程序代码所定义的要求,该阶段的炸弹就被拆除了&#xf…

基于Zynq的雷达10Gbps高速PCIE数据采集卡方案(二)硬件设计

3.1 引言 采集卡的硬件设计是实现采集功能的基础,良好的硬件设计可以使采集功能更容 易实现,方便软件开发。本章基于第二章的硬件设计方案来详细介绍采集卡硬件设计。 包括载卡和子卡的芯片的选型、配置和具体电路的设计。载卡和子卡的硬件设计总体 …

美联储内部分歧不断加大 妥协方案:6月“跳过”,7月再加

在周五举行的托马斯劳巴赫研究会议上,美联储主席鲍威尔、前主席伯南克一同出席,并对当前的热点政策问题发表了看法。货币政策,自然是备受关注的议题。 凭借研究“银行和金融危机”荣获2022年诺贝尔经济学奖的伯南克表示,银行业危机…

Linux文件与目录管理笔记1

鸟哥私房菜笔记 这里写目录标题 常用文件命令cd,pwd,mkdir,rmdir 执行文件的路径的变量:$PATHls,cp,rm,mv 文件内容查看指令(cat,tac,nl)可翻页查看(more,less)More(一页一页翻动)less 数据截取(head,tail)非纯文本文件:od 常用文件命令 cd…

lwIP:宏 LWIP_TCPIP_CORE_LOCKING(内核锁定)

从 lwIP-2.0.0 开始,在 opt.h 中多了一个宏开关 LWIP_TCPIP_CORE_LOCKING,默认使能。这个宏是启用内核锁定功能的。 本文探索这个宏的前世今生。 2007 年 5 月 24 日,Simon Goldschmid (以下简称 西蒙 )提交了一个任务…