問題タブ [http2]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
http - http2/http1.1 プロキシは Transfer-Encoding をどのように処理しますか?
HTTP/2 では、接続固有のヘッダー フィールドが禁止されています。次のヘッダー フィールドは表示してはなりません: "Connection"、"Keep-Alive"、"Proxy-Connection"、"Transfer-Encoding"、および "Upgrade"。さらに、「TE」ヘッダー フィールドには、「トレーラー」以外の値を含めてはなりません。
HTTP/2 では Transfer-Encoding ヘッダーが禁止されているため、HTTP/2 プロキシはヘッダー Tranfer-Encoding: chunked をどのように処理するのでしょうか?
プロキシは常にチャンクされたリクエスト全体をメモリにキャッシュし、Content-Length ヘッダーを追加して、HTTP/2 サーバー/クライアントに送信する必要がありますか?
http2 - ヘッダー圧縮 (HPack) なしで HTTP2 を実行することは可能ですか?
HTTP2 でサーバー側からヘッダー圧縮を何らかの方法で無効にすることは可能ですか? クライアントからサーバーへの通信とサーバーからクライアントへの通信の両方。たとえば、圧縮テーブルのサイズをゼロに設定するか、何か?おそらく静的テーブルのみを使用していますか?
(これにより、実装が大幅に簡素化されます。これは、HTTP1 の背後にある考え方であるシンプルさとより一致します。HTTP2 のその他の (大きな) 利点は残ります。つまり、HPack は必須ですか?)
編集、わかりやすくするために言い換え...
サーバーから、圧縮を使用しないようにすることはできますか? これは、HTTP2 の複雑な部分の実装を避けるためです。それは不可能だと思います(本質的にHTTP2が遅くなるため)。しかし、おそらくクライアントは、圧縮データの送信を開始する前に(遅いためほとんどありません)、または新しい設定の後に非圧縮送信を再開できる場合に、サーバーからの設定に従う必要があります(おそらく、私は感じます)。
node.js - Chrome から node-http2 サーバーへの HTTP/2 を使用する場合、複数の TCP 接続が表示されます
更新(結果に興味がある人向け:)
chrome と node-http2 サーバーの間の次のプロトコル ネゴシエーションが失敗する理由を理解できませんでした。私の疑いは、自己署名証明書または ALPN/NPN サポートの問題でした。そこで、 golang HTTP/2 実装に移行しました。同じセットアップが完全に機能し、単一の多重化された TCP 接続が表示されます (chrome --> golang)
私は HTTP/2 について読んでいて、ホストごとに単一の多重化された TCP 接続を使用して HTTP/1.1 のレイテンシの問題を解決する方法を読んでいたので、試してみることにしました。
実験
- 1 つの css、1 つの js、およびいくつかの画像への参照を含む単純な html ファイルを作成しました。
- これらすべてのファイルを提供する Node.js の単純な http サーバー
- クロムを使用して http リクエストを作成しました
- Ubuntu で tcptrack ( tcptrack ) を使用して、http サーバーに対して行われている TCP 接続を追跡しました。
tcptrack ウィンドウには、確立された 4 つの接続が表示されます。そのため、ブラウザは画像と css/js リクエストに対して異なる接続を開いています。
tcpdump を使用して同様の出力を取得します。参考までに、使用した tcptrack コマンドは
tcptrack -d -i eth0 -r 3600 ポート 8989
および tcpdump も同様の出力を示します
tcpdump -i eth0 -nns 0 "dst ポート 8989 および tcp[tcpflags] == tcp-syn"
これらのファイルを提供する単純なオールインワン http サーバーは、以下のようなものでした (関連するコード)
この後、http/2 を使用してみました。
- http/2 リクエストを送信するための chrome フラグを有効にしました
- node-http2を使用して http/2 サーバーを作成しました
- 単純な http サーバーは、手順 2 でインストールした http2 サーバー モジュールを使用することを除いて、http/1.1 と同じコードを持っています。
- chrome を使用してリクエストを作成しました (HTTP/2 仕様に準拠した https リクエストである必要がありました)
- キャプチャされた tcptrack/tcpdump 出力
したがって、これはまだ複数の TCP 接続が行われていることを示しています。また、html 内の画像の数を増やすと、接続数が増えます。
ですから、これをどう読んでいいのかわかりません。これは HTTP/2 の動作方法ですか (またはこれはクロムのバグですか)? 単純な http/2 クライアント サーバーを使用して HTTP/2 の利益を視覚化するより良い方法はありますか?
注:私はHTTP / 2サーバーに自己署名証明書を使用しているため、クロムはページに進む前に警告をスローし、閉じられた接続がそれを表している可能性がありますが、ページとそのコンポーネントがプロトコルによって要求される方法に影響を与えるべきではないと思います
これを読んでくださった皆さんの忍耐に感謝し、何か提案があれば感謝します。
シン
PS : Wireshark の TCP キャプチャも例外ではありません。ただ、Wireshark でトラフィックを分離するのが難しいことがわかったので、tcpdump と tcptrack を使用しました。
更新: 更新: chrome://net-internals/ を見ると、HTTP/2 要求のネゴシエーションが失敗し、HTTP/1.1 の使用にフォールバックします。理由はまだわかりません。
Chrome の内部ツール イベントが表示されます
次のプロトコルの値は http/1.1 (next_proto_status および proto) です。しかし、このフォールバックを引き起こしたネゴシエーションで何が失敗したかはわかりませんか? 自己署名証明書が原因でしょうか?
HTTP/2 サーバー コード
firefox - ローカル HTTP/2 プロキシの証明書の生成
安全な HTTP/2 プロキシを使用するために毎晩 Firefox を取得しようとしていますが、自己署名証明書の受け入れを拒否しています。
プロキシは、HTTP/2 フロントエンドとしての nghttp2 と、バックエンドとしての単純な Twisted プロキシで構成されています。Twisted コードはhttps://wiki.python.org/moin/Twisted-Examplesからのもので、HTTP/1.1 プロキシとして単独で動作します。nghttp2 が呼び出されます
https://nghttp2.org/documentation/nghttpx-howto.html#http-2-proxy-modeで指定されているように、Firefox はこれをプロキシとして使用しています。
を使用してlocalhost用のserver.pemを作成しました
プロキシ経由でhttp://www.something.comのような一般的な Web サイトを読み込もうとすると、Firefox は「この接続は信頼されていません」という警告を表示します。ただし、例外を追加して保存するように指示すると、警告が再び表示されます。私が知る限り、nghttp2 フロントエンドを通過して Twisted プロキシに到達することは決してありません。
セキュアプロキシ認証のために何か違うことをしているはずですか? 「Firefox nightly と Chromium の両方で、安全なプロキシに有効な証明書が必要であることに注意してください。」という nghttp2 以外の情報はあまり見つかりません。
jetty - Jetty HTTP/2 クライアント受信サーバー プッシュの例
サーバー プッシュをサポートする Jetty の HTTP/2 クライアントは、Jetty 9.3 RC (リンク) で実装されています。ただし、これに関連するドキュメントやサンプル コードは見つかりませんでした。たとえば、このサイトからプッシュされたリソースを受信するためのサンプルコードを提供できますか: https://nghttp2.org ( http2 サーバープッシュを有効にしたパブリックサーバー)
---UPDATE 1--- sbordet が言ったように、このファイル をテストしようとしました。ただし、この行を実行した後
このエラーに遭遇しました
これが私のpom.xml
そして、ここに私のプロジェクトディレクトリがあります
---更新2---
タグを次のように変更pom.xml
<build>
しました: (明示的に JDK 8 を使用し、-Xbootclasspath を追加して、Jetty が提供する alpn-boot.jar を指すようにします)。Java 8 update 31 を使用しています
このコマンドを実行した後:
https://webtide.com/ (Client.java ファイルのデフォルト ホスト)に接続しようとすると、このエラーが発生しました。
そして、 https://nghttp2.org/に接続するときのこのエラー
---更新 3---
別のアプローチを取る: jetty プロジェクト全体のすべての master ブランチをプルし、次に Intellij プロジェクトを作成すると、jetty.project/jetty-http2/http2-client
パブリック サーバーhttps://webtide.comおよびhttps://nghttp2.orgで機能します。しかし、自己署名証明書 http2 サーバー (仮想マシンに常駐する nghttp2 + nginx を使用) でテストすると、このエラーが発生します。
windows-runtime - WinRT で HTTP/2 エンドポイントを使用する
HTTP/2 / SPDY エンドポイントをヒットし、WP8 または WP8.1 または W8.1 アプリケーションで応答を取得する方法はありますか? 複数の場所を見てきましたが、関連するものは見つかりませんでした。
cloudflare - 応答時間を短縮するために SPDY でリソースのバンドルが必要か
ここでは、バンドルという用語を使用して、HTTP リクエストの数を減らすために JS リソースと CSS リソースを連結することを指します。HTTP/2 は、そもそもリソース バンドル Web 開発のベスト プラクティスを生み出した根本的な問題 (ラウンド トリップ時間、リソース フェッチ ブロック) を解決します。しかし、現在広く展開されている SPDY は、これらの特性を HTTP/2 とどの程度共有しているのでしょうか?
CloudFlare のような SPDY 対応の CDN を使用する場合、レガシー クライアントを気にする必要がなければ、リソースをバンドルする意味はありますか?
リソースの変換はバンドルとは別に行われる可能性があることに注意してください。この質問は主に応答時間に関するものであり、コードのコンパイルに関するものではありません。