1. ホーム
  2. websocket

80以外のポートでWebSocketを使用しますか?

2023-12-12 05:07:40

質問

80 以外のポートで WebSocket を使用しなければなりませんか? それは、既存の Web/HTTP インフラストラクチャを使用する目的全体を台無しにしますか? そして、それはもはや名前にふさわしくないと思います。 Web 80 以外のポートでソケットを使用します。

他のポートで WebSocket を使用する場合、なぜ TCP を直接使用しないのでしょうか?あるいは、WebSocket プロトコル自体に何か特別な利点があるのでしょうか。

また、現在の WebSocket のハンドシェイクは HTTP UPGRADE リクエストの形式なので、WebSocket のハンドシェイクを達成できるように、ポートで HTTP プロトコルを有効にしなければならないということでしょうか?

どのように解決するのですか?

80 以外のポートで WebSocket を使用しますか? それは、既存の Web/HTTP インフラストラクチャを使用する目的全体を台無しにしますか? 既存の Web/HTTP インフラストラクチャを使用するという目的を台無しにしてしまうのでしょうか? そして、それはもはや 80 以外のポートで WebSocket という名前はもはやふさわしくありません。

ホスト OS が許可し、クライアントが接続を許可される任意のポートで、WebSocket サーバーを実行することができます。

しかし、ポート 80 (または 443) で実行することには、多くの利点があります。

  1. ネットワーク インフラストラクチャは一般に、クライアントが生活する場所 (デスクトップ コンピュータ、モバイル デバイスなど) からサーバーが生活する場所 (データ センターなど) への送信接続用に、ポート 80 で既に展開され開かれています。 したがって、ポート80でWebSocketアプリを展開するために、ファイアウォールやルーターの設定などに新たな穴をあける必要は通常ありません。 異なるポートで実行するには、設定の変更が必要な場合があります。 たとえば、多くの大企業ネットワークは、どのポートでアウトバウンド接続を行うことができるかについて非常にうるさいですし、特定の標準的で期待される動作に対してのみ設定されます。 WebSocket 接続に非標準のポートを選択することは、一部の企業ネットワークから許可されない場合があります。 これは、ポート 80 を使用する大きな理由です (ロックダウンされた設定を持つプライベート ネットワークからの最大の相互運用性)。

  2. ブラウザから実行される多くの WebSocket アプリは、ホスト Web ページのポート 80 ですでに使用されている既存のセキュリティ/ログイン/認証のインフラストラクチャを活用することを望んでいます。 WebSocket 接続の認証を確認するためにそのまったく同じインフラストラクチャを使用することは、すべてが同じポート上にある場合、より単純になる可能性があります。

  3. WebSocket 用のいくつかのサーバー インフラストラクチャ (node.js の socket.io など) は、HTTP リクエストと WebSocket の両方をサポートするために、結合したサーバー インフラストラクチャ (単一のプロセス、単一のリスナー) を使用しています。 これは、両方が同じポート上にある場合、よりシンプルになります。


他のポートで WebSocket を使用する場合、TCP を直接使用すればよいのではないでしょうか。または WebSocket プロトコル自体に何か特別な利点があるのでしょうか。

WebSocket プロトコルは、もともとブラウザからサーバーにアクセスするために定義されたものです。 ブラウザからの一般的な TCP アクセスはないので、ブラウザのカスタム アドオンなしで永続的なソケットが必要な場合は、WebSocket が提供されます。 プレーンなTCP接続と比較して、webSocketプロトコルはHTTP認証とクッキーを活用する能力、アプリレベルとエンドツーエンドのキープアライブPing/Pongを行う標準方法(TCPはホップレベルのキープアライブを提供しますがエンドツーエンドではありません)、組み込みのフレームプロトコル(TCPでは独自のパケットフォーマットを設計しなければなりません)とこれらの上位機能をサポートする多くのライブラリが提供されています。 基本的に、webSocket は TCP よりも高いレベルで動作し(TCP を隠れて使用)、ほとんどの人が便利だと感じる組み込み機能をより多く提供します。 例えば、TCPを使う場合、最初にしなければならないことの1つは、プロトコル(データを表現する手段)を取得または設計することです。 これは、webSocket にはすでに組み込まれています。

そして、現在のWebSocketのハンドシェイクはHTTP UPGRADE リクエストの形式であるため、WebSocket ハンドシェイクが達成できるように、ポートで HTTP プロトコルを有効にする必要があるということでしょうか。 WebSocket のハンドシェイクが達成できるように、ポートの HTTP プロトコルを有効にする必要があるということですか?

すべての WebSocket リクエストは HTTP リクエストで始まるので、WebSocket を使用したいポートで実行されている HTTP サーバーがなければなりません。 これは、すべての WebSocket リクエストが HTTP リクエストで始まるためです。これは、大きく機能する HTTP サーバーである必要はありませんが、最初の HTTP リクエストを処理する必要があります。