HTTP --- HTTP2小结

参考

HTTP发展史

  • HTTP/0.9 - 单行协议
    • 问世于1990年,那时的HTTP非常简单: 只支持GET方法; 没有首部; 只能获取纯文本
  • HTTP/1.0 - 搭建协议的框架
    • 1996年,HTTP正式被作为标准公布,版本为HTTP/1.0。1.0版本增加了首部、状态码、权限、缓存、长连接(默认短连接)等规范,可以说搭建了协议的基本框架。
  • HTTP/1.1 - 进一步完善
    • 1997年,1.1版本接踵而至。1.1版本的重大改进在于默认长连接; 强制客户提供Host首部;管线化;Cache-Control、ETag等缓存的相关扩展
      • 注: Etag和Last-Modified同时存在,以Etag为主

【HTTP/1.0的缺陷】:

  1. 连接无法复用: 一个连接对应一次握手
  2. 队头阻塞: 前面一个连接未完成,后面的连接无法进行

对于问题1, HTTP/1.1新增了一个connection: keep-alive,使连接完成后不断开.

目前存在的问题

​ 我们先来看看HTTP发展到1.1存在的问题:

  1. 线头阻塞: TCP连接上只能发送一个请求,前面的请求未完成前,后续的请求都在排队等待.
  2. 多个TCP连接:
    • 虽然HTTP/1.1管线化可以支持请求并发,但是浏览器很难实现,chrome、firefox等都禁用了管线化.所以1.1版本请求并发依赖于多个TCP连接,建立TCP连接成本很高,还回存在慢启动的问题.
  3. 头部冗余,采用文本格式
    • HTTP/1.X版本是采用文本格式,首部未压缩,而且每一个请求都会带上cookie、user-agent等完全相同的首部
  4. 客户端需要主动请求

HTTP/2.0中的一些重大改进

HTTP2性能提升的核心就在于二进制分帧层。HTTP2是二进制协议,他采用二进制格式传输数据而不是HTTP/1.x的文本格式

  • 1.1响应是文本格式,而2.0把响应划分为两个帧

    • HEADERS frame: 首部
    • DATA frame: 消息负载
  • 也就是说: 一条HTTP响应,划分为两个帧来传输,并且采用二进制来编码

    • 流(Stream): 已经建立TCP连接上的双向字节流,可以承载一个或多个消息
    • 消息(Message): 一个完整的HTTP请求或响应,由一个或多个帧组成。特定消息的帧在同一个流上发送,这意味着一个HTTP请求或响应只能在一个流上发送.
    • 帧(Frame): 通信的基本单位。 一个TCP连接上可以由任意数量的流

多路复用

HTTP/2.0让所有的通信都在一个TCP连接上完成,真正实现了请求的并发.

HTTP/2.0建立一个TCP连接,一个连接上面可以有任意多个流(stream),消息分割成一个或多个帧在流里面传输。帧传输过去以后,再进行重组,形成一个完整的请求或响应。这使得所有的请求或响应都无法阻塞。

头部压缩

在1.X版本中,首部用文本格式传输,通常会给每个传输增加500~800字节的开销。大多数请求的首部字段是相同的(如cookie、user-agent等)。

HTTP2为此采用HPACK压缩格式来压缩首部,头部压缩需要在浏览器和服务器之间:

  • 维护一份相同的静态字典,包含常见的头部名称,以及常见的头部名称和值的组合
  • 维护一份相同的动态字典,可以动态的添加内容
  • 通过静态Huffman编码对传输的首部字段进行编码

HTTP/2.0的静态字典,部分:

IndexHeader NameHeader Value
1:authority
2:methodGET
3:methodPOST
4:path/
5:path/index.html
6:schemahttp
7:schemahttps
8:status200
9:status204

所以我们在传输首部字段的时候,例如要传输method:GET,那我们只需要传输静态字典里面method: GET对应的索引值就可以了,一个字节搞定.

