Cloudfront:HTTP/2 合规性问题

Cloudfront: HTTP/2 compliance issue

我求助于 Whosebug,因为 AWS 不提供免费套餐的技术支持。

有人报告了使用 httpx 的问题,我维护的 ruby HTTP 客户端库:https://gitlab.com/honeyryderchuck/httpx/issues/64

该报告是在最近升级以改进 HTTP/2 解析器规范合规性之后发布的。尽管该库现在通过了 h2spec,但似乎存在从云端请求的合法问题,因为它们似乎不符合规范的明显部分:当流量控制 window 超过 2 ** 31 - 1 被通告,发件人不得允许它并且 return 流量控制错误。

是否正确?

你是对的,流量控制window不能超过2^31-1,as indicated in the specification

初始流量控制 window 是 65535,而不是从 Cloudfront 发送的 65536,因此随后将流量控制 window 扩大 2147418112 产生 2^31,差一对于流量控制来说太大了window。

您的客户端正确发送了一个 GO_AWAY 错误 FLOW_CONTROL_ERROR。

sbordet 回答不完全正确。

流量控制 window 不能超过 2^31-1 字节并且初始流量控制 window 大小为 65535 字节是正确的。然而,CloudFront 发送错误值 65536 的部分是不正确的,因为允许任何端点修改默认初始 window 大小,如 RFC7540 Sec 6.9.2:

中所述

Both endpoints can adjust the initial window size for new streams by including a value for SETTINGS_INITIAL_WINDOW_SIZE in the SETTINGS frame that forms part of the connection preface.

请注意,此设置仅适用于新流,而不适用于连接流量控制window 大小。连接流控制 window 大小只能通过 WINDOW_UPDATE 帧更新,如 RFC 下一行所述:

The connection flow-control window can only be changed using WINDOW_UPDATE frames.

因此,在 CloudFront 将 SETTINGS_INITIAL_WINDOW_SIZE 更新为 65536 字节后,连接流量控制 window 仍为 65535 字节,因此接下来的 WINDOW_UPDATE 2147418112 字节将其增加到 2 ^31-1 字节(根据 RFC,这是一个有效值),而不是 2^31 字节。