Http/2 对比 Http/1.1 的性能提升

网络 通信技术
HTTP 协议不带有状态,每次请求都必须附上所有信息。所以,请求的很多字段都是重复的,比如Cookie和User Agent,一模一样的内容,每次请求都必须附带,这会浪费很多带宽,也影响速度。
  • HTTP/1.1发明以来发生了哪些变化?
  • HTTP/1.1 协议的性能缺陷
  • HTTP/2 新特性
  • HTTP/2 还存在的问题

HTTP/1.1发明以来发生了哪些变化?

近年来,仔细观察那些最流行的网站首页所需要下载的资源的话,会发现一个非常明显的趋势:

  • 消息变大 :从几 KB 大小的消息,到几 MB 大小的消息;
  • 页面资源变多 :从每个页面不到 10 个的资源,到每页超 100 多个资源;
  • 内容形式变多样 :从单纯到文本内容,到图片、视频、音频等内容;
  • 实时性要求变高 :对页面的实时性要求的应用越来越多;

自从 1997 年 HTTP/1.1 发布以来,我们已经使用 HTTP/1.x 相当长一段时间了,但近几年内容的爆炸式成长使得 HTTP/1.1 越来越无法满足现代网络的需求了

HTTP/1.1 协议的性能缺陷

  • 高延迟:页面访问速度下降
  • 无状态:头部巨大切重复
  • 队头阻塞问题,同一连接只能在完成一个 HTTP 事务(请求和响应)后,才能处理下一个事务;
  • 明文传输:不安全
  • 不支持服务器推送消息,因此当客户端需要获取通知时,只能通过定时器不断地拉取消息,这无疑浪费大量了带宽和服务器资源。

Http /2 的新特性

兼容 HTTP/1.1

HTTP/2 出来的目的是为了改善 HTTP 的性能。协议升级有一个很重要的地方,就是要兼容老版本的协议,否则新协议推广起来就相当困难,HTTP/2 是怎么做的呢?

HTTP/2 没有在 URI 里引入新的协议名,仍然用「http://」表示明文协议,用「https://」表示加密协议,于是只需要浏览器和服务器在背后自动升级协议,这样可以让用户意识不到协议的升级,很好的实现了协议的平滑升级。

还是基于 TCP 协议传输,应用层方面为了保持功能上的兼容,与 HTTP/1.1 完全一致,比如请求方法、状态码、头字段等规则保留不变。

二进制传输

HTTP/2 不再像 HTTP/1.1 里的纯文本形式的报文,而是全面采用了二进制格式,头信息和数据体都是二进制,并且统称为帧(frame):头信息帧(Headers Frame)和数据帧(Data Frame)。

这样对计算机非常友好,因为计算机收到报文后,无需再将明文的报文转成二进制,而是直接解析二进制报文,这增加了数据传输的效率。

Header 压缩(HPACK)

HTTP 协议不带有状态,每次请求都必须附上所有信息。所以,请求的很多字段都是重复的,比如Cookie和User Agent,一模一样的内容,每次请求都必须附带,这会浪费很多带宽,也影响速度。

HTTP/2 对这一点做了优化,引入了头信息压缩机制(header compression)。一方面,头信息使用gzip或compress压缩后再发送;另一方面,客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就提高速度了。

HPACK 算法:在客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就提高速度了。

多路复用

多路复用,就是在一个 TCP 连接中可以存在多条流。换句话说,也就是可以发送多个请求,对端可以通过帧中的标识知道属于哪个请求。

这一特性使得 HTTP 传输性能得到极大提升,主要体现在以下三个方面:

复用 TCP 连接

HTTP/2 复用 TCP 连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应,这样就避免了"队头堵塞"

数据流

HTTP/2 并行交错地发送多个请求 / 响应,请求 / 响应之间互不影响

HTTP/2 将每个请求或回应的所有数据包,称为一个数据流(stream)。每个数据流都有一个独一无二的编号。数据包发送的时候,都必须标记数据流ID,用来区分它属于哪个数据流。另外还规定,客户端发出的数据流,ID一律为奇数,服务器发出的,ID为偶数。

数据流发送到一半的时候,客户端和服务器都可以发送信号(RST_STREAM帧),取消这个数据流。1.1版取消数据流的唯一方法,就是关闭TCP连接。这就是说,HTTP/2 可以取消某一次请求,同时保证TCP连接还打开着,可以被其他请求使用。

优先级

HTTP/2 还可以对每个 Stream 设置不同优先级,帧头中的「标志位」可以设置优先级,比如客户端访问 HTML/CSS 和图片资源时,希望服务器先传递 HTML/CSS,再传图片,那么就可以通过设置 Stream 的优先级来实现,以此提高用户体验。

服务端 Push

HTTP/1.1 不支持服务器主动推送资源给客户端,都是由客户端向服务器发起请求后,才能获取到服务器响应的资源。

比如,客户端通过 HTTP/1.1 请求从服务器那获取到了 HTML 文件,而 HTML 可能还需要依赖 CSS 来渲染页面,这时客户端还要再发起获取 CSS 文件的请求,需要两次消息往返,如下图左边部分:

如上图右边部分,在 HTTP/2 中,客户端在访问 HTML 时,服务器可以直接主动推送 CSS 文件,减少了消息传递的次数。

提高安全性

出于兼容的考虑,HTTP/2 延续了 HTTP/1 的“明文”特点,可以像以前一样使用明文传输数据,不强制使用加密通信,但 HTTPS 已经是大势所趋,各大主流浏览器都支持加密的 HTTP/2,所以,真实应用中的 HTTP/2 是还是加密的:

HTTP/2 遗留问题

HTTP/2 还会队头阻塞

HTTP/2 通过 Stream 的并发能力,解决了 HTTP/1 队头阻塞的问题,看似很完美了,但是 HTTP/2 还是存在“队头阻塞”的问题,只不过问题不是在 HTTP 这一层面,而是在 TCP 这一层。

如果造成队头阻塞,问题可能比http1.1还严重,因为只有一个tcp连接,后续的传输都要等前面,http/1.1 多个tcp连接,阻塞一个,其他的还可以正常跑。

责任编辑:武晓燕 来源: 今日头条
相关推荐

2015-11-10 09:25:05

HTTP2提升性能

2023-10-20 08:14:21

2013-05-22 09:38:03

GoGo语言Go性能

2021-05-11 08:31:48

HTTP21.1

2021-01-31 10:54:50

HTTP协议GET

2015-09-15 10:46:29

2015-09-15 10:40:26

HTTP2 WEB 性能优化

2015-09-15 10:54:54

HTTP2 WEB 性能优化

2015-02-05 09:25:51

HTTPSSPDYHTTP2

2015-01-05 10:07:24

HTTPGETPOST

2020-03-08 21:22:03

HTTP112

2019-12-13 09:14:35

HTTP2协议

2021-02-22 17:13:47

HTTP1.1协议

2022-08-26 17:14:37

HTTP 1.0HTTP 1.1HTTP

2024-02-29 18:06:39

HTTP性能优化

2019-11-17 22:47:53

HTTP23

2019-09-23 08:35:52

2021-10-30 19:57:00

HTTP2 HTTP

2023-11-21 22:23:06

2018-11-14 15:00:08

HTTP程序员前端
点赞
收藏

51CTO技术栈公众号