http2.0

348 阅读3分钟

http2.0

http历史一览图

image-20220531100822540

概念介绍

  1. http事务:一个http事务就是一次完成的http请求和响应的过程

  2. 在http1.0,每次完成一个http事务都会断开tcp链接,这样下次新的请求就要重新三次握手建立链接,这样就促使http1.1需要修复

  3. 1.1优化出现了keep-live

1.1的性能瓶颈

1.0

慢启动,出现堵塞之后回降低tcp的连接,然后根据网络情况渐渐恢复tcp连接

每个http都占用一个tcp,会出现大量的端口占用的情况,

1.1解决上面问题的方法,就是keep-alive

image-20220531130149294

这里,即使有长连接,但是没有更好的解决请求和响应需要等待的问题,也就是说请求1没有响应的话是❌发送请求2的,原因是http1.1是无状态的协议,也就是没有序列化、没有ID类似的字段去可以识别排序,这样会导致发送的数据错乱,而tcp是可以乱序的,因为tcp里有表示序号的字段。

并行发送请求,顺序接受返回?

2.0

总揽

image-20220531130959016

每个域下的tcp连接数量是有限的,没有浏览器厂商设置的不一样,chrome大概是6个

prioritization :优先级控制

flow control:流量控制

server push :服务器推送

多路复用

概念

connection🈯️一个tcp连接、stream指流的意思、每个connection中有多个stream,没有stream有着自己的http请求、就像是光纤中有很多条线路一样 ,每个frame中运载的有就是message

stream是抽象出来的概念,为了让他们分组形成的概念

frame 帧的意思 一共有10种帧,但是常用的有Heades frame,头部帧和Data frame 数据帧

image-20220531133404801

image-20220531134147356

上图展示了一个连接上的多个传输数据流:客户端向服务端传输数据帧stream5,同时服务端向客户端乱序发送stream1和stream3。这次连接上有三个响应请求乱序并行交换。

preview

frame

image-20220531135341984

stream内部的帧是相对有序的,帧是没有id的,所以stream里面的帧必须要是有序的发送,不然会错乱

头部压缩
1.1的背景
  • 目前1.1中每个请求都会发送对应的头部,包括cookie等数据,这些数据每个请求几乎都是一样的,所以造成了带宽的浪费
  • 还有对于method:GET这种常用的数据,如果我们在服务端维护一份静态字典,给它编个号,这样主要发送这个号码就行了
静态表

image-20220531144112039

这就是一份公共的静态表,常用的数据都有

动态表

image-20220531143959946

在第一次请求之后会保存一份动态表,之后的请求都会和这个表diff、对比一下,然后只发送不一样的字段

实例

在这个请求中,我们可以看到status:200只占用了一个字节,这里应该是8这个index,但是我们看到是88,为什么是 0x88,而不是 0x8?这是因为高位设置为 1 表示这个字节是一个完全索引值(key 和 value 都在索引中)。

image-20220531144912548

压缩原理

image.png

压缩中用到了哈夫曼编码

image.png