WebSocket

ブラウザとサーバー間で全二重(双方向)通信を実現するプロトコル。単一のTCPコネクション上で、HTTPのリクエスト/レスポンス方式と異なり、両側から任意のタイミングでメッセージを送受信できる。仕様はRFC 6455で定義されている。 #protocol #web

ハンドシェイク

最初はHTTPのGETリクエストとして開始する。クライアントはUpgrade: websocketヘッダーとランダムなSec-WebSocket-Keyを送り、サーバーは101 Switching Protocolsと、そのキーに固定GUIDを連結してSHA-1・Base64エンコードしたSec-WebSocket-Acceptを返す。以後はHTTPではなくWebSocket独自のフレーム形式で通信する。80/443番ポートで動作しHTTPプロキシとの親和性を保てるよう設計されている。

フレーム構造

  • FINビット: メッセージの最終フラグメントかどうか
  • Opcode(4bit): 0x1=テキスト、0x2=バイナリ、0x8=クローズ、0x9=Ping、0xA=Pong
  • MASKビット: クライアント→サーバー方向は必須。ペイロードをマスクすることでキャッシュポイズニング攻撃を防ぐ
  • ペイロード長: 0〜125byteは直接、126なら16bit、127なら64bitで拡張長を表現

Ping/Pongとクローズ

Ping(0x9)を受け取った側は同じペイロードでPong(0xA)を返し、接続の生存確認とレイテンシ計測に使う。切断時はどちらかがクローズフレーム(0x8、16bitのステータスコード付き)を送り、相手も応答クローズフレームを返してからTCP接続を閉じる(1000=正常終了など)。

ユースケース

チャット、リアルタイム通知、共同編集ツール、ゲーム通信、株価配信など。将来的にはバックプレッシャー対応や非順序配信を持つWebTransport(HTTP/3QUICベース)が一部用途を置き換える見込み。

関連

出典

作成日時: 2026-08-12 20:41 / 更新日時: 2026-08-12 20:47