HTTP2详解-程序员宅基地

技术标签: http  tcp/ip  计算机网络  

HTTP2简介

HTTP2是对HTTP1.1的升级,对HTTP1.1性能问题进行了优化,主要从以下两个方面来优化:

1、头部压缩
HTTP1.1主要是对Body进行压缩,而头部却没有压缩。HTTP2通过HPACK算法对头部进行压缩,减少了传输时间。

2、队头阻塞
HTTP1.1使用的是TCP协议,并且为了节省资源,采用了长连接,长连接引入了队头阻塞的问题。HTTP2引入了流和帧,解决了HTTP层面上的队头阻塞。

HTTP2报文结构详解

1、二进制 替换 文本
HTTP1.1采用的是文本描述,也就是通过ASCII文本进行传输,采用文本描述的好处是调试程序方便,能够直接看出数据包中的数据情况。

而HTTP2使用的二进制来进行传输,用01串来描述数据,调试和查看数据的具体含义就不填方便了。但是这种二进制传输计算机解析方便,体积小,性能高。

举个例子,比如之前需要传递对应的文本值来表示对应的选择,而二进制通过二进制编码就能知道编码对应的选择,一个二进制编码对应着一个文本值。 一个二进制编码肯定比文本占用的空间小。

2、HTTP2将HTTP1中数据包分解为了帧
将HTTP1.1的数据包分为HEADERS帧DATA帧,属于是化整为零,为的就是多路复用,具体原理我们下边再说。
在这里插入图片描述
在这里插入图片描述

HTTP2连接过程

连接前言

当TCP三次握手成功后,客户端需要向服务器发送一个连接前言

连接前言是一个HTTP1.1报文,是一个ASCII文本,里面记录着一个magic字符串,当服务器接收到这个请求后,服务器就知道客户端想要使用HTTP2协议。

头部压缩

确定了HTTP2连接后,就开始准备发送HTTP2请求了。

首先就是发送HEADERS 帧,

HTTP1.1中对Body进行GZIP等压缩方式,但是对于头部却没有采取任何办法。

HTTP2采用了 HPACK 算法来压缩,HPACK 中客户端和服务器都要维护一个索引表。

在这里插入图片描述

如上图所示,索引表中维护了头部中Key-Value的对应关系和索引下标。

到时候,HTTP2请求中头部不用再发送Key-Value了,直接发送对应的索引下标就可以了。

上述的索引表是一个静态的表,记录着常用的头字段。HTTP的起始行中记录了Method、StatusCode等信息,也被记录到了索引表中。

有的HTTP2头部有着特殊的头部字段,所以HPACK又在静态表的尾部开始维护一个动态记录。当第一次发送索引表中不存在的Key-Value的时候,会使用实际数据发送,客户端和服务器对应的索引表会对其缓存,等到下一次发送的时候,就可以直接发送索引下标了。

所以说,HTTP2通过HPACK算法,将每次发送Key-Value替换成了发送一个下标,极大的减少了HTTP2头部的数据量,传输效率极大的提高了。

二进制帧

HTTP2将之前的head+body的一个数据包分为了 HEADER帧 和 若干个 DATA帧

格式如下图所示:
在这里插入图片描述
1、帧长度
帧的总长度,应用程序按照长度来读取

2、帧类型
HTTP2中有 数据帧、控制帧等类别,控制帧有着更高的传输优先权

3、标志位
8个bit,可以代表8个状态,比如END_HEADERS代表是否头数据传输结束、END_STREAM表示单方面传输数据结束

4、流标识符
帧属于哪个流,每个HTTP包传输都是一个虚拟流,通过流标识符才能将前后发送的帧重组为一个完整的数据包。

5、实际传输的数据

HTTP2发送过程

HTTP2利用帧+流的方式解决了HTTP1中的队头阻塞问题。

HTTP1中每个HTTP包复用一个TCP连接,每次只能等到前一个HTTP响应后才能发送后一个HTTP请求,如果前一个HTTP响应阻塞的话,后面的HTTP请求都会跟着阻塞,这就是队头阻塞问题。

HTTP2也是利用的长连接,多个HTTP请求复用一个TCP连接。
但是HTTP2将每个HTTP请求都看作一个流,将HTTP数据包分解为多个帧,包括HEADER帧DATA帧。每个帧都对应着一个流标识号。

多个HTTP请求之间的发送是乱序的,但是每个HTTP请求中的帧的发送是有序的。

虽然多个HTTP请求之间的发送请求是乱序的,但是可以基于流标识符来进行重组,一个流标识符对应着一个HTTP请求。

流标识符不能复用,是自动递增的,客户端使用的是奇数,服务器使用的偶数。

这就解决了队头阻塞问题。

在这里插入图片描述

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40276626/article/details/120412462

智能推荐

scratch2.0制作母亲节礼物——电子烟花送给母亲_scratch母亲节作品-程序员宅基地

文章浏览阅读3.3k次,点赞4次,收藏9次。首先,我们先来看一下效果_scratch母亲节作品

投票系统_开源投票系统 github-程序员宅基地

