文章目录

  • HTTP2.0的改进
    • 1. 头部压缩
    • 2. 多路复用
      • 2.1 什么是 HTTP 队头阻塞?
      • 2.2 二进制分帧
    • 3. 服务器推送

HTTP2.0的改进

由于 HTTPS 在安全方面已经做得非常好了,HTTP 改进的关注点放在了性能方面。主要区别有:

feature description
头部压缩 Hpack + 哈夫曼编码压缩
多路复用 报文转为二进制,生成 steam 在 tcp 乱序传输,但是同一个 Stream ID 的帧有序传输
服务器推送 新建"流"主动向客户端发送消息
可以设置请求优先级

1. 头部压缩

HTTP 1.1 有着对请求体的压缩 Content-Encoding

// 发送端
Content-Encoding: gzip
// 接收端
Accept-Encoding: gzip

但是报文的另一个组成部分 —— Header 却被五十了,没有针对它的优化手段。

  • 当请求字段非常复杂的时候,尤其对于 GET 请求,请求报文几乎全是请求头,这个时候还是存在非常大的优化空间的。
  • 成千上万的请求响应报文里有很多字段值都是重复的,非常浪费,"长尾效应"导致大量带宽消耗在了这些冗余度极高的数据上。

HTTP2 针对头部字段,也采用了对应的压缩算法 —— HPACK,对请求头进行压缩。

  1. 废除了原有的起始行概念

    为了方便管理和压缩,HTTP/2废除了原有的起始行概念。

    把起始行里面的请求方法、URI 、状态码等统一转换成了头字段的形式,并且给这些"不是头字段的头字段"起了个特别的名字 —— “伪头字段”(pseudo-header fields)。而起始行里的版本号和错误原因短语因为没什么大用,顺便也给废除了。

    为了与"真头字段"区分开来,这些"伪头字段"会在名字前加一个 “:”,比如 “:authority”,":method",":status",分别表示的是域名、请求方法和状态码。

    现在 HTTP 报文头就简单了,全部都是"Key-Value"形式的字段。

  2. 在服务器和客户端之间建立哈希表

    将用到的字段存放在这张表中,那么在传输的时候对于之前出现过的值,只需要把索引(比如0, 1, 2, … )传给对方即可,对方拿到索引查表就行了,这种传递索引的方式,可以说让请求头字段得到极大程度的精简和复用。

  1. 对于整数和字符串进行哈夫曼编码

    哈夫曼编码的原理就是先将所有的出现的字符建立一张索引表,然后让出现次数多的字符对应的索引尽可能短,传输的时候也是传输这样的索引序列,可达到非常高的压缩率。

头部数据压缩之后,HTTP2就要把报文拆成二进制的帧准备发送。

2. 多路复用

2.1 什么是 HTTP 队头阻塞?

HTTP 队头阻塞的问题,其根本原因在于 HTTP 基于请求 - 响应模式,在同一个 TCP 长连接中,前面的请求没有得到响应,后面的请求就会阻塞。当然这可以通过并发连接和域名分片的方式解决一部分问题,但这并没有真正从 HTTP 本身的层面解决问题,只是增加了 TCP 连接,分摊风险而已。而且这么做也存在弊端,多条 TCP 连接会竞争有限的带宽,让真正优先级高的请求不能优先处理。

而 HTTP2 便从 HTTP 协议本身解决了队头阻塞问题。注意,这里并不是指的 TCP 队头阻塞,而是 HTTP 队头阻塞,两者并不是一回事。 TCP 的队头阻塞是在数据包层面,单位是数据包,前一个报文没有收到便不会将后面的报文上传给 HTTP,而 HTTP 队头阻塞是在 HTTP 请求-响应层面,前一个请求没处理完,后面的请求就要阻塞住。两者所在的层次不一样。

那么 HTTP2 如何来解决所谓的队头阻塞呢?

2.2 二进制分帧

首先,HTTP2认为明文传输对机器而言太麻烦了,不方便计算机的解析,因为对于文本而言有多义性的字符,比如回车换行到底是内容还是分隔符,在内部需要用到状态机去识别,效率比较低。于是 HTTP2 干脆把报文全部换成二进制格式,全部传输 01 串,方便机器的解析

原来的 Headers + Body 的报文格式如今被拆分成了一个个二进制的帧,用 Header 帧存放头部字段,Data 帧存放请求体数据。分帧之后,服务器看到的不再是一个个完整的 HTTP 请求报文,而是一堆乱序的二进制帧。这些二进制帧不存在先后关系,因此也就不会排队等待,也就没有了 HTTP 的队头阻塞问题。

通信双方都给对方发送二进制帧,这种二进制帧的双向传输的序列,也就做流(stream),HTTP2用流来在一个 TCP 连接上来进行多个数据帧的通信,这就是多路复用的概念。

这里有一个疑问,既然是乱序齐发,那最后如何来处理这些乱序的数据帧呢?

首先声明的是,所谓的乱序,指的是不同的 ID 的 stream 是乱序的,但同一个 stream ID 的帧一定是按顺序传输的。二进制帧叨叨后对方会将 Stream ID 相同的二进制帧组装成完整的请求报文和响应报文。当然,在二进制帧当中还有其它的一些字段,实现了优先级和流量控制等功能。