user-agent、cookie这种字典里面只有首部名称而没有值的首部,第一次传输需要user-agent在静态字典中的索引以及他的值,值会采用Huffman编码来减小体积

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

服务器推送技术

  • 服务器推送: 使得服务器可以预测客户端需要的资源,主动推送到客户端

  • 例如: 客户端请求index.html,服务器端能够额外推送script.jsstyle.css.原理:

    • 客户端发送请求时,服务器能够分析这个页面所依赖的其他资源,主动推送到客户端的缓存
    • 当客户端收到原始网页的请求时,它需要的资源已经位于缓存

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

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

相关文章

藤条生长为字母的动画

https://www.youtube.com/watch?vLshPEGiHsqc Blender Tutorial: Vine Animation Text 需要使用插件Add Curve: IvyGen, 进入用户设置,找到并沟选该插件. 建模:立体文字, [Alt C] 转换为网格mesh;选中网格文字,新建藤蔓:[Shift A], Curve\Add Ivy to Mesh左边工具栏下方的IvyG…

RDS Mysql中binlog日志查看

1、在阿里云下载下载的binlog 文件 如:mysql-bin.000217 2、想在本机解析出来,在本机安装mysql5.7版本(注意系统版本要比RDS mysql 版本高才行) 3、 cmd进入本机mysql\bin目录 e: cd E:\mysql5.7\bin mysqlbinlog -vv --base64-o…

读书笔记 --- 再次阅读回流与重绘

参考 - 强烈推荐看看,这个作者写了很多特别好的文章. 浏览器渲染过程 解析HTML,生成DOM树; 解析CSS生成CSSOM树将DOM树和CSSOM树合并,生成渲染(Render)树Layout(回流): 根据生成的渲染树,视口(viewport),得到节点的几何信息(位置、大小)Painting(重绘): 根据渲染树和几何信息…

2017-2018 ACM-ICPC, Asia Daejeon Regional Contest

C 有n个节点和m边条,求一条最长的路径,该路径(c1,c2,c3...cn)满足 不出现重复的节点,ci 和ci1是邻居节点,且 ci 的邻居节点数量小于ci1的邻居节点数量。 记忆DFS遍历,每次递归计算的值都保存在数组里,这样复…

javascript --- 将DOM结构转换成虚拟DOM 虚拟DOM转换成真实的DOM结构

