web-dev-qa-db-ja.com

HTTP / 2はWebソケットを時代遅れにしますか?

HTTP/2プロトコルについて学んでいます。これは小さなメッセージフレームを含むバイナリプロトコルです。それは単一のTCP接続上のストリーム多重化を可能にします。概念的にはWebSocketと非常によく似ています。

WebSocketを時代遅れにして、それらをある種のヘッダーのないHTTP/2要求とサーバー主導のPushメッセージで置き換える計画はありますか?それとも、WebSocketはHTTP/2を補完するのでしょうか。

198
vbezhenar

私が理解したことからHTTP/2はWebSocketの代わりにはなりませんが、SPDYプロトコルの標準化を目指しています。

HTTP/2では、サーバープッシュは、クライアントによるブラウザからのリソースロードを改善するために、舞台裏で使用されます。開発者として、あなたはあなたの開発の間それを本当に気にしません。ただし、Websocketでは、開発者は独自の全二重接続でメッセージを消費してプッシュすることができるAPIを使用できます。

これらは同じものではありません、そしてそれらはお互いを補完する必要があります。

129
Guillaume D.

HTTP/2 spec を読み終えた後、HTTP/2はほとんどのユースケースで時代遅れのWebソケットではなくなったと思いますが、すべてではないかもしれません。

ここではPush_PROMISE(口語的にサーバープッシュと呼ばれています)は問題になりません。それは単なるパフォーマンスの最適化です。

ブラウザでのWebソケットの主な使用例は、データの双方向ストリーミングを可能にすることです。それで、私はOPの質問がHTTP/2がブラウザで双方向ストリーミングを可能にするより良い仕事をするかどうかになると思う、そして私はそう思う、それがそうすると思います。

まず、bi-diです。 ストリームセクション の紹介を読んでください。

「ストリーム」とは、HTTP/2接続内でクライアントとサーバー間で交換される独立した双方向の一連のフレームです。ストリームにはいくつかの重要な特性があります。

単一のHTTP/2接続には、複数のストリームからのフレームをインターリーブしたエンドポイントを持つ、同時に複数のオープンストリームを含めることができます。

ストリームは一方的に確立して使用することも、クライアントまたはサーバーで共有することもできます。

ストリームはどちらのエンドポイントでも閉じることができます。

this (別の答えでリンクされている)のような記事はHTTP/2のこの側面については間違っています。彼らはそれが双方向ではないと言います。 HTTP/2では起こり得ないことが1つあります。接続が開かれた後、サーバーは通常のストリームを開始できず、Pushストリームのみを開始できるということです。しかし、クライアントがリクエストを送信してストリームを開くと、双方はいつでも永続ソケットを介してDATAフレームを送信できます。

WebSocketとそれほど違いはありません。サーバーがデータを送信できるようになるには、クライアントがWebSocketのアップグレード要求を開始する必要があります。

最大の違いは、WebSocketとは異なり、HTTP/2は独自の多重化セマンティクスを定義することです。つまり、ストリームが識別子を取得する方法と、フレームがそれらが存在するストリームのIDを運ぶ方法です。 HTTP/2は、ストリームに優先順位を付けるためのフロー制御セマンティクスも定義しています。これは、実際のほとんどのBidiのアプリケーションで重要です。

(その間違った記事には、Websocket標準に多重化があるとも書かれています。いいえ、違います。それを見つけるのはそれほど難しいことではありません。Websocketを開いて RFC 6455 )あなたが読んだ後

プロトコルは拡張可能であることを意図しています。将来のバージョンでは、多重化などの追加の概念が導入される可能性があります。

Websocketの多重化のための2013 ドラフトエクステンション があることがわかります。しかし、どのブラウザがサポートしているのかはわかりません。特にHTTP/2が来ると、私はその拡張機能の背後に私のSPA Webアプリケーションを構築しようとはしないでしょう、サポートは決して届かないかもしれません)。

多重化とは、双方向の更新を行う単一ページのアプリを起動するためにWebSocketを双方向で開くたびに、通常は自分で実行する必要があることのことです。私はそれがHTTP/2仕様の中にあることをうれしく思います。

