HTTP 2.0 协议

2023-11-05

HTTP

说起HTTP 协议(超文本传输协议),很多人应该觉得很熟。不过随着HTTP2.0 的普遍应用,我们对其应该有更多的了解。

HTTP是浏览器或其他客户端程序与Web服务器之间的应用层通信协议。基于TCP 协议的。主要经历
HTTP 1.0, HTTP 1.1和 HTTP 2.0。

HTTP 1.0

我们知道,HTTP 是基于 TCP 连接的。每次建立连接,TCP 协议都会进行三次握手,获取一个可靠连接。然后HTTP 协议就可基于此连接通讯。当使用后,然后关闭。
在早期,web网页非常简单,只有简单的html、js和css。因此,当一个页面打开时,不需要传输很多东西。考虑系统的效率的效率,服务器完成请求处理后立即断开TCP连接,即短连接。另外也不记录过去的请求,即无状态协议。而浏览器或者客户端自行维护请求状态,降低了服务器的复杂度。

随着web 发展,网页变得越来与复杂,每个页面打开需要加载很多html、css、js和一些图片等资源。这就出现了问题。
首先,HTTP1.0 下,这些资源的请求和传输都是排队的,即Head of Line Blocking(上一个请求没得到响应,后续请求要排队)。另外,每个资源的请求传输都建立一次连接,然后关闭,代价很大。我们知道,TCP 连接是慢启动的。这就造成打开一个页面时,出现严重的延迟。

HTTP1.1

HTTP1.1 做了很多改进:
1. 长连接Keep-Alive
默认设置Connection 为Keep-Alive。这样就可以在一个TCP 连接上进行多次HTTP 传输,减少了建立和关闭连接的延迟。
例如下面,在一个连接中进行请求 1 、 2 和 3.

2. 缓存处理
引入了Cache-Control,ETag 等http headers来管理缓存。


3. Range头域

HTTP 1.1 开始支持只请求资源的一部分。这样我们在请求音频、视频等大文件时,可以很快的得到所需要资源。

缺点:
虽然,HTTP 1.1 在保持HTTP 1.0优点的基础上,克服了每次请求都创建连接的问题。但还是存在 Head of Line Blocking的问题。
拿上面的例子来说,当请求1 的响应还没返回,客户端是无法发送请求 2 和 3的。






SPDY

要说HTTP 2.0,不得不先提下SPDY。 SPDY 是谷歌开发的一个实验性协议,于2009 年中发布,主要目标是通过解决HTTP 1.1 中广为人知的一些性能限制,来减少网页的加载延迟。这里说下,SPDY不是用于替代HTTP的协议,而是对HTTP协议的增强。更多知识请看 官网

结构如下:


从图上看,SPDY位于HTTP之下,TCP和SSL之上,从软件设计上讲,这样很容易兼容旧版本的HTTP协议。


这里先了解几个概念:

session: 一个session就是一个TCP 连接。
stream(流):一次HTTP Request/Response来回称作流。因为复用TCP连接,所以一个SPDY连接里会有多个流。用Stream-ID来标记。原则上,不考虑资源限制,一个连接上可以有无限多个流。另外,流是双向的。
frame(帧):即服务器与客户端之间一次单向传输的内容。也就是我们发送的数据。类似其他协议,frame也分control frame 和data frame 两种。
另外,SPDY中有3种control frame,控制stream的生命周期。
SYN_STREAM:创建流,因为SYN_STREAM 带有 priority(SPDY分了0~7优先级), 因此得到的stream 也是有优先级的。
SYN_REPLY:回复创建流,在payload里携带HTTP头部。注意这里做了处理,response header放在控制帧SYN_REPLY的payload里并经过压缩,response entity放在数据帧里。
RST_STREAM:关闭流。


可以想象:在一个TCP连接上,打开一个session,然后在这个session上,并发n多个流。



