如何在来自 AVS 的 http2 连接上接收超过 65535 字节的数据?

Posted

技术标签:

【中文标题】如何在来自 AVS 的 http2 连接上接收超过 65535 字节的数据?【英文标题】:how to receive more than 65535 bytes of data on http2 connection from AVS? 【发布时间】:2018-04-09 08:36:29 【问题描述】:

我用 C 语言实现了一个应用程序,它使用 nghttp2 和 openssl 与 Amazon AVS 云进行通信。我最多只能得到 65535 个字节的响应。如果响应大于 65535 字节,则应用程序将无法接收其余数据并永远卡住以接收响应。如前所述,我使用 nghttp2 库进行 HTTP/2 连接。

是否需要设置任何配置才能从 AVS 云获取超过 65535 字节的数据? 请帮忙。

【问题讨论】:

请提供一些示例代码来演示您的问题。 请出示相关代码。由于 Stack Overflow 向您隐藏了关闭原因:寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定问题或错误以及在问题本身。没有明确问题陈述的问题对其他读者没有用处。请参阅:How to create a Minimal, Complete, and Verifiable example。 【参考方案1】:

您只能接收 65535 字节的事实听起来很像您没有正确处理 HTTP/2 流控制。

我对 nghttp2 库了解得不够多,无法告诉您必须做什么才能确保正确处理流控制,但要么您没有正确使用 nghttp2 API(例如,您忘记通知回调),或者您没有调用处理必须调用的流控制的nghttp2 API。

作为参考,您可以阅读有关流控制的信息in the specification。

【讨论】:

没错。客户端管理自己的流量控制窗口也很重要。收到数据后,您必须在某个时候发出 WINDOW_UPDATE 帧,以通知服务器您可以在连接上接收更多数据,否则将消耗初始窗口(默认为 65535 字节)! 看看nghttp2的nghttp2_submit_window_update方法 感谢您的回复。我已尝试使用“nghttp2_submit_window_update”,但仍无法接收超过 65535 字节的数据。 我在“on_data_chunk_recv_callback”回调函数中使用了“nghttp2_submit_window_update”函数。我观察到,有时这个函数调用会因流控制错误而失败,有时它会成功,但数据大小的限制(65535)没有增加。 以下是用于nghttp2注册的回调函数列表:nghttp2_session_callbacks_set_send_callback(),nghttp2_session_callbacks_set_recv_callback(),nghttp2_session_callbacks_set_on_frame_send_callback(),nghttp2_session_callbacks_set_on_header_callback(),nghttp2_session_callbacks_set_on_stream_close_callback(),nghttp2_session_callbacks_set_on_data_chunk_recv_callback(),nghttp2_session_callbacks_set_data_source_read_length_callback()跨度>【参考方案2】:

我也遇到了同样的问题,作为一种快速解决方法,我在打开会话并调用时通过 nghttp2_option_set_no_auto_window_update(option, 1) API 禁用了 nghttp2 的自动窗口更新

nghttp2_session_consume(session, stream_id, len); nghttp2_submit_window_update(会话,NGHTTP2_FLAG_NONE,stream_id,len); nghttp2_session_send(session);

在我处理完一大块数据后,来自数据块 recv 回调。我仍然不确定为什么保持 nghttp2 的自动窗口更新功能不起作用。

【讨论】:

以上是关于如何在来自 AVS 的 http2 连接上接收超过 65535 字节的数据?的主要内容,如果未能解决你的问题,请参考以下文章

AVS V2 建立 HTTP2 连接

小丸子学习HTTP2

小丸子学习HTTP2

http2学习

在“搜索”连接上请求 500 条记录超过了 graphql 中 100 条记录的“第一”限制

漏洞报送Apache Tomcat 信息泄露漏洞