来自http2 spec:
每个标题块都作为离散单元处理。标题块必须 作为连续的帧序列发送,没有交错 任何其他类型或任何其他流的帧。最后一帧 HEADERS或CONTINUATION帧的序列具有END_HEADERS标志 组。 PUSH_PROMISE或CONTINUATION序列中的最后一帧 frames设置了END_HEADERS标志。 这允许标题块 在逻辑上等同于单个框架。
我看到“作为一个连续的帧序列传输,没有任何其他类型的交错帧或任何其他流”,如何“使一个报头块在逻辑上等同于一个帧”,但为什么逻辑等效于一个框架如此重要,以至于转向http2的其余部分如何工作?
答案 0 :(得分:2)
是否重要,因为标头块的处理会改变HPACK上下文所持有的连接状态。
处理如下序列:
HEADERS[stream=3,end_headers=false]
,
HEADERS[stream=5,end_headers=true]
,
CONTINUATION[stream=3,end_headers=true]
在处理CONTINUATION
的{{1}}帧之前,您需要等待HEADERS
帧到达。
现在,想象一下不发送stream=5
帧的恶意客户端:它将能够完全停止服务器上的帧处理并强制服务器缓冲所有到达的帧,等待CONTINUATION
帧 - 不好。
因此,为了使规范和协议变得简单,强制CONTINUATION
帧不能交错,这是对所有其他HTTP / 2的特殊处理可以交错的帧。