在 nghttp2 示例中看不到 Http-Settings header

标签 c http2 nghttp2

我目前正在尝试学习 nghttp2 并尝试执行本页底部提供的客户端代码:

https://nghttp2.org/documentation/tutorial-client.html

我执行了上面的 C 代码,执行了以下操作:

./libevent-client URL

我的服务器是 Windows IIS 10.0,我想在 header 的输出中看到 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协议(protocol)中用于HTTP设置的标签是什么,就像我们有“:method”的方法,“:scheme”方案等。我什至在RFC。

最佳答案

HTTP/2 设置帧不是 HTTP header - 它是在连接开始时发送的单独消息。因此不可能像 HTTP header 那样显示它。

HTTP/2 包含许多这样的不可见控制帧:

  • SETTINGS 框架定义如何使用连接
  • 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 header (称为 HTTP2-Settings )中发送,但这是一种特殊情况,当发送该消息时,该消息是 HTTP/1.1 消息。此外,浏览器仅支持 HTTP/2 over HTTPS ( for good reasons ),我发现您也在使用 HTTPS。所以我会忽略这一点,只是为了完整性而提及它。

关于在 nghttp2 示例中看不到 Http-Settings header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56940660/

相关文章:

c++ - TLS : no application protocol negotiated

google-chrome - httpd-2.4.18 mod_http2 适用于 curl 和 nghttp 但不适用于浏览器

c - 按时间适当缩放模拟

c - C函数中数组的X,Y传递大小

clang 中的代码覆盖率

c - 我无法理解这段代码结构。有人可以解释如何执行这段代码吗?

javascript - Express.js 的 http2 协议(protocol)的最佳选择

Tomcat 是否支持 HTTP/2.0?

node.js - 使用 Express.js 的多个 SSL 证书和 HTTP/2

linux - 通过 nghttp2 使用支持 HTTP\2 的 cURL 连接到 Apple 的 APNS