系统性能调优必知必会
陶辉
智链达 CTO,前阿里云 P8 高级技术专家
36367 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
系统性能调优必知必会
15
15
1.0x
00:00/00:00
登录|注册

16 | HTTP/2是怎样提升性能的?

Huffman编码
静态表
Huffman编码方式选择
控制并发推送数量
PUSH_PROMISE帧
并发性能
多路复用
Frame
Message
Stream
编码效率提升
减少带宽浪费
HPACK编码技术
降低头部体积
思考题
服务器推送资源
并发传输
动态表编码
静态表编码
HTTP/2提升性能

该思维导图由 AI 生成,仅供参考

你好,我是陶辉。
上一讲我们从多个角度优化 HTTP/1 的性能,但获得的收益都较为有限,而直接将其升级到兼容 HTTP/1 的 HTTP/2 协议,性能会获得非常大的提升。
HTTP/2 协议既降低了传输时延也提升了并发性,已经被主流站点广泛使用。多数 HTTP 头部都可以被压缩 90% 以上的体积,这节约了带宽也提升了用户体验,像 Google 的高性能协议 gRPC 也是基于 HTTP/2 协议实现的。
目前常用的 Web 中间件都已支持 HTTP/2 协议,然而如果你不清楚它的原理,对于 Nginx、Tomcat 等中间件新增的流、推送、消息优先级等 HTTP/2 配置项,你就不知是否需要调整。
同时,许多新协议都会参考 HTTP/2 优秀的设计,如果你不清楚 HTTP/2 的性能究竟高在哪里,也就很难对当下其他应用层协议触类旁通。而且,HTTP/2 协议也并不是毫无缺点,到 2020 年 3 月时它的替代协议HTTP/3 已经经历了27 个草案,推出在即。HTTP/3 的目标是优化传输层协议,它会保留 HTTP/2 协议在应用层上的优秀设计。如果你不懂 HTTP/2,也就很难学会未来的 HTTP/3 协议。
所以,这一讲我们就将介绍 HTTP/2 对 HTTP/1.1 协议都做了哪些改进,从消息的编码、传输等角度说清楚性能提升点,这样,你就能理解支持 HTTP/2 的中间件为什么会提供那些参数,以及如何权衡 HTTP/2 带来的收益与付出的升级成本。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

