http2.0
http历史一览图
概念介绍
-
http事务:一个http事务就是一次完成的http请求和响应的过程
-
在http1.0,每次完成一个http事务都会断开tcp链接,这样下次新的请求就要重新三次握手建立链接,这样就促使http1.1需要修复
-
1.1优化出现了keep-live
1.1的性能瓶颈
1.0
慢启动,出现堵塞之后回降低tcp的连接,然后根据网络情况渐渐恢复tcp连接
每个http都占用一个tcp,会出现大量的端口占用的情况,
1.1解决上面问题的方法,就是keep-alive
这里,即使有长连接,但是没有更好的解决请求和响应需要等待的问题,也就是说请求1没有响应的话是❌发送请求2的,原因是http1.1是无状态的协议,也就是没有序列化、没有ID类似的字段去可以识别排序,这样会导致发送的数据错乱,而tcp是可以乱序的,因为tcp里有表示序号的字段。
并行发送请求,顺序接受返回?
2.0
总揽
每个域下的tcp连接数量是有限的,没有浏览器厂商设置的不一样,chrome大概是6个
prioritization :优先级控制
flow control:流量控制
server push :服务器推送
多路复用
概念
connection🈯️一个tcp连接、stream指流的意思、每个connection中有多个stream,没有stream有着自己的http请求、就像是光纤中有很多条线路一样 ,每个frame中运载的有就是message
stream是抽象出来的概念,为了让他们分组形成的概念
frame 帧的意思 一共有10种帧,但是常用的有Heades frame,头部帧和Data frame 数据帧
上图展示了一个连接上的多个传输数据流:客户端向服务端传输数据帧stream5,同时服务端向客户端乱序发送stream1和stream3。这次连接上有三个响应请求乱序并行交换。
frame
stream内部的帧是相对有序的,帧是没有id的,所以stream里面的帧必须要是有序的发送,不然会错乱
头部压缩
1.1的背景
- 目前1.1中每个请求都会发送对应的头部,包括cookie等数据,这些数据每个请求几乎都是一样的,所以造成了带宽的浪费
- 还有对于
method:GET这种常用的数据,如果我们在服务端维护一份静态字典,给它编个号,这样主要发送这个号码就行了
静态表
这就是一份公共的静态表,常用的数据都有
动态表
在第一次请求之后会保存一份动态表,之后的请求都会和这个表diff、对比一下,然后只发送不一样的字段
实例
在这个请求中,我们可以看到
status:200只占用了一个字节,这里应该是8这个index,但是我们看到是88,为什么是 0x88,而不是 0x8?这是因为高位设置为 1 表示这个字节是一个完全索引值(key 和 value 都在索引中)。
压缩原理
压缩中用到了哈夫曼编码