HTTP 2

http2协议不是为了推翻http1,重新设计,它的目标是为了性能的提升等等,一个最主要的目标是容许用户使用一个连接来访问网站。

http2的官方网站:https://http2.github.io/

RFC 7540

https://httpwg.org/specs/rfc7540.html

Hypertext Transfer Protocol Version 2 (HTTP/2)

之前:

In particular, HTTP/1.0 allowed only one request to be outstanding at a time on a given TCP connection. HTTP/1.1 added request pipelining, but this only partially addressed request concurrency and still suffers from head-of-line blocking.

Therefore, HTTP/1.0 and HTTP/1.1 clients that need to make many requests use multiple connections to a server in order to achieve concurrency and thereby reduce latency

Http 头 :

1 无法压缩

2 每次请求都重复传递

HTTP2 Overview

http2支持1的所有核心特性,并且更加高效。Frame是http2中的最基本的单位。

Stream

stream 是一个独立的,双向的Frame的队列,这些frame在server 和client之间通过Http/2 传送。

stream有以下特性:

1 一个HTTP/2链接可以包含多个stream

2 stream可以被client和server创建

3 stream可以被client和server关闭

4 frame的顺序很重要

5 streams 被一个数字唯一标识

stream的状态

idle

所有的stream开始于这个状态。

  • 接受或者发出一个 HEADERS frame 会导致这个steam 变成”open”
  • 向其他的stream发出一个 PUSH_PROMISE frame,本stream会变为”reserved(local)”状态
  • 从其他的stream收到一个 PUSH_PROMISE frame,本stream会变为”reserved(remote)”状态

reserved(local/remote)

用于实现push,暂时不讨论

open

处于这个状态的stream,可以被两方使用,发送各种frames。

  • 双方都可以发送一个标记了 END_STREAM的frame,来使stream进入”half-closed”状态。发送 END_STREAM的一方,stream进入”half-closed(local)”状态,收到 END_STREAM的一方,stream进入”half-closed(remote)”状态。
  • 双方也可以发送一个RST_STREAM frame,导致双方进入”closed”状态

half-closed(local)

half-closed(remote) –END_STREAM flag –> half-close(local) 会是两边都进入“close”状态

或者收到一个 RST_STREAM ,也会直接进入“close”状态。

half-closed 有什么用处?

Stream Identifiers

stream 的标识符是一个31bit的无符号int。client端使用奇数,server端使用偶数。id为0的stream被用来作为控制信息的连接。

新创建的stream的标号必须比当前endpoint上现有的要大。

Stream concurrency

TODO

Flow Control

HTTP/2通过WINDOW_UPDATE frame来支持流量控制。

HTTP/2“流”的流量控制的目标是:在不改变协议的情况下允许使用多种流量控制算法。

HTTP/2的流量控制有一下特征:

  • 流量控制是特定于一个连接的。
  • 流量控制是基于WINDOW_UPDATE帧的。接收方公布自己打算在每个流以及整个连接上分别接收多少字节。这是一个以信用为基础的方案。
  • 流量控制是有方向的,由接收者全面控制。
  • 无论是新流还是整个连接,流量控制窗口的初始值是65535字节
  • 帧的类型决定了流量控制是否适用于帧。目前,只有DATA帧服从流量控制,所有其它类型的帧并不消耗流量控制窗口的空间。这保证了重要的控制帧不会被流量控制阻塞。
  • 流量控制不能被禁用