https://http2.akamai.com/demo
HTTP/0.9(1991) —> HTTP/1.0(1996) —>HTTP/1.1(1997) —>HTTP/2(2015) —> HTTP/3(2019)

HTTP/0.9

让我们回到最初的互联网时代,当时,你要在浏览器浏览网页,能够看到的,都是一些静态网页。静态网页,就是没有啥交互的网页。例如,一个企业,将它的信息,比如企业的简介啊,企业所销售的产品啊,企业的联系电话啊,放在了网络上。你打开这个网页,能够做的事情,基本上只有浏览。
整个过程就相当于你去要你一个东西,对方把你要的东西给了你。

应对这么简单的需求场景,HTTP协议需要做什么呢?

  • HTTP协议只有一个命令Get

HTTP/1.0

互联网越来越丰富,网站越来越复杂。
假设,我上网的时候,想注册一个网站,这个时候,就不仅仅是向服务器要东西了,还要给它东西,你会怎么办呢?

  • HTTP协议增加了很多命令(例如,Post)

假设,我要的东西,服务器没有;或者,服务器给我的东西,类型丰富了,不再是单一的HTML文档了,你会怎么办呢?

  • 增加了status code和header

假设,用户在网站购物的时候,一直往购物车里加入商品,他新加入一个商品的时候,我得知道他之前已经添加过哪些商品了;或者,发送的内容太多,不能够一下发送过来;或者…

  • 缓存、多部分发送、多字符集支持、权限

HTTP/1.1

  • pipeline
  • 持久链接
  • 增加host和一些其它命令

HTTP/1.1一直沿用到2015年,有什么局限呢

  • 明文传输
  • 传输限制在6个
  • 请求头过长
  • 缺少服务端主动push(出现了websocket)

HTTP/1.1与HTTP/2对比:
https://http2.akamai.com/demo
image.png

HTTP/2

所有数据二进制传输

光电信号本不就是二进制码?

同一链接多个请求不再按照顺序来,采用帧传递,到客户端重组

基于二进制分帧层,HTTP 2.0可以在共享TCP连接的基础上,同时发送请求和响应。HTTP消息被分解为独立的帧,而不破坏消息本身的语义,交错发送出去,最后在另一端根据流ID和首部将它们重新组合起来。

请求优先级

流可以带有一个31bit的优先级:

  • 0:表示最高优先级
  • 2-1:表示最低优先级

客户端明确指定优先级,服务端可以根据这个优先级作为依据交互数据,比如客户端优先级设置为.css>.js>.jpg(具体可参见《高性能网站建设指南》), 服务端按优先级返回结果有利于高效利用底层连接,提高用户体验。

然而,也不能过分迷信请求优先级,仍然要注意以下问题:
服务端是否支持请求优先级
会否引起队首阻塞问题,比如高优先级的慢响应请求会阻塞其他资源的交互。

头信息压缩以及推送等提高效率的功能

HTTP 1.x每一次通信(请求/响应)都会携带首部信息用于描述资源属性。HTTP 2.0在客户端和服务端之间使用“首部表”来跟踪和存储之前发送的键-值对。首部表在连接过程中始终存在,新增的键-值对会更新到表尾,因此,不需要每次通信都需要再携带首部。

HTTP协议发展历史 - 图2
另外,HTTP 2.0使用了首部压缩技术,压缩算法使用HPACK。可让报头更紧凑,更快速传输,有利于移动网络环境。
需要注意的是,HTTP 2.0关注的是首部压缩,而我们常用的gzip等是报文内容(body)的压缩。二者不仅不冲突,且能够一起达到更好的压缩效果。

服务端主动push功能

HTTP 2.0增加了服务端推送功能,服务端可以根据客户端的请求,提前返回多个响应,推送额外的资源给客户端。如下图所示,客户端请求stream 1,/page.html。服务端在返回stream 1消息的同时推送了stream 2(/script.js)和stream 4(/style.css)。

HTTP协议发展历史 - 图3

PUSH_PROMISE帧是服务端向客户端有意推送资源的信号。

  • 如果客户端不需要服务端Push,可在SETTINGS帧中设定服务端流的值为0,禁用此功能
  • PUSH_PROMISE帧中包含预推送资源的首部。如果客户端对PUSH_PROMISE帧没有意见,服务端在PUSH_PROMISE帧后发送响应的DATA帧开始推送资源。如果客户端已经缓存该资源,不需要再推送,可以选择拒绝PUSH_PROMISE帧。
  • PUSH_PROMISE必须遵循请求-响应原则,只能借着对请求的响应推送资源。 目前,Apache的mod_http2能够开启 H2Push on服务端推送Push。Nginx的ngx_http_v2_module还不支持服务端Push。

参考
https://zhuanlan.zhihu.com/p/79545770
https://http2.akamai.com/demo
https://www.huaijiujia.com/2018/06/30/http%E5%8D%8F%E8%AE%AE-http2-0%E5%8E%9F%E7%90%86%E8%AF%A6%E7%BB%86%E5%88%86%E6%9E%90/