一文理清Http2.0

前言

HTTP2.0主要有三大特性:二进制协议、头部压缩、服务端推送(Server Push)、多路复用。本文从分析http1.x存在的问题入手,逐一介绍http2.0的优势。

Http1.x存在的问题

在HTTP1.0下,HTTP1.1非Keep-Alive模式下,每个请求都要新建一个TCP连接,完成之后立即断开连接,如果有新的请求,则要重新创建请求TCP连接。多次请求建立多次TCP会耗费大量时间,同时没有必要。

为了解决这个问题, HTTP 1.1 中提供了Keep-Alive,允许一定时间(此时间在Nginx或Apache服务器配置上设定)内,同一域名多次请求数据,只建立一次HTTP请求,其他请求可复用TCP连接,以提高请求效率。

但是使用Keep-Alive后仍然存在问题:
单个 TCP 连接在一个时刻只能处理一个请求(必须等上一个请求返回才能发起下一个请求,所以后面的请求会被前面请求的阻塞)。所以实际上我们只是节省了建立连接的时间,而获取数据的时间并没有减少

http1.1的单个 TCP 连接只能同步发请求的原因:http1.1是基于文本的协议,请求中的不同部分(请求头、请求体)通过换行符进行分割。因此如果同一个TCP同时发多个请求会导致多个请求的数据混杂在一起,服务端无法正确解析请求。
在这里插入图片描述

Http2.0的特性

一、二进制协议

http1.x 是一个文本协议,而 http2.0 是一个彻彻底底的二进制协议,http2.0 的基本单位是帧。

HTTP2.0引入二进制数据帧和流的概念:
客户端发送请求时,请求会被分解为多个帧(Frame),同一个请求的帧的 流标识符(Stream Identifier) 相同。每个请求可以理解为一个包含多个帧的流。

帧的格式:
在这里插入图片描述
字段解释:
在这里插入图片描述
type的类型:
在这里插入图片描述
在二进制分帧层上,http2.0会将所有传输信息分割为帧,并对它们采用二进制格式的编码将其封装,新增的二进制分帧层同时也能够保证http的各种动词,方法,首部都不受影响,兼容上一代http标准。其中,http1.X中的首部信息header封装到Headers帧中,而request body将被封装到Data帧中。
在这里插入图片描述

二、多路复用 (Multiplexing) / 连接共享

有了新的分帧机制后,http/2 不再依赖多个TCP连接去实现多流并行:
每个数据流(请求或响应)都拆分成很多互不依赖的帧,因为具有标识字段(Stream id、flags)因此帧可以无序发送(即多个请求分解成帧可以通过一个TCP连接交错发送),最后当帧到达服务端之后,就可以根据 Stream Identifier 来重新组合得到完整的请求。

http 2.0 的TCP连接都是持久化的,而且客户端与服务器之间也只需要一个连接(每个域名一个连接)即可。此连接可以承载数十或数百个流的复用,多路复用意味着来自很多流的数据包能够混合在一起通过同样连接传输。当到达终点时,再根据不同帧首部的流标识符重新连接将不同的数据流进行组装。
在这里插入图片描述
http1.X和http2.0在传输数据时的区别:
在这里插入图片描述

三、头部压缩

客户端和服务器各自维护一张头部信息表,所有头部字段都会存入表中,生成一个索引号,发送过的头部字段此后只发送对应的索引号。

相同的头部信息不会通过请求发送,延用之前请求携带的头部信息。新增/修改的头部信息会被加入到HEAD中,两端渐进更新。
两端会共同维护一个head list,每次请求时都会进行检查。
该list包括:

  • static (既定的头部信息)
  • dynamic (自定义的头部信息)

四、服务端推送

例如我们加载index.html, 我们可能还需要index.js, index.css等文件。传统的请求只有当拿到index.html,解析html中对index.js/index.css的引入才会再请求资源加载,但是通过服务端推送,可以提前将资源推送给客户端,这样客户端要用到的时候直接调用即可,不用再发送请求。