从上边的一些介绍不难理解SPDY 有以下功能:
1. 多路复用(multiplexing):通过多个stream共享一个tcp连接的方式,解决了http1.1 Head of Line Blocking的问题,降低了延迟同时提高了带宽的利用率。
2. 请求优先级:我们的stream在创建的时候赋予了优先级,因此我们的steam是有优先级的。
3. HTTP报头压缩:SPDY把HTTP response拆开,然后通过zlib对HTTP头进行了压缩,并强制开启HTTP BODY的Gzip压缩。
4. 服务器推送:通过Server Push和Server Hint技术,服务器可以主动的向客户端推送资源。

在SPDY下,我们的请求就变成:




HTTP2.0


基于SPDY的一些实现,IETF 推出了 HTTP2.0。
HTTP2.0 主要有以下特性:
多路复用 (Multiplexing)
二进制分帧
首部压缩(Header Compression)
服务端推送(Server Push)
HTTPS

不过目前SPDY和 HTTP2.0 还没有普遍推广,这里我找到一个SPDY的一个库。有兴趣的可以玩下。


https://www.npmjs.com/package/spdy





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

HTTP 2.0 协议 的相关文章

  • matlab分类算法函数,MATLAB分类与预测算法函数

    1 glmfit 功能 构建一个广义线性回归模型 使用格式 b glmfit X y distr 根据属性数据X以及每个记录对应的类别数据y构建一个线性回归模型 distr可取值为 binomial gamma inverse gaussi
  • C#系列之值类型与引用类型

    目录 1 变量类型的复习 2 值类型和引用类型的区别 1 变量类型的复习 无符号整形 byte b 1 ushort us 1 uint ui 1 ulong ul 1 有符号整形 sbyte sb 1 short s 1 int i 1

