16 | HTTP/2是怎样提升性能的?
该思维导图由 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-1013 - testprotobuf是对请求body进行了压缩,http2是对请求的header进行压缩。http2还可以使用stream方式传输,这些都是protobuf没有解决的。
作者回复: 是的,h2是应用层协议,而pb只是纯粹的消息编码工具
2020-06-12212 - 不会飞的海燕老师,既然h2只是对头部进行压缩,那h2+pb压缩Body是不是可以进一步减少体积;我看有的公司使用tcp+pb,这种方式比h2+pb传输效率高吗
作者回复: 1、可以的,grpc协议就是h2+pb。 2、tcp+pb是非常糟糕的传输协议,应用层协议应该有头部和包体两部分,这样负载均衡、中间件才能监控系统。pb只是编码格式,tcp只是传输层协议,这个系统的监控、高可用一定很有问题。
2020-06-2610 - myrfy请问老师,h2的推送和websocket有什么区别呢?
作者回复: 你好myrfy,主要是消息格式的不同。 websocket的推送是纯粹的二进制流。 h2的推送是HTTP消息,必须含有HTTP头部、包体。
2020-06-1029 - 有铭我查了很多资料,都说h2的推送是针对资源的,单次请求,主动传输多个关联资源。目前没发现有暴露api给应用层使用者主动推送消息的案例。所以似乎h2的推送和我们传统意义上的推送不是一个概念,至少它和websocket这种真正的应用层可控双向传输不是一回事。我也希望老师能有案例告诉我h2真能达到websocket那种效果
作者回复: 你好有铭,h2确实是针对资源的推送,websocket只不过没有定义应用层协议,它只是允许双向传输,至少传输的消息如何编码,它是不管的。而h2要求,推送时仍然要使用http作为推送协议,这是差别。 至少你说的案例,Java最基本的Servelet编程,其中HttpServletRequest有一个方法叫newPushBuilder,就可以推送消息。
2020-06-114 - 冬风向左吹请问老师,不知道我的这些理解是不是对的: 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-104 - 坤哥感觉stream 好像rabbitmq 的channel 的概念,也是tcp同一个socket多路复用,不知道理解对吗?
作者回复: 对的,一个是协议报文上的封装,一个则是语言层的封装
2020-07-083 - 妥协请教老师,多个stream之间并发是通过stream id做隔离的吗?wireshake中看到的一条条记录是frame还是message?
作者回复: 是的,通过stream id。看到的报文都是frame,message是抽象的逻辑概念。
2020-06-293 - 惘 闻老师,syream相当于tcp链接,那么h2的并发stream不就相当于同时开了多个tcp链接吗?这样的话和h1有什么区别?
作者回复: 只是相当于,TCP是由内核维护的,包括发送、接收缓冲区,以及其中的重发定时器、保活定时器,以及滑动窗口、拥塞容器、MSS等各种参数,成本很高。而stream则是应用层概念,多个stream共享1个tcp连接,区别就很大了,比如慢启动就不用重复执行,TLS握手也不会反复执行
2021-05-081 - 坤哥老师,这讲我看了3次也不明白,你的另一课程web socket有这方面的详细展开吗?
作者回复: 有的,《Web协议详解与抓包实战》第4部分有20节课都在讲HTTP2协议。
2020-07-081