ブラウザからWebSocket ping / pongフレームを送信する


130

接続を維持するために、websocket内のping / pongメッセージについて読み続けていますが、それらが何かはわかりません。別のフレームタイプですか?(ピンポンに関連するChromeのJavaScript WebSocketオブジェクトのメソッドはありません)。それとも単なる設計パターンですか(たとえば、文字どおり "ping"またはその他の文字列をサーバーに送信して応答させます)。ピンポンは継続フレームに関連していますか?

私が尋ねる理由は、Mongrel2の背後で実行されるpythonフレームワークを使用しているため、Pythonアプリが必要とせずに接続を維持するように指示する特定のping / pongメッセージをMongrel2に送信する方法があるかどうかです。それについて心配してください。別のHTTPメソッドを持っているのに似ていると思います。また、専用のping / pongメッセージフレームは、文字列 "ping"よりも簡単である(サーバーとネットワークの負荷が少ない)と考えられますが、あまり重要ではありません。

編集:私はRFC 6455を見たところ、PingとPongは間違いなく独自のオペコードを持つコントロールフレームタイプであるように見えます。では、ChromeのJavaScriptからPingフレームを送信するにはどうすればよいですか?


サーバーからpingを実行するだけです。誰もが非標準ポートのネットワーク問題について知っているので、彼らは定期的に短い間隔でpingを開始しています。うまく書かれていないサーバーに対してpingを実行することはできると思いますが、機密性の高いことを実行するのは賢明ではないかもしれません。


最初にサーバーから@ user1382306 pingを実行すると、モバイルデバイスのバッテリー使用が非常に速くなります。クライアントからのpingにより、デバイスのバッテリーを節約できます。
ブロンズ男

@ user1382306全員とは限りません!非標準ポートのネットワークの問題は何ですか?
HappyDog 2018

回答:


121

pingフレームを送信したり、pongフレームを受信したりするためのJavaScript APIはありません。これは、ブラウザでサポートされているかどうかのどちらかです。また、ブラウザーがping / pongフレームをサポートし、使用しているかどうかを有効化、構成、または検出するAPIもありません。このためのJavascript ping / pong APIの作成についての議論がありました。将来的にはpingが構成可能/検出可能になる可能性がありますが、JavaScriptがping / pongフレームを直接送受信できる可能性は低くなります。

ただし、クライアントコードとサーバーコードの両方を制御している場合は、より高いレベルでping / pongサポートを簡単に追加できます。メッセージに何らかのメッセージタイプヘッダー/メタデータがない場合は、それが必要になりますが、それは非常に簡単です。毎秒数百回のpingの送信を計画している場合や、数千の同時クライアントを使用している場合を除き、オーバーヘッドはごくわずかです。


1
@bigmugcupリンクが死んでいる
ジョー氏

19

Pingはサーバーからクライアントにのみ送信されることを意図しており、ブラウザはPong OpCodeで自動的にできるだけ早く応答する必要があります。したがって、それを上位レベルで心配する必要はありません。

すべてのブラウザが想定どおりに標準をサポートしているわけではありませんが、そのようなメカニズムの実装にはいくつかの違いがある可能性があり、Pong応答機能がないことを意味する場合さえあります。しかし、個人的に私はPing / Pongを使用しており、低レベルのクライアント側の実装でこのタイプのOpCodeと自動応答を実装していないクライアントを見たことはありません。


73
pingはサーバーからクライアントへのみであることをどこで読みましたか?RFCは、「接続が確立された後、接続が閉じられる前であればいつでも、エンドポイントはPingフレームを送信する可能性があります(MAY)」と述べています。
xryl669 14

7
クライアントが切断状態を自動的に検出するようにしたい場合(RST / FINパケットを受信して​​いないが、ネットワークが切断されている場合)は、クライアントにpingパケットも開始させる必要があります。
pschwamb 2014年

13
RST / FINパケットが受信されなかった場合、TCPは切断を通知しません。TCPは、送信者が切断された接続で送信を試みたときに、ドロップされた接続のみを検出します。pingは多くのアプリケーションでハートビートとして使用されており、有効な用途です。デッド接続は、クライアントが送信を試みるまで、単に永久にデッドのままです。したがって、ブラウザのWebSocketを使用する場合は、カスタムping(またはハートビート)メッセージを使用して、クライアント側のクライアント切断を検出する必要があります。サーバーがpingを試み、クライアントの切断を検出している可能性がありますが、クライアントには通知されません。クライアントのpingも問題ありません。
DDS、

15
RFC 6455、WebSocketプロトコルでは、「注:Pingフレームは、キープアライブとして、またはリモートエンドポイントがまだ応答していることを確認する手段として機能する場合があります。」と明記されています。
DDS

4
ユーザーエージェントが頻繁に更新される場合、サーバーのみのpingが推奨されていた可能性があります。しかし、今では多くのウェブサイトがSPAとして設計されています。この環境では、接続が失われていないことを確認するために、クライアントアプリケーションが定期的にサーバーにpingすることが非常に重要な場合があります。
Noel Abrahams
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.