あなたがHTTP/2が何をすることができるかについて知りたいならば、ちょうどgRPCを見てください。 gRPCはHTTP/2にわたって実装されています。 gRPCが提供する半二重および全二重ストリーミングのオプションを特に見てください。 (gRPCは現在ブラウザでは動作しませんが、これは実際にブラウザが(1)HTTP/2フレームをクライアントのjavascriptに公開しないため、および(2)一般的にTrailerをサポートしないためです。 gRPCの仕様

WebSocketにはまだ場所がありますか。 HTTP/2が指定している余分なビットを必要としない場合(それは巨大で複雑な仕様です)、おそらくWebソケットが良いでしょう。実装の難しさについて私たちの手を振って、私はWebSocketプロトコルに従うことが常にHTTP/2より計算量的に安くなるだろうと確信しています - HTTP/2はあなたがもっと多くのことをすることを要求するだけです。

フレームのサイズは非常に似ています。 WebSocketフレームは、HTTP/2の固定値9と比べて、1フレーム当たり2〜14バイトのオーバーヘッドが少し小さくなります。 HTTP/2 2 ^ 24-1ビット/フレーム。それで、あなたがたくさんの儀式なしで何か太ったものを吸うためにソケットを必要とするなら、私は知らない、おそらくビデオフレームかもしれません、そしてそれでもウェブソケットは意味があるかもしれません。ほとんどのユースケース、特にWebページに関連するものでは、HTTP/2は今後の方向性のように見えると思います。

81
masonk

Nay(Websocketは時代遅れではありません)と言います。

最初の、そして最も頻繁に無視される問題は、HTTP/2 Pushは強制可能ではなく、無視される可能性がありますプロキシ、ルーター、他の仲介者、さらにはブラウザによってです。

つまり(HTTP2ドラフトから):

仲介者は、サーバーからプッシュを受信し、クライアントに転送しないことを選択できます。つまり、プッシュされた情報をどのように利用するかは、その仲介者次第です。同様に、仲介者は、サーバーによるアクションなしで、クライアントに追加のプッシュを行うことを選択する場合があります。

また、HTTP/2接続はしばらくすると閉じます。

規格が次のように述べているのは事実です:

HTTP/2接続は永続的です。最高のパフォーマンスを得るには、サーバーとの通信が不要であると判断されるまで(たとえば、ユーザーが特定のWebページから移動するときなど)、またはサーバーが接続を閉じるまで、クライアントは接続を閉じないことが予想されます。

しかし...

サーバーは、可能な限り開いた接続を維持することをお勧めしますただし、アイドル接続の終了は許可されます必要に応じて。いずれかのエンドポイントがトランスポート層TCP接続を閉じることを選択した場合、終端エンドポイントは最初にGOAWAY(6.8節)フレームを送信する必要があります。必要な残りのタスクを終了します。

同じ接続が開いている間にコンテンツをプッシュでき、HTTP/2がHTTP/1.1の「キープアライブ」によって導入されたパフォーマンスの問題の一部を解決したとしても... HTTP/2接続は無期限に開かれたままになりません。

また、一度閉じられると、WebページがHTTP/2接続を再開始することもできません(つまり、長い間引き戻さない限り)。

編集(2017年、2年後)

HTTP/2の実装は、複数のブラウザタブ/ウィンドウが単一のHTTP/2接続を共有することを示しています。つまり、Pushはどのタブ/ウィンドウに属しているかを認識せず、代わりにPush Websocketの場合。

56
Myst

答えはノーだ。両者の目標は大きく異なります。 HTTP/2上のWebSocketのためのRFCさえあり、それは単一のHTTP/2 TCPパイプ上で複数のWebSocket接続を作ることを可能にします。

WS over HTTP/2は、新しい接続を開くための時間を短縮し、ソケット、ソフトIRQ、バッファを増やすことなく、より多くの通信チャネルを可能にすることで、リソースを節約します。

https://tools.ietf.org/html/draft-hirano-httpbis-websocket-over-http2-01

35
bond

さて、 このInfoQ 記事から引用するには:

単純な理由から、答えは明らかに「いいえ」です。前述したように、HTTP/2はサーバーがクライアントキャッシュに積極的にリソースを送信できるようにするサーバープッシュを導入します。ただし、クライアントアプリケーション自体にデータをプッシュダウンすることはできません。サーバープッシュはブラウザによってのみ処理され、アプリケーションコードにポップアップしません。つまり、アプリケーションがこれらのイベントの通知を受け取るためのAPIはありません。

そしてHTTP2 Pushはあなたのブラウザとサーバの間のものであり、Websocketはクライアント(ブラウザ上で実行されている場合はjavascript)とリアルタイムデータを転送するためのアプリケーションコード(サーバ上で実行される)の両方によって使用できるAPIを実際に公開します。

9
Jeet Prakash

メッセージ交換と単純なストリーミング(オーディオ、ビデオストリーミングではない)は、Http/2多重化とWebSocketの両方を介して行うことができます。そのため、いくつかの重複がありますが、WebSocketは確立されたプロトコル、多くのフレームワーク/ API、およびより少ないヘッダーオーバーヘッドを持っています。 これがトピックに関するNiceの記事です

4
Dennis R

HTTP/2にはWebSocket実装があります。 https://tools.ietf.org/html/rfc8441

0
Dzintars