Web Socketについて(基礎)

Web Socket とは

WebSocket は、クライアント(Webブラウザなど)とサーバーの間で、双方向のリアルタイム通信 を可能にするプロトコルです ( HTTPとは異なるプロトコル

通常の HTTP 通信は「リクエスト → レスポンス」という単方向通信ですが、WebSocket を使うと、クライアントとサーバーが常に接続を維持し、どちらからでもデータを送信できる ようになります。

特徴

持続的な接続(Persistent Connection)

  • 一度接続を確立すると、通信が終了するまで接続を維持。
  • 通常のHTTPリクエストのように、毎回接続を作り直す必要がない。

軽量なプロトコル

  • WebSocketは、HTTPヘッダーが不要なため、通信量が少なく高速
  • 通信のオーバーヘッドが減り、リアルタイム性が向上する。

ポート番号

  • HTTP(80)とHTTPS(443)と同じポートを使用可能
  • ws://example.com(非暗号化)または wss://example.com(TLS暗号化)

WebSocketの動作の流れ

ハンドシェイク(初期接続)

  • クライアントが ws:// または wss:// を使ってサーバーに接続を要求。
  • 通常のHTTPリクエストを利用して WebSocket接続 を開始。
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9YZrdz==  # クライアントが送信
Sec-WebSocket-Version: 13

補足

httpとweb socketは別のプロトコルであるにも関わらず、なぜ、初期接続の時に、httpリクエストがweb socketで使われているのですか?(結局同じプロトコルってこと?

HTTPWebSocket は異なるプロトコルですが、WebSocketの接続(ハンドシェイク)には HTTPリクエストが使われているだけです(ややこしいですが) → 最初はHTTPで、あとから web socketに切り替わるイメージです(web socket通信を開始するために、その最初のプロセスでHTTPを使っているだけ)

WebSocket接続を開始するとき、クライアントは 通常のHTTPリクエスト をサーバーに送信します。このリクエストには、特別なヘッダー Upgrade: websocket が含まれています。

この Upgrade: websocket ヘッダーがポイントです。
これは「通常のHTTP通信からWebSocket通信に切り替えてください」とサーバーに依頼するものです。

サーバーは 101 Switching Protocols というレスポンスを返し、プロトコルをWebSocketに変更します。

■サーバの応答例

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=

この応答を受け取った時点で、HTTPの役割は終了し、以降の通信はWebSocketプロトコルに切り替わります。
つまり、HTTPはWebSocketを開始するためだけに使われ、その後はWebSocketの独自プロトコルでやり取りされる という流れです。