http2.0入门基础
HTTP 2.0协议
http2.0升级方面
1.改进http传输性能,实现低延迟和高吞吐量;同时满足http语义的向下兼容。
2.相对http1.1,满足大多数情况下用户的感知时延有实质、可量度的改进
3.解决http的 “队首阻塞”问题
4.并行操作不需要与服务器建立多个连接,改善tcp的利用率
5.保持对http1.1语义的兼容
6.规定http2.0与http1.x之间的交互
7.明确所有的新的可扩展机制和适当的扩展策略
http2.0设计目标
http2.0通过支持首部字段压缩和同一连接上发送多个并发消息,使得应用更有效地利用网络资源,减少感知的延时。同时,支持服务器到客户端的主动推送。
http2.0设计实现
1.二进制分帧层
http2.0进行二进制分帧,封装http消息并在客户端和服务端之间进行传输;帧是http2.0传输的基本单位,http2.0将所有传输的信息分割成更小的消息和帧,并使用二进制进行编码。http2.0将交互抽象成流(stream)、消息(message)和帧(frame)的组合。
- http2.0所有的帧使用二进制编码,所有的首部数据会被压缩
- 对于同一个客户端所有的通信均建立在一个tcp连接
- http协议通信化为帧,帧对应逻辑流中的消息;很多流可以并行在同一个tcp连接上交换消息
具体语义:
流:连接的虚拟信道,具备双工的特性;每一个流具备唯一的整数标识符。消息:逻辑上的http消息,请求响应等等,有一或多个帧组成;
帧:http2.0通信的最小单位,包含帧首部,标识出帧所属的流,特定类型的数据(图 1)
图 1:http2.0各个语义之间的关系
2.多请求和多响应特性
- 可并行交错发送请求,请求之间互不影响
- 可并行交错发送响应,响应之间互不干扰
- 只需一个连接就能并行发送多个请求和响应
- 消除不必要的延迟,减少页面加载的时间
- 不受http1.x的限制
- 二进制分帧解决http1.x存在的队首阻塞的问题,消除并行处理请求和响应对多个连接的依赖
3.请求优先级
* http消息分帧后,可以优化帧的交错及传输顺序,每一个流都都拥有优先级(31bit)
* 服务器可根据流的优先级,控制资源的分配
4.每个来源共用连接
5.流量控制
* 流量控制基于每一跳进行,非端到端控制
* 流量控制基于窗口更新帧进行,=>接收方广播自己准备接收某个数据流的字节,以及整个连接需接受的字节
* 流量控制窗口通过WINDOW_UPDATE 帧更新,其指定了流ID和窗口大小的递增值
* 流量控制具有方向性,接收方可以根据自身的状况对每个流或者连接设置任意的窗口大小
* 流量控制可以由接收方禁用
6.服务器推送(http2.0新增特性)
* http2.0连接后,客户端和服务器交换SETTINGS帧,进行限制双向并发流的最大数量
* 所有的推送遵守同源策略,服务器不能随意将第三方资源推送给客户端,需经由双方确认
* PUSH_PROMISE 所有服务器推送由PUSH_PROMISE发送
7.首部压缩
* 使用HPACK算法,使用index mapping table压缩编码,index mapping table由静态表和动态表组成
* 压缩首部元数据
* http2.0首部差异化传输
http2.0分帧结构
1.所有的帧共享一个8字节的首部,包含帧的长度、类型、标志,还有一个保留位和一个31位的流标识符(图 2)
2.产生新流(stream)(图3)
- 发送数据前,创建流并发送对应的元数据
- 客户端使用HEADER帧发起流
- 服务器使用PUSH_PROMISE帧推送流
3.发送DATA帧数据(应用数据)(图4) 最后一帧END_STREAM标识,DATA帧不能超过16383字节,超过需分帧
相关参考
https://www.cnblogs.com/zhengshiqiang47/p/8673559.html
https://baike.baidu.com/item/HTTP%202.0/12520156?fr=aladdin
https://github.com/zqjflash/http2-protocol