HTTP2RFC 笔记整理

http2

报头(HEADERS)和数据(DATA)帧组成了基本的HTTP 请求和响应

设置(SETTINGS),窗口更新(WINDOW_UPDATE), 和推送承诺(PUSH_PROMISE)是用来实现HTTP/2的其他功能

1.启动HTTP/2
2.帧(章节4)和流层
3.帧(章节6)和错误码(章节7)
4.HTTP寻址(章节8)和拓展需求(章节9)描述了HTTP语义化是如何由帧和流表达的

3 启动HTTP/2

3.1 HTTP/2版本定义
字符”h2”表示HTTP/2协议使用TLS[TLS]

字符”h2c” 表示HTTP/2协议运行在明文TCP上

用到”h2” 或者 “h2c” 表明使用文档中定义的传输、安全、帧及语义化消息。

客户端无法预知服务器是否支持http2

GET /default.htm HTTP/1.1
Host: server.example.com
Connection: Upgrade, HTTP2-Settings
Upgrade: h2c
HTTP2-Settings: <base64url encoding of HTTP/2 SETTINGS payload>

不支持
HTTP/1.1 200 OK
Content-Length: 243
Content-Type: text/html

支持
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: h2c

[ HTTP/2 connection …

支持后客户端发送的第一个是链接序言
第一个被服务端发送的HTTP/2帧是一个设置(SETTINGS)帧。在收到101响应后,客户端发送一个包含设置(SETTINGS)帧的连接序言。

连接序言:PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n

如果任何一个端点没有以一个有效的连接序言开头,客户端和服务端必须终止TCP连接。如果端点并没有使用HTTP/2此时可以省略超时(GOAWAY)帧(章节6.8)。

4 HTTP Frames HTTP帧

0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±+
| R | Length (14) | Type (8) | Flags (8) |
±±±----------±--------------±------------------------------+
|R| Stream Identifier (31) |
+=+=============================================================+
| Frame Payload (0…) …
±--------------------------------------------------------------+

R : 保留的2位字段。这些字节的语义是未定义的,并且在发送的时候必须保持未设置(0),接收的时候必须被忽略此字段。
Length : 14位无符号整数的帧主体长度。8字节长度的帧报头信息不计算在此内。

Type : 帧的8位类型。帧类型定义了剩余的帧报头和帧主体将如何被解释。具体实现必须在收到未知帧类型(任何未在文档中定义的帧)时作为连接错误中的类型协议错误(PROTOCOL_ERROR)处理。
Flags : 为帧类型保留的8字节字段有具体的布尔标识。
标识针对确定的帧类型赋予特定的语义。确定帧类型定义语义以外的标示必须被忽略,并且必须在发送的时候保留未设置(0)。

R : 1位的保留字段。这个字段的语义未设置并且必须在发送的时候保持未设置(0),在接受的时候必须被忽略。

Stream Identifier : 31字节的流标识符(见StreamIdentifiers)。0是保留的,标明帧是与连接相关作为一个整体而不是一个单独的流。

4.2 Frame Size 帧大小
帧主体的最大长度限制因不同的帧类型而不同。最大帧主体的绝对长度是 (16,383)字节,表示最大的帧长度是16,391字节。所有的实现必须具备接收和处理此最大长度帧的能力。

4.3 Header Compression and Decompression 报头压缩和解压缩

HTTP/2报文报头字段是包含一个或多个相关的键值对。他们在HTTP请求响应消息及服务器推送操作(见章节8.2)中使用。

报头集合是0个或多个报头字段的集合。当他通过连接传输的时候,报头集合将使用HTTP报头压缩序列化到报文报头块中。序列化的报头块被分割成一个或多个的字节序列,称为报头分区,并在报头、推送承诺及延续帧的载体中传送。

HTTP报文头压缩并不保留报头字段的相关顺序。具有多个值的报头字段使用特定的分割器被编码分割到一个单独的报头区域(见 章节8.1.2.3 HeaderOrdering),这保留了该报头字段中各种值的对应顺序。

报文头Cookie字段被通过HTTP映射特殊处理;见章节8.1.2.4。

接收端点连接报头区块重新组装,并且解压缩区块后重建报头集合。

一个完整的报头区块包含:

一个完整的报头区块包含:

一个包含报头终止标记集合的单独的报头HEADERS 或 推送承诺PUSH_PROMISE帧,或者
一个报头终止标记被清除的报头HEADERS 或 推送承诺PUSH_PROMISE帧以及一个或多个延续CONTINUATION帧,最后一个延续CONTINUATION帧拥有报头终止标记设置。

报头压缩是有状态的并且在整个连接过程中使用同个压缩环境。每个报头区块作为离散的单元处理。报头区块必须作为一个连续的帧序列传输,没有任何类型或任何其他流的交错帧。一个报头HEADERS或者延续CONTINUATION帧序列的最后一帧必须有报头终止标记设置。推送承诺PUSH_PROMISE或者延续CONTINUATION帧序列的最后一帧必须具有报头终止标记设置。

报头区块必须被报头HEADERS、推送承诺PUSH_PROMISE或延续CONTINUATION的有效载体发送,因为这些帧中携带了能被接收端修改的压缩上下文数据。端点在接收报头HEADERS、推送承诺PUSH_PROMISE或延续CONTINUATION帧时必须重新组装报头区块并且执行解压缩,即便这些帧将被废弃。如何不能重建报头区间,接收端必须终止连接并报类型为解压缩错误的连接错误(章节5.4.1)。

5 Streams and Multiplexing 流和多路复用

一个单独的HTTP/2连接能够保持多个同时打开的流,各个端点间从多个流中交换帧。
流可以被被客户端或者服务端单方面建立使用或分享。
流可以被任何一个连接终端关闭。
在流内发送帧的顺序很重要。它们将按被接收的顺序处理。特别是报头及数据帧的顺序语义上是有意义的。
流以一个整数标识。标识符有启动流的终端分配。

                   +--------+
             PP    |        |    PP
          ,--------|  idle  |--------.
         /         |        |         \
        v          +--------+          v
 +----------+          |           +----------+
 |          |          | H         |          |

,—| reserved | | | reserved |—.
| | (local) | v | (remote) | |
| ±---------+ ±-------+ ±---------+ |
| | ES | | ES | |
| | H ,-------| open |-------. | H |
| | / | | \ | |
| v v ±-------+ v v |
| ±---------+ | ±---------+ |
| | half | | | half | |
| | closed | | R | closed | |
| | (remote) | | | (local) | |
| ±---------+ | ±---------+ |
| | v | |
| | ES / R ±-------+ ES / R | |
| ----------->| |<-----------' | | R | closed | R | -------------------->| |<--------------------’
±-------+

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

流的状态:

所有流以“空闲”状态开始。在这种状态下,没有任何帧的交换。

下列传输在这种状态下是有效的:

发送或者接收一个报头HEADERS帧导致流变成“打开”。流标识符如StreamIdentifiers说明。这个报头HEADERS帧同样可能导致流立即变成“半关闭”状态。
发送一个推送承诺PUSH_PROMISE帧标记相关的流后续再使用。保留流状态将转换为“保留(本地)”。
接收一个推送承诺PUSH_PROMISE帧标记相关的流为远程端点预留的流。这些流的状态变成“保留(远程)”

reserved (local) :

在“报留(本地)”状态的是已经被承诺发送推送承诺PUSH_PROMISE帧的流。一个推送承诺PUSH_PROMISE帧通过使一个流与一个由远端对等端初始化的打开的流相关联来保留一个空闲流。

在这种状态下,只有下列传输是可能的:

端点可以发送报头HEADERS帧,致使流打开到“半封闭(远程)”状态。
任意端点能发送一个RST_STREAM帧来使流变成“关闭”。这将释放流的保留。

在这种状态下一个端绝对不能发送报头HEADERS帧和RST_STREAM以外的帧

在这种状态下一个优先级PRIORITY帧可能被接收。接收到任何报头HEADERS帧、RST_STREAM帧或者优先级PRIORITY帧以外的帧都将被认为是类型为协议错误PROTOCOL_ERROR的连接错误(章节5.4.1)。

reserved (remote) :

在“保留(远程)”状态下的流说明已经被远程对等端所保留。

在这种状态下,只有下列传输是可能的:

接收一个报头HEADERS帧并致使流转换到“半封闭(本地)”状态。
任意一个端点能发送一个RST_STREAM 帧来使流变成“关闭”。这将释放流的保留。

open :
处于“打开”状态的流可以被两个对等端来发送任何类型的帧。在这种状态下,发送数据的对等端检查被广播端FlowControl流量控制限制(章节5.2)。
在这种状态下每个终端可以发送一个带有END_STREAM结束流标记的帧来使流转换到其中一种“半关闭”状态:一个终端发送一个结束流END_STREAM标记使流变成“半封闭”状态;一个终端接收一个结束流END_STREAM标记使流变成“半封闭(远程)”状态。带有结束流END_STREAM标记的报头HEADERS帧后面可以跟着延续CONTINUATION帧。

这种状态下各个终端可以发送一个RST_STREAM帧来使流转换到”关闭”状态。

half closed (local) :

“半封闭(本地)”状态下的流不能发送帧。只有窗口更新(WINDOW_UPDATE)、优先级(PRIORITY)和终止流(RST_STREAM)帧能在这种状态下发送。

half closed (remote) :
“半封闭(远程)”状态下的流不再被对等端用来发送帧。这种状态下,执行流量控制的终端不再承担接收留空控制窗口的工作。
如果终端接收到处于这种状态下的流发送的额外的帧,除非是延续CONTINUATION帧,否则必须返回类型为流关闭STREAM_CLOSED的流错误(章节5.4.2)。

这种状态下,当流发送一个带有终止流END_STREAM标记的帧或者某个终端发送了一个RST_STREAM帧,流将转换到“关闭”状态。

closed :
“关闭”状态是终止状态。

终端绝对不能通过关闭的流发送帧。终端在收到RST_STREAM后接收的任何帧必须作为类型为流关闭STREAM_CLOSED的StreamErrorHandler流错误stream error(章节5.4.2)处理。相似的,终端接收到带有END_STREAM标记设置的数据DATA帧之后的任何帧,或在带有END_STREAM终止流标记且后面没有延续CONTINUATION帧的报头HEADERS帧之后收到任何帧都必须作为类型为流关闭STREAM_CLOSED的连接错误(章节5.4.1)处理。

5.1.1 Stream Identifiers 流标识

流由31位字节的无符号整数标识。客户端发起的流必须以奇数标示;服务器发起的流必须使用偶数来标示
一个新建立的流标识符必须数值大于任何终端已经打开或者保留的流标识符。规则适用于使用报头帧打开的流以及使用推送承诺帧保留的流。终端收到不规范的流标识符必须响应一个类型为协议错误(PROTOCOL_ERROR)的连接错误。

流标识符不能被重复使用。生存期长的连接可能导致流标识符可用范围耗尽。客户端不能新建流标识符时可以针对新流建立一个新的连接。服务端不能新建流标识符时可以发送一个超时帧(GOAWAY)强制客户端对新的流使用新的连接。

5.1.2 Stream Concurrency 流并发

对等端可以使用设置帧里面的SETTINGS_MAX_CONCURRENT_STREAMS参数来限制流的并发量。

客户端可以指定服务端能启动的流最大并发量,而且服务端能指定客户端能启动的流最大并发量。终端绝对不能超过对等端设置的限制。

处于“打开”或者任意一种“半封闭”状态的流均计入终端被允许启动的流次数中。处于任意这三种状态下的流都将计入SETTINGS_MAX_CONCURRENT_STREAMS设置次数中。处于任意一种“保留”状态下的流不计入打开次数中。

终端绝对不能超过对等端设定的设置。终端接收到报头帧导致他们广播的并发流超过限制的必须将这作为流错误(章节5.4.2)处理。终端希望将SETTINGS_MAX_CONCURRENT_STREAMS的值减少到比当前打开的流更小时可以关闭超过新的设置值的流或者允许流结束。

5.2 Flow Control 流量控制

使用复用流介绍了针对TCP连接的资源争夺导致的流阻塞。流量控制方案等确保同一连接上的流相互之间不会造成破坏性的干扰。流量控制在单个流及整个连接过程中使用。

HTTP/2 通过使用WINDOW_UPDATE帧类型来提供流量控制(章节6.9)。

5.2.1 Flow Control Principles 流量控制规则

流量控制的定义是用来保护端点在资源约束条件下的操作。例如,一个代理需要在很多连接之间共享内存,也有可能有缓慢的上游连接和快速的下游连接。
流量控制解决的情况是接收端在一个流上处理数据的同时同样想继续处理同个连接上的其他流。

5.4 Error Handling 错误处理

HTTP/2框架允许两类错误:

使整个连接不可用的错误。
单个流中出现的错误。
错误码列表可以在”ErrorCodes”找到。

5.4.1 Connection Error Handling 连接错误处理
流错误是阻止帧层更进一步进行处理或者破坏任何流状态的错误。
发送流错误的终端应当首先发送一个超时(GOAWAY)帧(章节6.8),并带有最近的一个成功从对等端接收帧的流的标识符。GOAWAY超时帧包含链接终端的错误码。发送GOAWAY后,终端必须关闭TCP连接。
超时(GOAWAY)帧有可能不被接收端有效接收。在连接错误事件中,超时(GOAWAY)帧是尝试跟对等端通信告知连接终止原因的最佳实践。

5.4.2 Stream Error Handling 流错误处理

终端检测到流错误时发送一个带有错误发生时的流标识符的RST_STREAM帧(RST_STREAM,章节6.4)。RST_STREAM帧带有表示错误类型的错误码。
RST_STREAM是终端可以发送一个流的最后一帧。发送RST_STREAM帧的对等端必须准备好接收任何由远端对等端发送或者准备发送的帧。这些帧可以被忽略,除非连接状态被修改(例如报头压缩(章节4.3)中的状态)。

5.4.3 Connection Termination 连接终止
如果TCP连接在流仍然保持打开或者半封闭状态下断开,那么终端必须假定这些流是异常终端且不完整的。

6 Frame Definitions 帧定义

6.1 DATA 数据帧

0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±+
| [Pad High(8)] | [Pad Low (8)] | Data () .
±--------------±--------------±------------------------------+
. Data (
) …
±--------------------------------------------------------------+
| Padding (*) …
±--------------------------------------------------------------+

Pad Length : 包含字节为单位的帧填充长度的8位字段。这个字段是可选的,并且只在设置了PADDED标记的情况下呈现。
Padding : 填充字节不包含任何应用语义值。填充字节必须在发送的时候设置为0,在接收的时候忽略。
Data : 应用数据。数据量的大小是帧的有效载荷减去其他呈现字段的长度。

END_STREAM (0x1) : 位1用来表示当前帧是确定的流发送的最后一帧。设置这个标记时流进入到一种半封闭状态或者关闭状态(章节5.1)。
END_SEGMENT (0x2) : 位2表示是当前端的最后一帧。代理端绝对不能跨越多个端的边界来合并帧,转发帧的时候代理端必须保持片段的边界。
PADDED (0x8) : 位4用来表示Pad Length 字段是可见的。

数据帧绝对需要与流相关联。如果接收到流标记字段是0x0的数据帧,必须响应一个类型为协议错误的连接错误(章节5.4.1)。

数据帧遵从流量控制,并且只有在流是打开或者半封闭(远端)状态下才能够被发送。填充同样包含在流量控制中。
如果数据帧在相关流不是在打开和半封闭(本地)状态下被接收,接收端必须响应一个类型为流关闭的流错误(章节5.4.2)。

填充字节的总数取决于Pad Length 的值。如果填充物的大小大于帧有效载荷的大小,接收端必须作为类型为协议错误的连接错误(章节5.4.1)处理。

6.2 HEADERS 报头

报头帧(类型=0x1)由键值对组成。它用来打开一个流(章节5.1)。报头帧能在流打开或者半封闭(远程)的状态下发送。

0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±+
|Pad Length? (8)|
±±------------±----------------------------------------------+
|E| Stream Dependency? (31) |
±±------------±----------------------------------------------+
| Weight? (8) |
±±------------±----------------------------------------------+
| Header Block Fragment () …
±--------------------------------------------------------------+
| Padding (
) …
±--------------------------------------------------------------+

Pad Length : 8位的包含单位为字节帧填充长度字段。这个字段是可选的并只有在设置了PADDED 标记的情况下才呈现
E : 1位的标记用于标识流依赖是否是专用的,见章节5.3。这个字段是可选的,并且只在优先级标记设置的情况下才呈现。
Stream Dependency : 31位流所依赖的流的标识符的字段,见章节5.3。这个字段是可选的,并且只在优先级标记设置的情况下才呈现。
Weight : 流的8位权重标记,见章节5.3。添加一个1-256的值来存储流的权重。这个字段是可选的,并且只在优先级标记设置的情况下才呈现。
Header Block Fragment : 报头块碎片。
Padding : 填充字节

6.3 PRIORITY 优先级帧

0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±+
|E| Stream Dependency (31) |
±±------------±----------------------------------------------+
| Weight (8) |
±±------------+

E : 一位的标记,指示流的依赖是专有的,见章节5.3
Stream Dependency : 标识流所依赖的流的31位流标识符,见章节5.3
Weight: 流的依赖的的权重(8位),见章节5.3。添加一个1-256的权重值。

6.4 RST_STREAM RST_STREAM帧

0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±+
| Error Code (32) |
±--------------------------------------------------------------+

RST_STREAM帧(type=0x3)允许流的异常终止。当被流的指示器发送时,它表示期望取消流或者错误条件发生。当被接收端的流发送时,它表示接收者希望拒绝流、流被取消或者发生了错误。

6.5 SETTINGS 设置帧

设置帧(type=0x4)包含影响如何与终端通信的设置参数(例如偏好设置以及对等端的行为约束),并且用来确认这些参数的接收。单个的设置参数也可以被认为是“设置”。

设置帧总是应用于连接,而不是一个单独的流。流的设置帧标识必须为0.如果终端接收到流设置帧标识不是0的设置帧,必须响应一个类型为协议错误的连接错误(章节5.4.1)。

6.5.1 SettingFormat 设置帧格式
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±+
|Identifier (8) | Value (32) …
±--------------±----------------------------------------------+
…Value |
±--------------+

定义了以下参数:

SETTINGS_HEADER_TABLE_SIZE (1) : 允许发送端通知远端终端解码报头区块的报头压缩表的最大承载量。这个编码器可以选择在报头区块中使用特定信号来减少报头压缩的大小(???)。初始值是4,096个字节。
SETTINGS_ENABLE_PUSH (2) : 这个参数可以用来关闭服务器推送。终端在接收到此参数为0的情况下绝对不能发送服务器推送承诺帧。终端在已经设置此参数为0并且承认的情况下必须对接收到的服务器推送作为类型为协议错误的连接错误处理。
初始值是1,表示推送是许可的。任何不是0或1的值必须作为类型为协议错误的连接错误处理。
SETTINGS_MAX_CONCURRENT_STREAMS (3) : 标明发送者允许的最大并发流。此限制是定向的:它适用于发送端允许接收端创建的最大并发流的数量。初始化时这个值没有限制。建议值不要大于100,以免不必要的限制并行。
此设置为0的值不应该被终端认为是特殊的。0的值阻止了新的流的创建,另外它也适用于被激活的流用尽的任何限制。对于短连接不应该设置此参数为0;如果服务端不希望接收任何请求,最佳的做法是关闭连接。
SETTINGS_INITIAL_WINDOW_SIZE (4) : 表示发送端对流层流量控制的初始窗口大小(字节单位)。初始值是65,535。
这个参数影响了所有流的窗口大小,包括现有的流。见章节6.9.2.
流量控制窗口大小值大于2的31次方-1的必须被作为流量控制错误的连接错误处理。

6.6 PUSH_PROMISE 推送承诺帧

0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±+
| [Pad High(8)] | [Pad Low (8)] |X| Promised Stream ID (31) …
±--------------±--------------±±----------------------------+
… Promised Stream ID | Header Block Fragment () …
±------------------------------±------------------------------+
| Header Block Fragment (
) …
±--------------------------------------------------------------+
| Padding (*) …
±--------------------------------------------------------------+

报头帧载体包含以下字段:
Pad High : 填充大小高位。这个字段只有在PAD_HIGH标记设置的情况下才呈现。
Pad Low : 填充大小低位。这个字段只有在PAD_LOW标记设置的情况下才呈现。
X : 单独的保留位。
Promised Stream ID : 这个无符号31位整数表示终端准备发送的流标记。被承诺的流标记必须对发送端准备发送的下一个流来说是有效选择。
Header Block Fragment : 包含请求头字段的报头区块碎片(章节5.1.1)。
Padding : 填充字节。

6.7 PING PING帧
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±+
| |
| Opaque Data (64) |
| |
±--------------------------------------------------------------+

6.8 GOAWAY 超时帧
超时帧(type=0x7)通知远端对等端不要在这个连接上建立新流。超时帧可以由客户端或者服务端发送。一旦发送,发动端将忽略当前连接上新的和标示符大于上一个流的帧的发送。接收端接收到超时帧后绝对不能在这个连接上打开新的流,但是可以针对新的流创建一个新的连接。

0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±+
|X| Last-Stream-ID (31) |
±±------------------------------------------------------------+
| Error Code (32) |
±--------------------------------------------------------------+
| Additional Debug Data (*) |
±--------------------------------------------------------------+

6.9 WINDOW_UPDATE 窗口更新帧
WINDOW_UPDATE帧(type=0x8)用来实现流量控制;概述见章节5.2。

0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±+
|X| Window Size Increment (31) |
±±------------------------------------------------------------+

7 Error Codes 错误码
NO_ERROR (0) : 相关的条件并不是错误的结果。例如超时帧可以携带此错误码指示连接的平滑关闭。
PROTOCOL_ERROR (1) : 终端检测到一个不确定的协议错误。这个错误用在一个更具体的错误码不可用的时候。
INTERNAL_ERROR (2) : 终端遇到意外的内部错误。
FLOW_CONTROL_ERROR (3) : 终端检测到对等端违反了流量控制协议。
SETTINGS_TIMEOUT (4) : 终端发送了设置帧,但是没有及时收到响应。见Settings Synchronization。
STREAM_CLOSED (5) : 终端在流半封闭的时候收到帧。
FRAME_SIZE_ERROR (6) : 终端收到大小超过最大尺寸的帧。
REFUSED_STREAM (7) : 终端拒绝流在它执行任何应用处理之前,详见Reliability(章节 8.1.4)
CANCEL (8) : 终端使用这个标示某个流不再需要。
COMPRESSION_ERROR (9) : 终端无法维持报头压缩上下文的连接
CONNECT_ERROR (10) : 响应某个连接请求建立的连接被服为异常关闭。
ENHANCE_YOUR_CALM (11) : 终端检测出对等端在表现出可能会产生过大负荷的行为。
INADEQUATE_SECURITY (12) : 基础传输包含属性不满足文档或者终端申明的最小要求。

8.1 HTTP Request/Response Exchange HTTP 请求/响应交换
客户端在一个新的流上发起HTTP请求,使用以前未使用的流标示。服务端在同个流上发起HTTP请求。

8.1.3 Examples 示例

GET /resource HTTP/1.1 HEADERS
Host: example.org ==> + END_STREAM
Accept: image/jpeg + END_HEADERS
:method = GET
:scheme = https
:path = /resource
host = example.org
accept = image/jpeg

HTTP/1.1 304 Not Modified HEADERS
ETag: “xyzzy” ==> + END_STREAM
Expires: Thu, 23 Jan … + END_HEADERS
:status = 304
etag: “xyzzy”
expires: Thu, 23 Jan …

POST /resource HTTP/1.1 HEADERS
Host: example.org ==> - END_STREAM
Content-Type: image/jpeg + END_HEADERS
Content-Length: 123 :method = POST
:scheme = https
{binary data} :path = /resource
:authority = example.org
content-type = image/jpeg
content-length = 123

                               DATA
                                 + END_STREAM
                               {binary data}

带有报头字段及载荷数据的响应将被转换成一个报头帧,后面跟着0个或多个延续帧,另外后面跟着一个或多个数据帧,序列中的最后一个数据帧拥有END_STREAM标记。
HTTP/1.1 200 OK HEADERS
Content-Type: image/jpeg ==> - END_STREAM
Content-Length: 123 + END_HEADERS
:status = 200
{binary data} content-type = image/jpeg
content-length = 123

                               DATA
                                 + END_STREAM
                               {binary data}

所有的请求或者响应报头区块以及所有的数据帧发送之后,尾报头字段作为一个报头区块发送。带有尾部的报头/延续帧序列包含一个带有END_HEADERS及END_STREAM标记的终止帧。
HTTP/1.1 200 OK HEADERS
Content-Type: image/jpeg ==> - END_STREAM
Transfer-Encoding: chunked + END_HEADERS
Trailer: Foo :status = 200
content-length = 123
123 content-type = image/jpeg
{binary data} trailer = Foo
0
Foo: bar DATA

  • END_STREAM
    {binary data}

                                 HEADERS
                                   + END_STREAM
                                   + END_HEADERS
                                     foo: bar
    

猜你喜欢

转载自blog.csdn.net/qq_32783703/article/details/129860817