HTTP1.2
- http1.2都做了哪些优化
(1)头部压缩 使用HPACK压缩头部 头部冗长,大量重复字段
(2)二进制帧 将报文头部和内容字符编码改为二进制格式 字符编码未压缩
(3)并发传输 解决h1.1 队头阻塞问题,多车道 头部阻塞
(4)主动推送资源 例如css不需要请求 被动响应 - 头部压缩
(1)头部字段的压缩 k
(2)头部字段值的压缩 v
(3)头部编码方式使用二进制编码
使用的压缩算法为HPack算法
原理:用较短的索引号来代替k
静态字典
对常用的k-v 或者k(v是变化的)创建字典表,61个
(2)举例
server 对应索引54 占一个字节
其值
(3)动态字典
静态字典只有61个头部字段,其它字段可以使用动态字典。动态字典根据双方交互中头部内容定,从62 开始。
动态表生效的前提是:在同一个连接上,该k-v使用多次,且不再改变
传输过程中没有在字典表中的字段也会使用hafma编码
3. 二进制帧
4. 并发控制
(1)stream由streamId唯一确认,stream内部的帧通过streamId与stream关联,stream可以看成一条高速公路
(2)message相当于http请求或回复,相当于在高速路上跑的车
(3)fream是报文的头部和内容,相当于货物,一个请求或响应可以对应一个帧,或多个帧
(4)客户端创建的stream是奇数,服务端是偶数 (双向车道)
(5)在同一stream中,帧必须是严格有序的 (请求或响应)
(6)一条stream中,可以同时跑多辆车
队头阻塞: 客户端使用管道技术按顺序发送http请求,服务器也是按顺序处理请求的,如果某个回复特别耗时,下面的回复也就阻塞了。
使用并发技术,可以并发处理请求,但是在一个stream中是有队头阻塞的
最初:
修一条路,一辆车
http1.1长连接 一条路,多辆车,但路上只能有一辆
http1.1管道: 一条路,多辆车,路上可以有多辆
http1.2 并发 一条路,多个车道,每个车道可以有多辆车
- 主动推送资源
(1)首先在服务器配置 /请求路径–自动发送的资源
(2)先用一个PUSH_PROMISE帧告诉客户端,接下来在哪个stream中推送资源
(3)推送资源
HTTP3
- HTTP2遇到的问题
(1)队头阻塞:因为http2是基于TCP的,当某个tcp数据包缺失,会一直等待,并不会给应用层。
(2)三次握手 TLS 四次握手耗时 3RTT
(3)网络迁移需要重新连接
换网络,换端口等
2.HTTP3