流和多路复用

“流”是一个在客户端和服务端间通过 HTTP/2 连接进行数据交换的独立的、双向的帧序列。流有以下几个重要的特点:

  • 一个单独的 HTTP/2 连接能够包含多个同时打开的流,各个端点通过多个流交换帧。
  • 流可以被客户端或服务端单方面的建立或共享。
  • 流可以被任何一个端点关闭。
  • 流内帧的发送顺序是重要的。接收者按照接收顺序进行处理。特别是,HEADERS 和 DATA 帧的顺序是具有语义的。
  • 流以一个整数进行标识。流标识符由发起该流的端点分配。

流状态

流的生命周期如图 1 所示:


                             +--------+
                     send PP |        | recv PP
                    ,--------|  idle  |--------.
                   /         |        |         \
                  v          +--------+          v
           +----------+          |           +----------+
           |          |          | send H /  |          |
    ,------| reserved |          | recv H    | reserved |------.
    |      | (local)  |          |           | (remote) |      |
    |      +----------+          v           +----------+      |
    |          |             +--------+             |          |
    |          |     recv ES |        | send ES     |          |
    |   send H |     ,-------|  open  |-------.     | recv H   |
    |          |    /        |        |        \    |          |
    |          v   v         +--------+         v   v          |
    |      +----------+          |           +----------+      |
    |      |   half   |          |           |   half   |      |
    |      |  closed  |          | send R /  |  closed  |      |
    |      | (remote) |          | recv R    | (local)  |      |
    |      +----------+          |           +----------+      |
    |           |                |                 |           |
    |           | send ES /      |       recv ES / |           |
    |           | send R /       v        send R / |           |
    |           | recv R     +--------+   recv R   |           |
    | send R /  `----------->|        |<-----------'  send R / |
    | recv R                 | closed |               recv R   |
    `----------------------->|        |<----------------------'
                             +--------+

       send:   endpoint sends this frame
       recv:   endpoint receives this frame

       H:  HEADERS frame (with implied CONTINUATIONs)
       PP: PUSH_PROMISE frame (with implied CONTINUATIONs)
       ES: END_STREAM flag
       R:  RST_STREAM frame

图1:流状态