web-dev-qa-db-ja.com

TCPソケットとWebソケットの違い、もう一度

TCPソケットとwebsocketの違いをできる限り理解しようとすると、これらの質問に役立つ情報がたくさん見つかりました。

等々...

私の調査では、この文を wikipedia で読みました。

WebsocketはTCPとは異なり、バイトストリームではなくメッセージストリームを有効にします

私はそれが正確に何を意味するのか完全にはわかりません。あなたの解釈は何ですか?

124
PierrOz

通常のTCPソケットを使用してバッファーからバイトを送信すると、送信関数は送信されたバッファーのバイト数を返します。非ブロッキングソケットまたは非ブロッキング送信の場合、送信されるバイト数はバッファーのサイズよりも少ない場合があります。ブロッキングソケットまたはブロッキング送信の場合、返される数値はバッファーのサイズと一致しますが、呼び出しがブロックされる場合があります。 WebSocketsでは、sendメソッドに渡されるデータは常に「メッセージ」全体として送信されるか、まったく送信されません。また、ブラウザーのWebSocket実装は、送信呼び出しをブロックしません。

しかし、物事の受け取り側により重要な違いがあります。受信者がTCPソケットでrecv(または読み取り)を行う場合、返されるバイト数が送信側での単一の送信(または書き込み)に対応するという保証はありません。それは同じかもしれませんし、それよりも少ないかもしれません(またはゼロ)かもしれませんし、さらに大きいかもしれません(その場合、複数の送信/書き込みからのバイトが受信されます)。 WebSocketでは、メッセージの受信はイベント駆動型であり(通常、メッセージハンドラルーチンを登録します)、イベントのデータは常に相手側が送信したメッセージ全体です。

TCPソケットを使用してメッセージベースの通信を行うことができますが、元のメッセージを断片から再構築できるように、フレーミング/メッセージ境界データをメッセージに追加する追加のレイヤー/カプセル化が必要です。 。実際、WebSocketは通常のTCPソケット上に構築され、各フレームのサイズを含むフレームヘッダーを使用して、どのフレームがメッセージの一部であるかを示します。 WebSocket APIは、データのTCPチャンクをフレームに再アセンブルして、メッセージごとにメッセージイベントハンドラーを呼び出す前にメッセージにアセンブルします。

179
kanaka

WebSocketは基本的に、メッセージ指向のアプリケーションプロトコル(ISO/OSIネットワークスタックを参照)であり、はトランスポート層としてTCPを使用します。

WebSocketプロトコルの背後にある考え方は、クライアントとサーバー間の確立されたTCP接続を再利用することです。 HTTPハンドシェイクの後、クライアントとサーバーはWebSocketエンベロープを交換することによりWebSocketプロトコルを話し始めます。 HTTPハンドシェイクは、クライアントと一部のサービスを提供するサーバーとの間の障壁(ファイアウォールなど)を克服するために使用されます(通常、ポート80は誰でもどこからでもアクセスできます)。クライアントとサーバーは、同じTCP接続(決して解放されない)を利用して、いつでもHTTPの切り替えを切り替えることができます。

背後で、WebSocketは一貫したエンベロープ/メッセージでTCPフレームを再構築します。全二重チャネルは、サーバーがプッシュするためにサーバーによって使用されます更新を非同期的にクライアントに向けます:チャネルは開いており、クライアントはfutures/callbacks/promisesを呼び出して、非同期WebSocketが受信したメッセージを管理できます。

簡単に言えば、WebSocketはTCP(信頼性のあるトランスポート層、フレーム単位)上に構築された(HTTP自体のような)高レベルプロトコルであり、JSクライアント(以前はWebSocketが実装される前に、サーバーから更新を取得する _コメットおよびロングポーリング手法が使用されました。Stackoverflowの投稿を参照してください: ターンベースゲームサーバーのWebソケットとロングポーリングの違い

120
Paolo Maresca