随机推荐

  • LINUX下更改字符编码方式-增加GB2312

    修改local文件 sudo gedit var lib locales supported d local 添加zh CN GB2312字符集 如下 en US UTF 8 UTF 8 zh CN UTF 8 UTF 8 zh CN GB
  • 推荐几个 VS Code 扩展、主题和字体

    前言 工欲善其事 必先利其器 VS Code 作为当前最流行的开源代码编辑器之一 要说它为什么这么受大众喜爱 我觉得一是它现代化的界面 二是它强大的扩展系统 得益于 VS Code 的扩展系统 我们可以给编辑器加上各种 Buff 让它变成自
  • 深度学习经典网络:ShuffleNet 系列网络(ShuffleNet v1)

    ShuffleNet v1 http openaccess thecvf com content cvpr 2018 html Zhang ShuffleNet An Extremely CVPR 2018 paper html tenso
  • 第十四届蓝桥杯模拟赛第二期J题答案(C++代码)

    A题 题面 请找到一个大于 2022 的最小数 这个数转换成二进制之后 最低的 6 个二进制为全为 0 请将这个数的十进制形式作为答案提交 思路 由于最低6位都是0 且 11111000000 2 lt 2048 10 所以选要选取 100
  • 让vs2008与vs2012同时打开同一个项目文件

    在开发过程中 小组开发经常碰到很多人用的ide版本不同 而项目组成员为了参与多个项目 经常安装多个版本的ide 本文主要讲解vs2008与vs2012之间如何在源码管理下同时打开一个项目文件进行开发 本文以c 开发为例 其他语言一样 1 关
  • 并发编程 :Concurrent 用户指南 ( 下 )

    并发编程 Concurrent 用户指南 下 2017 09 04 ImportNew 来源 高广超 www jianshu com p 8cb5d816cb69 锁 Lock java util concurrent locks Lock
  • gradlew 命令说明

    gradlew 命令 快速构建命令 查看所有任务 gradlew tasks all gradlew命令都可以使用简写 例如 gradlew assembleRelease 简写为 gradlew aR 查看项目的依赖都依赖了哪些库 gra
  • Android 3.0 SDK中新增API详解

    Android 3 0 SDK中新增了哪些API呢 我们总结下平板系统honeycomb中的新特性 首先需要澄清的是经过eoeAndroid发现设置模拟器的分辨率到普通WVGA这样的解析度时平板的特性自动消失和Android 2 3没有什么
  • Pytorch 随机种子设置 不可控因素

    为确保模型训练过程中 需要设置模型的随机种子 具体操作如下 主程序 def torch seed seed torch manual seed seed torch cuda manual seed seed torch cuda manu
  • redis三个连接客户端框架的选择:Jedis,Redisson,Lettuce

    Jedis api 在线网址 http tool oschina net uploads apidocs redis clients jedis Jedis html redisson 官网地址 https redisson org red
  • 记录 Libevent的常用功能示例

    介绍 Libevent是开源社区一款高性能的I O框架库 是reactor模式的优秀体现 网上相关资料很多 这篇博文主要以尽量简练的代码实现TcpServer服务器功能 代码覆盖大部分的常用函数接口 通过代码能对Libevent的整体框架
  • c# 通过ImageSharp实现心电图数据保存为本地图片

    文章目录 一 实现结果 二 实现步骤 控制台应用 控制台应用方便 直接将图片生成到本地 三 完整代码 一 实现结果 二 实现步骤 控制台应用 控制台应用方便 直接将图片生成到本地 添加 NuGet 引用包 SixLabors ImageSh
  • P型MOS管常用型号表,电子工程师选型必备!

    P型MOS管常用型号表 如果不清楚如何对P型MOS管选型 可以联系泰德兰电子 在线销售工程师一对一技术支持服务 专业MOS管代理商 长期代理美国aos万代MOS管 重庆万国MOS管 日本松木MOS管等品牌 免费在线分享提供P型MOS管选型
  • PC-lint9 集成至vs2008及配置

    Setp 1 运行config exe对std lnt进行配置时 勾上对VS2008的支持 这里不在赘述 网上关于此的文章非常多 Setp 2 打开vs 2008 点击Tools gt External Tools STEP 3 选择ADD
  • 锁表查询及处理

    锁表及查询及kill命令生成语句 SELECT b sid b serial b logon time b username b osuser a object name alter system kill session b sid b
  • std::tuple还是struct?

    std tuple是C 11提供的新模板类 可以翻译为 元组 可把多个不同类型的变量组合成一个对象 std tuple可看做std pair的泛化实现 std pair包含两个元素 std tuple 可以同时包含多个元素 它拥有 stru
  • 【Keil5】Keil查看程序占用flash大小

    文章目录 一 问题 二 解决方法 参考资料 一 问题 我们在挑选一款单片机的时候 会查询单片机的主频 内部flash和RAM 封装 各种外设接口资源 其中flash和RAM大小尤为重要 以STM32H750VBT6为例 其内部flash只有
  • Unity3d 开发Pico4应用打开工程卡在Importing(iteration xxx) busy for xx:xx)...问题记录

    问题 大致问题如题 步骤是参照了PICO官方给出的快速开始的步骤进行的 而这个我问题的出现是在导入 PICO Unity Integration SDK 前往 SDK 下载中心 下载最新版本的 SDK 1 解压所下载的 SDK 压缩包 2
  • 什么是Base64?

    一 什么是Base64 百度百科中对Base64有一个很好的解释 Base64是网络上最常见的用于传输8Bit字节码的编码方式之一 Base64就是一种基于64个可打印字符来表示二进制数据的方法 什么是 可打印字符 呢 为什么要用它来传输8
  • HTTP 2.0 协议

    HTTP 说起HTTP 协议 超文本传输协议 很多人应该觉得很熟 不过随着HTTP2 0 的普遍应用 我们对其应该有更多的了解 HTTP是浏览器或其他客户端程序与Web服务器之间的应用层通信协议 基于TCP 协议的 主要经历 HTTP 1