在 nghttp2 示例中看不到 Http-Settings 标头
Posted
技术标签:
【中文标题】在 nghttp2 示例中看不到 Http-Settings 标头【英文标题】:Cannot see the Http-Settings Header in the nghttp2 example 【发布时间】:2019-11-18 07:22:54 【问题描述】:我目前正在尝试学习 nghttp2 并尝试执行此页面底部提供的客户端代码:
https://nghttp2.org/documentation/tutorial-client.html
我执行了上面的 C 代码,执行以下操作:
./libevent-client URL
我的服务器是 Windows IIS 10.0,我想在标头的输出中查看 http2-settings 框架。截至目前,它显示以下输出:
Connected
Request headers:
:method: GET
:scheme: https
:authority: MY URL
:path: /
Response headers from stream ID=1:
:status: 200
content-type: text/html
last-modified: Mon, 01 Jul 2019 17:57:17 GMT
accept-ranges: bytes
etag: "c7c5406c3630d51:0"
server: Microsoft-IIS/10.0
date: Mon, 08 Jul 2019 16:02:27 GMT
content-length:51
All headers received
<html><head>Hello</head><html>
我需要知道我应该在代码中需要什么来查看 http 设置是否随请求一起传递。我知道以下函数可以完成发送带有请求的 SETTINGS 帧的工作:
static void send_client_connection_header(http2_session_data *session_data)
nghttp2_settings_entry iv[1] =
NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS, 100;
int rv;
/* client 24 bytes magic string will be sent by nghttp2 library */
rv = nghttp2_submit_settings(session_data->session, NGHTTP2_FLAG_NONE, iv,
ARRLEN(iv));
if (rv != 0)
errx(1, "Could not submit SETTINGS: %s", nghttp2_strerror(rv));
我也不知道我们在 http2 协议中用于 HTTP-Settings 的标签是什么,就像我们有“:method”的方法,用于方案“:scheme”等。我什至在RFC。
【问题讨论】:
您可以使用'good old' Wireshark 在飞行中嗅探数据包,以亲眼确认已发送 SETTINGS 帧。 @SoumyaKanti 谢谢!!有时我们会忘记简单的基本内容。成功了! 【参考方案1】:HTTP/2 设置框架不是 HTTP 标头 - 它是在连接开始时发送的单独消息。因此,不可能像 HTTP Header 一样显示它。
HTTP/2 包含许多这样的不可见控制框架:
设置框架来定义如何使用连接 WINDOW_UPDATE 框架实现流控制 PRIORITY 框架重新确定流(以及响应)的优先级。...等等。
通常浏览器和服务器不会向用户显示这些控制消息,甚至不会在开发人员工具中显示这些消息。 Chrome 允许您使用chrome://net-export
URL 查看它们,或者您可以使用像 Wireshark 这样的网络嗅探工具来查看它们。
然而,最简单的方法之一,也是通过检查原始帧来学习 HTTP/2 的一个非常好的方法是使用 nghttpd 工具(它是 nghttp2 套件的一部分)来创建一个 HTTP/2 服务器,它可以记录在详细模式下运行时发送给它的任何消息,如下所示:
nghttpd -v 443 server.key server.crt
我在我的书中更深入地讨论了如何做到这一点,您可以每天免费在线预览 5 分钟:https://livebook.manning.com/#!/book/http2-in-action/chapter-4/176
我应该说的是,当通过非加密 HTTP/1.1(而不是 HTTPS)连接然后升级到 HTTP/2 时,设置会在 HTTP 标头(称为 HTTP2-Settings)中发送,但这是一种特殊情况,当发送此消息时,消息是 HTTP/1.1 消息。此外,浏览器仅支持 HTTP/2 over HTTPS (for good reasons),我看到您也在使用 HTTPS。所以我会忽略这一点,只是为了完整起见而提及它。
【讨论】:
非常感谢您的解释。我想要做的是我必须在单个帧中发送例如 2000 个设置参数来执行拒绝服务攻击(在我有权执行的服务器上)。为此,我添加了语句 nghttp2_settings_entry iv[2000] = [0 ... 1999] = NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS, 100;但不知何故,它无法创造足够的流量。无论如何,再次感谢,我会照顾你分享的知识。 设置 2000 个并发流不一定会创建 DoS。它只会处理它们以便到达它们。这可能很慢,但其他客户端应该仍然能够连接和处理它们,因为只有那个连接应该被阻止(当然取决于 IIS 如何处理这个,因为我不是 IIS 专家)。 IIS 存在有关 DoS 的问题,由于它处理某些 SETTINGS 帧的方式,它在发送许多 SETTINGS 帧或值时会导致 DoS (zdnet.com/article/…)。 这正是我正在做的事情。 IIS 服务器多个设置框架问题。再次感谢你的帮助。你是救命恩人! NP。如果这回答了问题,那么您应该接受它:***.com/help/someone-answers以上是关于在 nghttp2 示例中看不到 Http-Settings 标头的主要内容,如果未能解决你的问题,请参考以下文章
基于 nghttp2 的最简单、最简单的 HTTP2 服务器示例
在 Hadoop 的 Web 浏览器中看不到 Job History(http://localhost:19888) 页面