虚拟DOM的实现 使用虚拟DOM的原因: 减少回流与重绘 将DOM结构转换成对象保存到内存中 <img /> > { tag: img} 文本节点 > { tag: undefined, value: 文本节点 } <img title"1" class"c" /> > { tag: img, data: { title "1&q…

swap(a,b)值交换的4种方法

方法一&#xff1a;int tmp 0; tmp b;b a; a tmp; 方法二&#xff1a;a ab; b a-b; a a-b;方法三&#xff1a;a ^ b ^ a^ b;方法四&#xff1a;a ab-(ba);转载于:https://www.cnblogs.com/vocaloid01/p/9514126.html

装系统工具

安装如果失败,注意是不是工具的版本太老导致 系统分区工具: DiskGeniusPortable 刻录工具: UlraISO rufus https://rufus.ie/ win32diskimager 转载于:https://www.cnblogs.com/jiangfeilong/p/9937164.html

小程序WXML基本使用

数据绑定 <!--wxml--> <view> {{message}} </view> // page.js Page({data: {message: Hello MINA!} }) 列表渲染 <!--wxml--> <view wx:for"{{array}}"> {{item}} </view> // page.js Page({data: {array: [1, 2, 3, 4, 5]} })…

javascript --- vue中简单的模板渲染

一层的渲染 将下面的模板中的mustache语法使用给定数据渲染. 模板如下 <div id"root"><div><div><p>{{name}} - {{message}}</p></div></div><p>{{name}}</p><p>{{msg}}</p> </div>数据如…

tomcat 虚拟路径 与 虚拟主机配置

虚拟路径配置 方法一&#xff1a;此方法需要重启服务 打开下面文件 在host里面添加context标签 <Context docBase"D:\test" path"/testServlet/aaaaa" reloadable"true" /> 浏览器访问&#xff1a;http://172.16.6.103:1080/testServlet/a…

20172328 2018-2019《Java软件结构与数据结构》第八周学习总结

20172328 2018-2019《Java软件结构与数据结构》第八周学习总结 概述 Generalization 本周学习了二叉树的另一种有序扩展&#xff1f;是什么呢&#xff1f;你猜对了&#xff01;ヾ(◍∇◍)&#xff89;&#xff9e;就是堆。本章将讲解堆的链表实现and数组实现&#xff0c;以及往…

javascript --- 函数的柯里化 Vue 2.x中柯里化的使用

函数式编程部分重点 参考资料: 函数式编程 柯里化 只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数 var add function (x) {return function(y) {return x y} }var increment add(1) var addTen add(10)increment(2) // 3addTen(10) // 12判断元素:V…

MYSQL重置ROOT密码

背景 mysql 服务器长时间未使用&#xff0c;管理员当时设置的root 密码忘记&#xff0c;需要重置 root 密码&#xff0c;并加以妥善保存。 步骤 关闭 mysql 服务以跳过密码验证的方式启动 mysql 服务mysqld --skip-grant-tables本地登陆后设置新的root 密码 update mysql.user …

javascript --- Vue初始化 模板渲染

不带响应式的Vue缩减实现 模板 现有模板如下: <div id "app"><div class"c1"><div titlett1 id"id">{{ name }}</div><div titlett2 >{{age}}</div><div>hello3</div></div><ul>…

#RANK_1 极其简单的递归——骑士与金币

2000:金币 总时间限制: 1000ms内存限制: 65536kB描述国王将金币作为工资&#xff0c;发放给忠诚的骑士。第一天&#xff0c;骑士收到一枚金币&#xff1b;之后两天&#xff08;第二天和第三天&#xff09;里&#xff0c;每天收到两枚金币&#xff1b;之后三天&#xff08;第四、…

动手动脑4

import java.io.*; public class ThrowMultiExceptionsDemo { public static void main(String[] args) { try { throwsTest(); } catch(IOException e) { System.out.println("捕捉异常"); }}private static void throwsTest() throws ArithmeticException,IOExcep…

javascript --- 对象原型

对象原型 参考 - MDN Javascript中的原型 在Javascript中,每一个函数都有一个特殊的属性,叫做原型 下面获取函数的原型fn.prototype function f1(){} console.log(f1.prototype) /*{constructor: f f1()__proto__:{constructor: f Object()__defineGetter__: f __defineGe…

从零认识单片机(9)

keil软件&#xff1a; IDE:IDE是集成开发环境&#xff0c;就是用来开发的完整的软件系统。 keil和mdk: keil:只能用来开发单片机 mdk:基于keil 拓展ARM的开发&#xff0c;主要用来开发ARM-cortex-m系列单片机的程序。 使用keil打开已有的工程项目&#xff1a; 1、IDE开发软件&a…

javascript --- vue2.x中原型的使用(拦截数组方法) 响应式原理(部分)

说明 在Vue2.x中,利用了对原型链的理解,巧妙的利用JavaScript中的原型链,实现了数组的pop、push、shift、unshift、reverse、sort、splice等的拦截. 你可能需要的知识 参考 - MDN 原型链 JavaScript常被描述为一种基于原型的语言(prototype-based language),每个对象拥有一…

dubbo-admin构建报错

dubbo-admin构建报错 意思是maven库里没有dubbo2.5.4-SNAPSHOT.jar这个版本的dubbo的jar包&#xff0c;把dubbo-admin项目的pom.xml的   <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>${proje…