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 协议 的相关文章

  • html中使用js实现体彩11选5随机选号

    体彩11选5随机选号 页面预览 代码实现
  • JS中的发布-订阅

    发布订阅模式 什么是发布 订阅模式 发布 订阅模式的实现 发布 订阅实现思路 总结 优点 缺点 Vue 中的实现 观察者模式和发布订阅的区别 观察者模式 发布订阅模式 什么是发布 订阅模式 发布 订阅模式其实是一种对象间一对多的依赖关系 当
  • QRCode简单生成二维码

    QRCode简单生成二维码 1 导包 2 jsp的body里 div div
  • [Vue warn]: Error in render: “TypeError: cellValue.replaceAll is not a function

    去除中括号 如 车门 车门 let reg new RegExp g return str replaceAll reg 上面方法 在edge浏览器 谷歌浏览器没问题 但是在搜狗和QQ浏览器就报错 解决办法 return str repla
  • JS for循环的3种使用

    1 1 for循环使用 1 for in 遍历存放对象的一维数组 var arr id 1 name 張山 id 2 name 李四 for var i in arr console log i 结果 仅仅会得到数组的索引会遍历数组的原型属
  • js 本地存储和获取

    localStorage setItem temp orderAr 存入 参数 1 调用的值 2 所要存入的数据 console log localStorage getItem temp 输出
  • js数组相加相减函数

    数组相减 reduceArray arr1 arr2 for var i arr1 length 1 i gt 0 i var a arr1 i for var j arr2 length 1 j gt 0 j var b arr2 j i
  • 通过js在ul中插入10000个li,点击li打印出li的序号

    第一种 直接ul插入 花费了119ms 164ms window onload function let now new Date let ul document querySelector ul for let i 0 i lt 1000
  • Vue.observable的理解

    一 Observable 是什么 Observable 翻译过来我们可以理解成可观察的 先来看其在Vue中的定义 Vue observable 让一个对象变成响应式数据 Vue 内部会用它来处理 data 函数返回的对象 返回的对象可以直接
  • js读取jpg图片扩展信息,处理二进制数据

    js 读取图片扩展信息 将图片转为ArrayBuffer var http new XMLHttpRequest http onload function if this status 200 this status 0 console l
  • Js中的defer属性和async属性

    Js中的defer属性和async属性 一 defer和async 1 defer 指外部js文件和当前html页面同时加载 异步加载 但只在当前页面解析完成之后执行js代码 async 指外部js文件和当前html页面同时加载 异步加载
  • UE编辑器下简单把 excel格式的表格转换为wiki支持的表格

    觉得 wiki下 mediawiki 导入excel和word表格好麻烦 微软自带的offic插件wiki转换工具一直都安装不上 为了更新wiki内容只能手动来做了后来总结了以下手动方法 1 复制编辑好的Excel表格到记事本 用ue打开
  • Vue中的import from

    Vue中的import from 大家都知道 import from 是用来引入一些文件的 在vue中 可能有 js文件 json文件 vue文件 在JS和JSON文件引入的时候 往往需要写入一些 例如数组 export const a 例
  • php中文乱码或html中文乱码

    参考gpt 一 在PHP中解决中文乱码问题的常见方案有以下几种 设置字符编码 在你的PHP代码中 可以使用 header 函数设置正确的字符编码 常见的字符编码是UTF 8 可以使用以下代码将页面的字符编码设置为UTF 8 header C
  • 如何通过 Nginx 设置 SPDY 协议?

    我有一个 Rails 应用程序 想要设置 google SPDY 协议支持 但是在安装带有 SPDY 补丁的 Nginx 并在虚拟主机中启用 spdy 后 它不允许我重新启动 nginx 而是抛出以下错误 Restarting nginx
  • vue2项目实现excel文件导入导出和拖拽上传

    文章目录 一 excle文件导出 二 excel文件导入 三 文件拖拽上传 四 完整代码 文件导入导出实现逻辑图 一 excle文件导出 导出员工接口返回的是二进制流 axios配置responseType为blob接收二进制流文件为Blo
  • 30天精通Nodejs--第二十二天:express-认证和授权

    目录 引言 理解JWT及其工作原理 安装与引入JWT库 生成JWT令牌 验证JWT令牌 注意事项与最佳实践 结语 引言 在现代Web应用开发中 JSON Web Tokens JWT 作为一种轻量级 自包含且安全的标准 已被广泛用于实现用户
  • SPDY - 没有 TLS?

    我正在尝试实现 SPDY 使用 Node js 以用于高延迟连接 现在 SPDY 使用 TLS 加密 这会增加数据包长度 这是我试图避免的 是否有没有 TLS 加密的 SPDY 实现 提前谢谢了 SPDY 的成帧层不需要在 TLS 上运行
  • SPDY 与保持活动连接上的 http 多路复用有何不同

    HTTP 1 1 支持保持活动连接 在发送 Connection close 之前连接不会关闭 那么 如果浏览器 本例中是firefox 启用了network http pipelined 并且增加了network http pipelin
  • 当支持 SPDY 的浏览器收到 HTTP2 (H2) 响应时会发生什么?

    我的直觉是 支持 SPDY 的浏览器会将其视为 SPDY 响应 然而 我能找到的最多的是 H2 响应将优雅地降级到 HTTP1 1 的保证 我正在考虑以面向 H2 的方式提供资产 多个请求 无域分片等 但我确实需要支持一些非 H2 浏览器

随机推荐

  • 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