Chrome Canary 不提供 HTTP/2

Chrome Canary does not offer HTTP/2

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

RFC 声明如下:

A client that makes a request for an "http" URI without prior knowledge about support for HTTP/2 on the next hop uses the HTTP Upgrade mechanism (Section 6.7 of [RFC7230]). The client does so by making an HTTP/1.1 request that includes an Upgrade header field with the "h2c" token.

这让我相信第一个请求应该包含 Upgrade header,但它没有。这是我收到的请求:

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

任何人都可以向我解释为什么会这样吗?

提前感谢您的回答!

Chrome 未实施 HTTP/1。1 升级到 HTTP/2。它仅通过 ALPN 在 TLS 上实现 HTTP/2。

Firefox 也是如此。

浏览器通常更喜欢使用 TLS,因为 IETF 和整个网络都在朝着 "everything TLS" 的方向发展。此外,使用 TLS 可以提高连接建立的成功率。 由于这些和其他原因,到目前为止还没有浏览器实现明文升级机制(规范不要求)。

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

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

例如,nghttp2 or curl.

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

我不知道 HTTP/2 C# 客户端,也许你可以看看其他实现 here