0

我正在尝试在 C# 中实现一个小型 HTTP/2 服务器以了解协议。我正在运行 Chrome 的最新金丝雀版本(v 45.0.2436.5),但是我似乎无法让客户端协商升级到 HTTP/2 连接。

RFC 声明如下:

在不知道下一跳是否支持 HTTP/2 的情况下请求“http”URI 的客户端使用 HTTP 升级机制([RFC7230] 的第 6.7 节)。客户端通过发出包含带有“h2c”令牌的 Upgrade 标头字段的 HTTP/1.1 请求来执行此操作。

这让我相信第一个请求应该包含一个Upgrade标头,但事实并非如此。这是我收到的请求:

GET / HTTP/1.1
Host: 127.0.0.1:1234
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2436.5 Safari/537.36
HTTPS: 1
Accept-Encoding: gzip, deflate, sdch
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4

谁能向我解释为什么会这样?

提前感谢您的回答!

4

1 回答 1

3

Chrome 没有实现 HTTP/1.1 升级到 HTTP/2。它仅通过 ALPN 在 TLS 上实现 HTTP/2。

Firefox 也是如此。

一般来说,浏览器更喜欢使用 TLS,因为 IETF 和网络总体上正在朝着“一切 TLS”发展。此外,使用 TLS 可以提高连接建立的成功率。由于这些和其他原因,目前还没有浏览器实现明文升级机制(规范没有要求)。

有传言称 Internet Explorer 11 将支持 HTTP/1.1 升级到 HTTP/2,但我不确定它是否已经可用。

同时还有其他(命令行)工具可以执行 HTTP/1.1 升级到 HTTP/2。

例如,nghttp2curl

对于 Java,您可以按照此处的说明使用 Jetty 的 HttpClient 。

我不知道 HTTP/2 C# 客户端,也许您可​​以在此处查看其他实现。

于 2015-06-19T19:29:37.467 回答