3. 服务器推送

HTTP2还在一定程序上改变了传统的 "请求-应答"工作模式,服务器不再是完全被动地响应请求,也可以新建"流"主动向客户端发送消息。比如,在浏览器刚请求 HTML 的时候就可以提前把可能会用到的 JS,CSS文件发给客户端,减少等待的延迟,这被称为 “服务器推送”(Server Push)

HTTP2.0的改进相关推荐

  1. HTTP2.0 相比 HTTP1.0、HTTP1.1 有哪些重大改进?值得升级更换吗?

    目录 HTTP1.0 HTTP1.1 HTTP2.0 主要特性对比 HTTP发展历史 HTTP2解决的问题 HTTP1.0 HTTP1.1 HTTP2.0

  2. http2.0的时代来了

    KS Knowledge Sharing 知识分享 现在是资源共享的时代,同样也是知识分享的时代,如果你觉得本文能学到知识,请把知识与别人分享! 开篇HTTP发展的心路历程 上图:连接无法复用 上图: ...

  3. 【网络】HTTP2.0新特性

    前段时间实习生面试的时候被问到HTTP2.0以及和HTTP1.1的区别,貌似网上对这一块的讲解很少,而且大多数就是空洞的理论堆砌,看也看不懂.不过花点时间慢慢找还是可以找到很不错的资料的.整理如下,希 ...

  4. 转:http2.0时代即将到来~~~~~

    2019独角兽企业重金招聘Python工程师标准>>> HTTP2.0,WEB开发者不可错过的新标准! 08月12日 谢世诚 发表 三周之前,在东京开会的Mark Nottingha ...

  5. 说说你对http、https、http2.0的理解【前端每日一题-25】

    说说你对http.https.http2.0的理解? HTTP的基本优化 影响一个HTTP网络请求的因素主要有两个:带宽和延迟. 带宽 如果说我们还停留在拨号上网的阶段,带宽可能会成为一个比较严重影响 ...

  6. http2.0 的时代来了

    来源:https://www.jianshu.com/p/712eb3a65d33 作者:互扯程序 日期:2017.12.28 原文如下: 0. 开篇HTTP发展的心路历程 连接无法复用 设置Conn ...

  7. 一文了解阿里云CDN HTTP2.0

    摘要: 本文由阿里视频云高级技术专家空见撰写,主要介绍HTTP2.0的历史.特性.如何使用和使用之后的性能对比验证. 背景介绍 要了解HTTP2.0,先了解一下HTTP超文本传输协议的历史(Hyper ...

  8. HTTP1.0 HTTP1.1 HTTP2.0总结

    https://mp.weixin.qq.com/s/GICbiyJpINrHZ41u_4zT-A https://blog.csdn.net/striveb/article/details/8423 ...

  9. HTTP1.0 HTTP1.1 HTTP2.0 主要特性对比

    本篇是对HTTP不同版本主要特性的一个概述和总结. HTTP1.0 早先1.0的HTTP版本,是一种无状态.无连接的应用层协议. HTTP1.0规定浏览器和服务器保持短暂的连接,浏览器的每次请求都需要 ...

最新文章

  1. 使用C#代码部署SharePoint 2013开发包简单总结(一)
  2. mysql atlas php_Mysql中间件代理 Atlas
  3. Win10文件夹空白处右键列表添加命令提示符
  4. SQL Server日期格式和SQL Server转换举例说明
  5. C语言和设计模式(之单件模式)
  6. 机器学习之监督学习(一)——决策树
  7. 用crontab、crond在嵌入式系统中添加定时任务
  8. 析构函数c+_了解C ++中的析构函数
  9. mysql数据库怎容器化_数据库部署是否合适容器化?
  10. 手把手教你自学单片机,三个步骤请做好笔记
  11. 【Java】Java语言程序设计(基础篇)全书笔记
  12. MATLAB常用的滤波函数比较:均值滤波 和 中值滤波
  13. java调用海康人脸识别比对demo(附demo源码下载)
  14. python合成gif动图
  15. java软件工程师基本技能_Java软件工程师主要有什么技能
  16. 综合案例—Spark实时交易数据统计
  17. 突然有一天,我老无所依
  18. 用Css3实现旋转的立方体
  19. Android网络数据JSON解析使用总结
  20. FBEC2021 | 对话阿里巴巴云游戏事业部/元境副总经理 龙志勇:坚持研运一体化服务的路线

热门文章

  1. 谷歌创始人布林:Android和Chrome未来或合并
  2. 产品读书《淘宝产品十年事》
  3. 凯立德2014秋季机车版C1204-C7K05-3323J0L懒人包 (5.0版)
  4. 基于arduino的串口控制数码管(5611AH)显示数字(初学,入门级附代码)
  5. 【薅羊毛】银联云闪付 话费充值满50 随机立减1-10元
  6. 使用java和腾讯云短信实现短信验证码发送
  7. 华为ENSP安装包(ensp100,ensp500及相关ar,fw镜像)
  8. pygame写推箱子200多关卡
  9. list对象转二维数组
  10. java 地图控件_室内地图Android SDK地图控件 - 蜂鸟云