web-dev-qa-db-ja.com

WebSockets ping / pong、なぜTCP keepalive?

WebSockets オプションがあります 相手にpingを送信します。相手はポンで応答することになっています。

Pingフレームを受信すると、エンドポイントは、既にCloseフレームを受信して​​いない限り、応答としてPongフレームを送信する必要があります。実用的であるとすぐにPongフレームで応答する必要があります。

TCP 同様のものを提供 キープアライブの形式:

[Y]データなしでACKフラグがオンになっているキープアライブプローブパケットをピアに送信します。これは、TCP/IPの仕様により、ACKの重複の一種であり、リモートエンドポイントには引数がありません。TCPはストリーム指向のプロトコルです。一方、 、データとACKが設定されていないリモートホスト(キープアライブをまったくサポートする必要はなく、TCP/IPのみ)から応答を受け取ります。

TCPキープアライブはより効率的だと思います。これは、ユーザー空間までデータを転送したり、WebSocketフレームを解析したり、応答フレームを作成したり、手作業をすることなくカーネル内で処理できるためですそれは送信のためにカーネルに戻され、ネットワークトラフィックも少なくなります。

さらに、WebSockets 明示的に指定されます は常にTCPで実行されます。トランスポート層に依存しないため、TCPキープアライブは常に利用可能です:

WebSocketプロトコルは、独立したTCPベースのプロトコルです。

では、なぜTCP keepaliveの代わりにWebSocket ping/pongを使用したいのでしょうか?

61
Thomas

TCP keepaliveの問題は次のとおりです。

  1. デフォルトではオフです。
  2. Ping/Pongプロトコルが提供するオンデマンドではなく、デフォルトで2時間間隔で動作します。
  3. エンドツーエンドではなく、プロキシ間で動作します。
60
user207421

EJPの答えに加えて、HTTPプロキシメカニズムにも関連していると思います。 Websocket接続は、(HTTP)プロキシサーバーを介して実行することもできます。このような場合、TCPキープアライブは、エンドツーエンド接続ではなく、プロキシまでの接続のみをチェックします。

41
Matthias247

http://www.whatwg.org/specs/web-apps/current-work/multipage/network.html#ping-and-pong-frames

.3.4 PingおよびPongフレーム

WebSocketプロトコル仕様では、キープアライブ、ハートビート、ネットワークステータスプローブ、レイテンシインストルメンテーションなどに使用できるPingおよびPongフレームが定義されています。 。これらは現在APIで公開されていません。

ユーザーエージェントは、たとえばローカルネットワークNATマッピングを維持するため、失敗した接続を検出するため、またはレイテンシメトリックを表示するユーザー。ユーザーエージェントは、サーバーを支援するためにpingや未承諾のピンポンを使用してはなりません。サーバーは、サーバーのニーズに適切な場合はいつでもポンを要請するものと想定されています。

WebSocketはRTCを念頭に置いて開発されているため、ping/pong機能を見ると、レイテンシを測定する方法もわかります。ピンポンがpingと同じペイロードを返さなければならず、タイムスタンプを送信し、クライアントからサーバーへ、またはその逆でレイテンシを計算することが非常に便利になるという事実。

19
vtortola

TCPキープアライブはWebプロキシを通過しません。 Webソケットのping/pongは、Webプロキシを介して転送されます。 TCPキープアライブは、TCPエンドポイント。WebソケットのエンドポイントはTCPエンドポイントと等しくありません。A websocket接続では、2つのwebsocketエンドポイント間で複数のTCP接続を使用できます。

15
mlom