当服务端需要主动推送某个资源时,便会发送一个 Frame Type 为 PUSH_PROMISE 的 Frame,里面带了 PUSH 需要新建的 Stream ID。意思是告诉客户端:接下来我要用这个 ID 向你发送东西,客户端准备好接着。客户端解析 Frame 时,发现它是一个 PUSH_PROMISE 类型,便会准备接收服务端要推送的流。

参考

  • 一次 HTTP 请求就需要一次 TCP 连接吗?
  • 推荐阅读:深入理解http2.0协议,看这篇就够了
  • https://www.jianshu.com/p/ff8f0bd78942
  • https://segmentfault.com/a/1190000011172823
  • https://blog.csdn.net/weixin_33693070/article/details/88711831
  • https://www.cnblogs.com/shangyueyue/p/11049984.html
  • https://www.jianshu.com/p/1ad439279974
  • https://blog.csdn.net/u010552788/article/details/80593955

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

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

相关文章

收敛和发散思维如何被用作解决问题的手段

转自: https://www.jdon.com/mda/thinking.html 将发散和收敛的思想结合在一起使用时,可以帮助分析人员得出更好的和更有创造性的解决方案。发散性思维是将一个话题分解并产生许多从原始概念中分支出来的想法的过程,而收敛性思维则是集中于少…

关于python面向对象编程中、下列说法中_关于Python面向对象编程的知识点总结

前言 如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习Python的面向对象编程。 接下来我们就来了解关于Python面向对象编程的知…

Java开发必会的反编译知识

转载自 Java开发必会的反编译知识 编程语言在介绍编译和反编译之前,我们先来简单介绍下编程语言(Programming Language)。编程语言(Programming Language)分为低级语言(Low-level Language)和高…

happen-before原则的理解

前言 在程序执行时,为了提高性能,编译器和处理器会对指令进行重排序。 为了明确定义多线程场景下重排序的问题(可见性、有序性、原子性),Java引入了JMM(Java Memory Model),也就是Java内存模型。JMM为JAV…

转:RabbitMQ 消息队列特性知多少

转自: https://www.jianshu.com/p/94d6d5d98c3d 序言 现在我们每天都要与信息打交道,主动或被动的在创造或接收消息。你会收到话费通知短信,使用微信 QQ跟远在万里的朋友交流,也可能使用钉钉跟同事讨论工作,使用抖音…

easyui根据select下拉框内容更新表单内容_Ant Design 4.0 的一些杂事儿 - Select 篇

前几篇:Ant Design 4.0 的一些杂事儿 - Table 篇Ant Design 4.0 的一些杂事儿 - Form 篇聊完了 Table 和 Form 两个重型组件,我们来继续聊聊看起来不那么重的 Select 组件。它在 Ant Design 4.0 中有哪些变化。如果你读过 《Ant Design 4.0 进行时》&…

避免代码冗余,使用接口和泛型重构Java代码

转载自 避免代码冗余,使用接口和泛型重构Java代码在使用动态语言和.NET工作了若干年后,我又回到老本行–Java开发。在Ruby中,清除代码冗余是非常方便的,而在Java中则需要结合接口和泛型实现类似的功能。 原始代码 以下是这个类中的…

一文理类加载相关知识:类加载器、双亲委派、SPI

思维导图 类加载的时机 类加载的流程 类从被加载到内存中开始,直到被从内存中卸载为止,它的整个生命周期包括:验证、准备、解析、初始化、使用和卸载7 个阶段。 其中验证、准备、解析 3 个部分统称为连接(Linking) …

可以搜python编程答案的软件_python实现百万答题自动百度搜索答案

用python搭建百万答题、自动百度搜索答案。 使用平台 windows7 python3.6 MIX2手机 代码原理 手机屏幕内容同步到pc端 对问题截图 对截图文字分析 用浏览器自动搜索文本 使用教程 1、使用Airdroid 将手机屏幕显示在电脑屏幕上。也可使用360手机助手实现。不涉及任何代码。实现效…

intellij idea设置主题、字体样式和背景色