HTTP/2协议的性能提升主要源于对HTTP/1.1协议的改进。通过静态表和动态表的编码技术,HTTP/2极大地降低了HTTP头部的体积,节约了大量带宽。静态表使用Huffman编码将高频出现的头部压缩,而动态表则通过对首次出现的HTTP头部用一个数字标识,实现了几十倍的压缩率。这些技术使得HTTP/2能够将头部体积压缩近一半,甚至将反复传输的头部压缩95%以上的体积。HTTP/2还实现了Stream并发,通过Stream实现了请求的并发传输,节约了TCP和TLS协议的握手时间,并减少了TCP的慢启动阶段对流量的影响。此外,HTTP/2支持消息推送,从HTTP/1.1的拉模式到推模式,信息传输效率有了巨大的提升。然而,动态表会占用大量内存,影响进程的并发能力,因此服务器会提供类似http2_max_requests的配置来限制一个连接上能够传输的请求数量。总体而言,了解HTTP/2的性能提升点,可以帮助理解支持HTTP/2的中间件提供的参数,以及权衡HTTP/2带来的收益与付出的升级成本。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《系统性能调优必知必会》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(19)

  • 最新
  • 精选
  • Geek_007
    虽然h2做了很多性能上的提升,但还是得结合实际来看,比如上传大文件使用h2的话,性能会不及h1。因为上传的文件大小是一样的,但是h2的流控会限制住每条connection,h2的默认控制窗口在65535字节,尽管tcp没有拥塞窗口的控制,但也要受限于h2自己的流控。也就是一路发送65535字节后就得等服务端ack。所以链接复用只对小请求有效。除非客户端和服务端避免特地避免了上述问题。陶老师,觉得呢?

    作者回复: 你好Geek_007,我认为h2针对的应用场景是并发传输场景,如果只有1个传输的请求,那么讨论h2是没有意义的,它在tcp之上加了那么多约束,肯定没有直接跑在h1上快,特别是你提到的大文件,那么http header的压缩意义也不大了。因此,当客户端并发请求数量为1,且文件很大时,h2不会提升性能,甚至会降低性能。 然而,一旦有上百个HTTP请求并发传输时,h2的意义仍然非常大,即使有1个大文件在传输,h2连接仍然允许小文件的并发传输(比如你提到的stream流控)

    2020-06-10
    13
  • test
    protobuf是对请求body进行了压缩,http2是对请求的header进行压缩。http2还可以使用stream方式传输,这些都是protobuf没有解决的。

    作者回复: 是的,h2是应用层协议,而pb只是纯粹的消息编码工具

    2020-06-12
    2
    12
  • 不会飞的海燕
    老师,既然h2只是对头部进行压缩,那h2+pb压缩Body是不是可以进一步减少体积;我看有的公司使用tcp+pb,这种方式比h2+pb传输效率高吗

    作者回复: 1、可以的,grpc协议就是h2+pb。 2、tcp+pb是非常糟糕的传输协议,应用层协议应该有头部和包体两部分,这样负载均衡、中间件才能监控系统。pb只是编码格式,tcp只是传输层协议,这个系统的监控、高可用一定很有问题。

    2020-06-26
    10
  • myrfy
    请问老师,h2的推送和websocket有什么区别呢?

    作者回复: 你好myrfy,主要是消息格式的不同。 websocket的推送是纯粹的二进制流。 h2的推送是HTTP消息,必须含有HTTP头部、包体。

    2020-06-10
    2
    9
  • 有铭
    我查了很多资料,都说h2的推送是针对资源的,单次请求,主动传输多个关联资源。目前没发现有暴露api给应用层使用者主动推送消息的案例。所以似乎h2的推送和我们传统意义上的推送不是一个概念,至少它和websocket这种真正的应用层可控双向传输不是一回事。我也希望老师能有案例告诉我h2真能达到websocket那种效果

    作者回复: 你好有铭,h2确实是针对资源的推送,websocket只不过没有定义应用层协议,它只是允许双向传输,至少传输的消息如何编码,它是不管的。而h2要求,推送时仍然要使用http作为推送协议,这是差别。 至少你说的案例,Java最基本的Servelet编程,其中HttpServletRequest有一个方法叫newPushBuilder,就可以推送消息。

    2020-06-11
    4
  • 冬风向左吹
    请问老师,不知道我的这些理解是不是对的: 1、多个stream并发是共用的同一个tcp连接,所以只需要1 次 TCP 握手、1 次 TCP 慢启动以及 1 次 TLS 握手; 2、因为多个stream共用了同一个tcp连接,tcp报文是有序的,所以也会有队头阻塞问题; 3、同一个stream中的多个请求是串行的; 4、首个请求使用静态表和Huffman编码,后续请求头部使用动态表编码; 疑问: 老师的示例中,为什么host头部一会儿在静态表中,一会儿在动态表中?是因为上面第4点的原因吗?

    作者回复: 你好东郭,你的理解前3点都是对的,第4点需要做一下补充: 首次出现的HTTP头部(不是首个请求)使用静态表和Huffman,后续请求头部使用动态表编码有一个前提,就是动态表没有超出限制。 关于host头部,可以这么理解:HTTP头部包括name和value,其中host头部仅有name在静态表中,所以首次出现时使用了静态表,但动态表可以存放name/value,所以第2次出现时就使用了动态表。

    2020-06-10
    4
  • 坤哥
    感觉stream 好像rabbitmq 的channel 的概念,也是tcp同一个socket多路复用,不知道理解对吗?

    作者回复: 对的,一个是协议报文上的封装,一个则是语言层的封装

    2020-07-08
    3
  • 妥协
    请教老师,多个stream之间并发是通过stream id做隔离的吗?wireshake中看到的一条条记录是frame还是message?

    作者回复: 是的,通过stream id。看到的报文都是frame,message是抽象的逻辑概念。

    2020-06-29
    3
  • 惘 闻
    老师,syream相当于tcp链接,那么h2的并发stream不就相当于同时开了多个tcp链接吗?这样的话和h1有什么区别?

    作者回复: 只是相当于,TCP是由内核维护的,包括发送、接收缓冲区,以及其中的重发定时器、保活定时器,以及滑动窗口、拥塞容器、MSS等各种参数,成本很高。而stream则是应用层概念,多个stream共享1个tcp连接,区别就很大了,比如慢启动就不用重复执行,TLS握手也不会反复执行

    2021-05-08
    1
  • 坤哥
    老师,这讲我看了3次也不明白,你的另一课程web socket有这方面的详细展开吗?

    作者回复: 有的,《Web协议详解与抓包实战》第4部分有20节课都在讲HTTP2协议。

    2020-07-08
    1
收起评论
显示
设置
留言
19
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部