文章浏览阅读686次。package mainimport ( "awesomeProject1/src/github.com/hyperledger/fabric/core/chaincode/shim" "awesomeProject1/src/github.com/hyperledger/fabric/protos/peer" "bytes" "encoding/json" "..._开源投票系统 github

tensorboard一些简单常用的代码_tensorboard代码-程序员宅基地

文章浏览阅读3.9k次。需要再Terminal里面输入tensorboard --logdir logs才能打开Tensorboard# tensorboard --logdir=logs --port=6007 是将端口号改为了6007#一般用到一下几个指令:# 一、打开图片显示图片# writer.add_images("input",imgs,step) 第一个是标签,第二个是图像,注意图像必须是numpy或者tentor类型的,而且必须是通道数在前面,比如RGB三通道的就要是3*w*h#如果通道数在后面,则._tensorboard代码

Java的reverseOrder_reverse是什么意思及其用法-程序员宅基地

文章浏览阅读1.2k次。reverse的音标英 [rɪˈvɜːs]美 [rɪˈvɜːrs]reverse的用法v. 颠倒;彻底转变;使完全相反;撤销,废除(决定、法律等);使反转;使次序颠倒n. 相反的情况(或事物);后面;背面;反面;倒挡adj. 相反的;反面的;反向的;背面的;后面的第三人称单数: reverses 复数: reverses 现在分词: reversing 过去式: reversed 过去分词: re..._reverseorder

java创建一个指定的日期_创建指定日期java Date对象-程序员宅基地

文章浏览阅读1w次。import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;public class Demo {public static void main(String[] args) throws ParseException {//获..._创建一个指定时间用什么语句

Sublime Text3轻量型跨平台C/C++开发环境(上) 安装使用篇_folder_exclude_patterns-程序员宅基地

文章浏览阅读1.6k次。Sublime Text 2和3的对比相比于2,Sublime Text 3就秒启动一项,就压倒性地胜利了。因此在之后的叙述中都以Sublime Text 3为主角。并且3一直在不断的完善更新,具体的差异可参看Sublime Blog.简单的说:ST3支持在项目目录里面寻找变量 提供了对标签页更好地支持(更多的命令和快捷键) 加快了程序运行的速度 更新了API,使用Pytho..._folder_exclude_patterns

随便推点

go mysql slave_go-mysql: a powerful mysql toolset with Go-程序员宅基地

文章浏览阅读60次。go-mysqlA pure go library to handle MySQL network protocol and replication.ReplicationReplication package handles MySQL replication protocol like python-mysql-replication.You can use it as a MySQL sla..._replication.newbinlogsyncer

C/C++头文件一览[转]_c语言头文件换成c++头文件-程序员宅基地

文章浏览阅读236次。C/C++头文件一览 C、传统 C++#include //设定插入点#include //字符处理#include //定义错误码#include //浮点数处理#include //文件输入/输出#include //参数化输入/输出#include

php7如何读取二进制数据,在PHP中读取二进制文件-程序员宅基地

文章浏览阅读307次。在PHP中读取二进制文件2012-10-30[1715]technologyphp次阅读很多时候,数据并不是用文本的方式保存的,这就需要将二进制数据读取出来,还原成我们需要的格式。PHP在二进制处理方面也提供了强大的支持。任务下面以读取并分析一个PNG图像的文件头为例,讲解如何使用PHP读取和分析二进制文件。涉及函数PNG格式简介为了完成任务,下面简单介绍一下PNG文件格式。PNG是一种无损压缩的..._php 查找字符串中的二进制

kettle报错couldn't convert string [1970-01-01 00:00:00] to a date using format [yyyy/MM/dd HH:mm:ss.SS_kettle导出date报错-程序员宅基地

文章浏览阅读1.4w次。kettle报错couldn't convert string [1970-01-01 00:00:00] to a date using format [yyyy/MM/dd HH:mm:ss.SSS]1.报错如下2019/01/08 12:04:18 - 替换NULL值.0 - ERROR (version 8.1.0.0-365, build 8.1.0.0-365 from 2018-..._kettle导出date报错

计算机串口通信的作用,浅谈硬件串口通信基础概念-程序员宅基地

文章浏览阅读922次。串口通信(Serial Communication),是指外设和计算机间通过数据信号线、地线等按位进行传输数据的一种通信方式,属于串行通信方式。串口是一种接口标准,它规定了接口的电气标准,没有规定接口插件电缆以及使用的协议。(1)接口标准串口通信的接口标准有很多,有 RS-232C、RS-232、RS-422A、RS-485 等。常用的就是 RS-232 和 RS-485。RS-232 其实是 R..._多串口电脑有什么用途

AndroidStudio使用过程中遇到的bug(持续更新)_run configuration app is not supported in the curr-程序员宅基地

文章浏览阅读2.5w次,点赞7次,收藏18次。转载请注明出处:http://blog.csdn.net/forevercbb/article/details/51037833 由于Google不再支持Eclipse之后,转向Google的亲儿子——AndroidStudio是必然的,但是AndroidStudio的配置以及使用都比Eclipse复杂,不熟悉的情况下经常会遇到一些莫名其妙的问题,导致应用无法正常编译。代码出现的bug可以根据错_run configuration app is not supported in the current project. cannot obtain