转自&#xff1a; https://blog.csdn.net/fanrenxiang/article/details/80598895 点击这里查看 <intellij idea使用教程汇总篇> 引言&#xff1a;所谓工欲善其事必先利其器&#xff0c;idea就是这样的利器&#xff0c;刚装好的intellij idea主题样式是白的&#xff0c;…

MySQL优化(四):count()

count()不同写法的区别 COUNT(字段名)&#xff1a;返回SELECT语句检索的行中值不为NULL的行数 COUNT(1)&#xff1a;表示的是直接查询符合条件的数据库表的行数&#xff08;会包含值为NULL的行数&#xff09;。其中1指的是表中的第一个字段&#xff0c;如有表 table(id, colu…

图像sobel梯度详细计算过程_数字图像处理(第十章)

点、线、边缘检测背景知识。书中主要介绍了图像的一阶导数与二阶导数&#xff0c;这个之前的文章中有过介绍这里在复习一遍。对于函数 ,对于点 在x方向的一阶偏导为&#xff1a;,二阶偏导为&#xff1a;之后书中总结了一阶导与二阶导对于图像求取边缘的结论&#xff1a;孤立点检…

idea部署maven+javaweb项目到jboss

小编习惯使用eclipse对jboss跑的项目部署,第一次使用idea进行jboss部署项目,遇到很多问题,做此文章以帮助更多人. 图中涂鸦的是项目名,对应上自己的项目名即可 1.导入项目,这一步不多说 2.配置项目: a>点击file-->Project-Stucture-->Project 3.配置Modules 配置…

Java8-本地缓存

转载自 Java8-本地缓存这里我将会给大家演示用ConcurrentHashMap类和lambda表达式实现一个本地缓存。因为Map有一个新的方法可以在key为Null的时候自动计算一个新的value值。非常完美的实现cache。来看下代码&#xff1a;12345678910111213141516publicstatic void main(String…

Integer和Int的比较,谈谈拆卸和装箱

示例代码 public static void main(String[] args) {Integer a new Integer(10111);int b 10111;boolean equal1 a b;//自动拆箱&#xff0c;xxxValue()boolean equal2 a.equals(b);//自动装箱, valueOf()System.out.println(equal1);System.out.println(equal2); }反编译…

python调用webservice接口实例_python调用webservice接口的实现

使用suds这个第三方模块 from suds.client import Client url http://ip:port/?wsdl cilentClient(url) print cilent 查看webservice接口的具体信息&#xff1a; 调用接口方法&#xff0c;通常 client.service.methodname 实际测试过程中遇到的坑&#xff1a; 1、tns 值为Lo…

idea2021部署maven+javaweb项目到jboss(diy)

【README】 我为什么要写这个文章&#xff0c;看了这位老哥的博文 https://blog.csdn.net/PacosonSWJTU/article/details/118074604 部署成功了&#xff0c;很感谢&#xff0c;所以也想照做一下&#xff1b; 【1】创建web项目module &#xff08;Project02 是一个空项目&…

Java对象内存结构

转载自 Java对象内存结构学C/C出身的我&#xff0c;对Java有一点非常困惑&#xff0c;那就是缺乏计算对象占用内存大小的机制。而在C中就可以通过sizeof运算符来获得基本类型以及类实例的大小。C和C中的这个操作符对于指针运算、内存拷贝和IO操作都非常有用。 Java中并没有一个…

Java版大顶堆的实现

堆的概念 堆是一棵完全二叉树&#xff0c;一般使用数组来存储。通俗来讲堆其实就是利用数组来维护一个完全二叉树。 按照堆的特点可以把堆分为大顶堆和小顶堆 大顶堆&#xff1a;堆的每个结点的值都大于或等于其左右孩子结点的值 小顶堆&#xff1a;堆的每个结点的值都小于或…

Java 8新特性探究(二)深入解析默认方法

转载自 Java 8新特性探究&#xff08;二&#xff09;深入解析默认方法 什么是默认方法&#xff0c;为什么要有默认方法 简单说&#xff0c;就是接口可以有实现方法&#xff0c;而且不需要实现类去实现其方法。只需在方法名前面加个default关键字即可。 为什么要有这个特性&am…