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 と Web が一般的に「すべて TLS」に向かっているためです。さらに、TLS を使用すると、接続確立の成功率がはるかに高くなります。これらの理由やその他の理由から、これまでのところ、クリアテキスト アップグレード メカニズムを実装したブラウザーはありません (仕様では要求されていません)。

Internet Explorer 11 が HTTP/1.1 から HTTP/2 へのアップグレードをサポートするという噂がありますが、それが既に利用可能かどうかはわかりません。

一方、HTTP/1.1 から HTTP/2 へのアップグレードを実行できる他の (コマンドライン) ツールがあります。

たとえば、nghttp2またはcurlです。

Java の場合、ここで説明されているように、Jetty の HttpClient を使用できます。

HTTP/2 C# クライアントについては知りません。他の実装についてはこちらを参照してください。

于 2015-06-19T19:29:37.467 に答える