HTTP2.0的二进制分帧

时间:2022-04-08 17:43:54

HTTP2.0的所有通信都是在一个TCP连接上完成的。

1.信息传输术语

1.1 流

  虚拟信道,可以承载双向消息,每个流都有一个唯一的整数标识符(1、2....N);

1.2 消息

逻辑上的HTTP消息,比如请求、响应,由一或多个帧组成。

1.3 帧

最小的通信单位,承载特定类型的数据,比如HTTP首部、负荷等等。

2.请求优先级

HTTP消息分解为多个独立帧之后,这些帧可以交错和传输顺序,进一步提升性能。为了做到这一点,每个流都可以带上31个比特位的优先级标示

服务器通过这些优先级的标志来分配资源(CPU、内存、带宽),而在响应数据准备好之后,优先将最高优先级的帧发送给客户端。

不过HTTP2.0没有规定优先级的具体算法,那么这种策略就需要开发着自行来解决。

3.流量控制。

4.服务器推送

5.首部压缩

2.帧的类型

在二进制分帧的结构中,头部有8个字节(64Bit),其中有一个字节(8Bit)来标志帧的类型:

HTTP2.0规定了如下帧类型:

DATA: 用于传输HTTP消息体
HEADERS:用户传输关于流的额外的首部字段
PRIORITY:用户指定或者重新指定引用资源的优先级
RST_STRING:用于通知流的非正常终止
SETTINGS:用于通知两端通信方式的数据配置
PUSH_PROMISE:用于发出创建流和服务器引用资源的要约
PING:用于计算往返时间,执行“活性”检查
GOAWAY:用于通知对端停止在当前连接的创建流
WINDOW_UPDATE:用于针对个别流或个别连接实现流量控制
CONTINUATION:用于继续一系列首部块片段

2.1  建立新流

客户端通过发送HEADERS帧来创建新流,这个帧包含带有新流ID的公用首部、可选的31位优先级,以及一组HTTP键-值对首部。

服务器通过发送PUSH_PROMISE帧来发起推送流,这个帧与HEADERS帧等效,但它包含“要约流ID”,没有优先级。

 注意:由于流的元数据与应用数据是单独发送的,因此客户端和服务器可以分别给它们设定不同的优先级。比如,“流量控制”的流优先级可以高一些,

 但只将其应用给DATA帧

2.2 发送应用数据

创建新流并发送HTTP首部之后,接下来就是利用DATA帧发送应用数据。应用数据可以分成多个DATA帧,最后一帧要翻转首部的END_STREAM字段。

3.Comet、SSE、技术

3.1.概念:

  利用长时间保留的HTTP请求(‘挂起的GET’)来让服务器向浏览器推送数据的技术,经常被称为Comet。

SSE让服务器可以向客户端流式发送文本消息,比如服务器上生成的实时通知或更新。

4.HTTP1.1和HTTP2.0的联系和传输的过程。

HTTP1.1的语义需要经过HTTP2 frame的封装,比如Get请求会经过HEADERs frame封装,Post请求的body需要经过HTTP2 data frame的封装。再然后就来到TLS协议,传输加密层,这里为什么会有加密?事实上HTTP2 RFC7540规定,HTTP2有两种实现,一种是H2,需要强制加密;还有一种H2C,这里的C是指clear,就是明文,不需要加密的意思。虽然协议规定有两种实现,但是现在所有的主流实现,包括所有的客户端,chrome,firefox,ie,safari和所有的操作系统,都是强制使用的TLS加密。加密层再往下就来到了大家用的很多的TCP层。TCP接着往下就到了IP网络层,以及以太网链路层再经过运营商网络物理层等等到达服务端,然后经过相同的协议栈进行处理。