Edited at

WebSocketの接続

More than 1 year has passed since last update.


概要

RFCのThe WebSocket Protocol section1-1には以下のように書かれています。

*RFCとは、IETFが管理している、通信の相互接続性を維持するために共通化された仕様書集です。


WebSocketプロトコルは、既存のHTTPをトランスポートとして使用する双方向通信技術です。


つまり、サーバー/クライアント間で、オーバーヘッドの小さい双方向通信を実現するプロトコルです。

HTTPと違ってステートフルな通信であるため、送信先の情報は持ちません。HTTP通信でいう、bodyのみ送信しているようなイメージです。


接続


リクエスト

最初にクライアントから以下のようなリクエストが送信されます。

*RFCのThe WebSocket Protocol section1-2より引用


リクエスト

 GET /chat HTTP/1.1

Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13


ヘッダーの意味

特徴的なヘッダーの意味を説明します。

Upgrade:

指定のプロトコルにアップグレードすることを意味する。

ここでは、HTTPからWebSocketにスイッチすることを意味している。

Sec-WebSocket-Key:

ランダムな文字列からBASE64エンコードした文字列。

サーバーとの通信確立を検証するためのkey

Sec-WebSocket-Protocol:

サブプロトコルを指定する。

WebSocketはソケット通信機能だけを提供するため、どのような形式を使うかはアプリケーションで決める必要がある。

Sec-WebSocket-Version:

WebSocketのバージョンを指定する。

2017/10/13現在はVer13で固定


レスポンス

以下のようなレスポンスが返ってきます。

*RFCのThe WebSocket Protocol section1-2より引用

HTTP/1.1 101 Switching Protocols

Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat


ヘッダーの意味

Sec-WebSocket-Accept:

リクエストヘッダに記載されていたSec-WebSocket-Keyを、決まったルールで変換した文字列。

これによってクライアント/サーバ間の通信確立を検証出来る。

Sec-WebSocket-Protocol:

クライアントがSec-WebSocket-Protocolヘッダにて指定していたサププロトコルの中の一つを選択して返す。


双方向通信の開始

クライアントがSec-WebSocket-Protocolヘッダにて指定したサブプロトコルがサーバーから返ってきたら、双方向通信を開始します。