HTTP/2的帧允许两类错误:
- 使整个连接不可用的错误情况是“连接错误”;
- 在一个单独的流内部的错误是“流错误”。
连接错误处理
连接错误是指任何阻止帧层进一步处理或者破坏任何连接状态的错误。遇到连接错误的端点应该首先发送一个GOAWAY帧,带有成功从对端接收到的最后一个流的流标识符。GOAWAY帧包含一个说明为什么终止连接的错误码。发送完这个GOAWAY帧之后,端点必须关闭TCP连接。
有可能GOAWAY帧并没有被接收端可靠地接收。在连接错误这一事件上,GOAWAY帧只是尽最大努力尝试通知对端连接为什么被终止。
端点可以在任意时间结束一个连接。特别地,端点可以选择将流错误作为连接错误处理。只要环境允许,端点就应该在结束连接时发送一个GOAWAY帧。
流错误处理
流错误是指与某个具体流相关的、不影响其它流的处理的错误。
检测到流错误的端点发送一个RST_STREAM帧,包含发生错误的流的标识符。
RST_STREAM帧是端点可以在一个流上发送的最后一个帧。发送RST_STREAM帧的对端必须准备好接收另一端已经发送或即将发送的任何帧。这些帧可以被忽略,除非它们会修改连接状态(例如报头压缩或流量控制状态)。
通常情况下,端点不应该在任何流上发送多于1个的RST_STREAM帧。但是,如果在一个关闭的流上超过一次往返时间之后收到了帧,端点就可以发送额外的RST_STREAM帧。这种做法被允许用来处理行为不正常的实现。
为了避免死循环,端点绝对不能发送一个RST_STREAM帧作为另一个RST_STREAM帧的响应。
连接终止
如果在流仍然处于“打开”或“半关闭”状态时TCP连接就被关闭或重置了,那么受影响的流不能自动重试。