为什么 header 块需要在连续帧中传输,而没有相同或其他流的交错帧?
Why a header block requires transmission in contiguous frames with no interleaved frames of same or other stream?
在 RFC 7540 的第 14 页中提到 "Each header block is processed as a discrete unit. Header blocks MUST be interleaved as a contiguous sequence of frames, with no interleaved frames of any type or from any other stream"
据我所知,这也是一种行首阻塞。实施者甚至针对不同的 Streams 提出这个想法的背后有什么原因吗?
谢谢!
您说得对,这确实添加了行首阻塞。这是必要的,因为 HPACK 引入了状态,这意味着其他 header 帧不能交织在一起,而不会导致混淆更新 HPACK 动态的顺序 table.
在设计过程中 were other proposals discussed,包括将其更改为大框架 - 但通过坚持连续的 HEADERS + CONTINUATION 框架实际上是同一件事,还有其他很好的理由让 CONTINUATION帧。
有趣的是 QUIC and HTTP/3 are looking to drop CONTINUATION frames 并使用更大的帧尺寸:
CONTINUATION (0x9): : CONTINUATION frames do not exist; instead, larger HEADERS/PUSH_PROMISE frames than HTTP/2 are permitted.
但话说回来QPACK也不得不解决HOL问题,因为独立流在QUIC下是真正独立的,而在TCP下仍然保证顺序。
最终 HTTP/2 CONTINUATION 帧预计将很少使用:绝大多数 HEADERS 将适合单个 HEADERS 帧(限制在 16k)。因此,对于大多数用例而言,这并不是什么大问题,对于边缘情况,恕我直言,简单胜过技术复杂。
在 RFC 7540 的第 14 页中提到 "Each header block is processed as a discrete unit. Header blocks MUST be interleaved as a contiguous sequence of frames, with no interleaved frames of any type or from any other stream"
据我所知,这也是一种行首阻塞。实施者甚至针对不同的 Streams 提出这个想法的背后有什么原因吗?
谢谢!
您说得对,这确实添加了行首阻塞。这是必要的,因为 HPACK 引入了状态,这意味着其他 header 帧不能交织在一起,而不会导致混淆更新 HPACK 动态的顺序 table.
在设计过程中 were other proposals discussed,包括将其更改为大框架 - 但通过坚持连续的 HEADERS + CONTINUATION 框架实际上是同一件事,还有其他很好的理由让 CONTINUATION帧。
有趣的是 QUIC and HTTP/3 are looking to drop CONTINUATION frames 并使用更大的帧尺寸:
CONTINUATION (0x9): : CONTINUATION frames do not exist; instead, larger HEADERS/PUSH_PROMISE frames than HTTP/2 are permitted.
但话说回来QPACK也不得不解决HOL问题,因为独立流在QUIC下是真正独立的,而在TCP下仍然保证顺序。
最终 HTTP/2 CONTINUATION 帧预计将很少使用:绝大多数 HEADERS 将适合单个 HEADERS 帧(限制在 16k)。因此,对于大多数用例而言,这并不是什么大问题,对于边缘情况,恕我直言,简单胜过技术复杂。