[14] [[WebSocket]] の[DFN[[RUBYB[接続]@en[connection]]]]は、
[[TCP]] または [[TLS]] over [[TCP]] 上に確立された[[WebSocketクライアント]]と
[[WebSocketサーバー]]との間の[[転送路]]です。

* 仕様書

[REFS[
- [4] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-05-06 10:42:35 +09:00]] 版) <https://html.spec.whatwg.org/#dom-websocket-readystate>
]REFS]

* 状態

[5] [[接続][HTTP接続]]は、通常の[[HTTP接続]]の状態に加え、次の状態を持ちます。
[FIG(list members)[
:種類:[[WebSocketクライアント]]か[[WebSocketサーバー]]のいずれかです。
:接続の状態:[CODE(DOMa)@en[[[readyState]]]] [[属性]]に相当する実際の接続の状態です。
:[[バッファー]]:送信待ちのデータです。
:不完全なメッセージ:断片化された[[フレーム]]の到着待ちの受信データです。
:[[WebSocket接続失敗]]:[[WebSocket接続失敗]]として処理されたかどうかのフラグです。
:[[flagged as full]]:
:[[[CODE[Close]]フレーム]]送信済み:
:[[[CODE[Close]]フレーム]]受信済み:
]FIG]

[10] [[クライアント]]は ([CODE(DOMi)@en[[[WebSocket]]]] [[オブジェクト]]は)、
更に次の状態を持ちます。
[FIG(list members)[
:[[クライアント指定プロトコル群]]: 構築時に指定された[[部分プロトコル]]のリストです。
: [F[URL][url (WebSocket)]] :接続先の [[URL]] です。
:[CODE(DOMa)@en[[[readyState]]]]:接続の状態と同じですが、[[イベントループ]]の処理に合わせて若干の遅延があるかもしれません。
:[CODE(DOMa)@en[[[extensions]]]]:利用中の[[WebSocket拡張]]を示す文字列です。
:[CODE(DOMa)@en[[[protocol]]]]:利用中の[[部分プロトコル]]を示す文字列です。
:[CODE(DOMa)@en[[[bufferedAmount]]]]:[[バッファー]]の大きさを表しますが、[[イベントループ]]の処理に合わせて若干の遅延があるかもしれません。
:[CODE(DOMa)@en[[[binaryType]]]]:
]FIG]

[15] [[アプリケーション]]は、更に独自の状態を保持するかもしれません。
その中には [[TCP]]/[[TLS]] や [[WebSocket handshake]] で得られた情報
(例えば [[IPアドレス]]、[[TLS証明書]]、[[HTTP認証]]データ、[[Cookie]]、
[CODE(HTTP)@en[[[Accept-Language:]]]] など) も含まれるかもしれません。

* [CODE(DOMi)@en[WebSocket]] インターフェイス [CODE(DOMa)@en[readyState]] 属性

[6] [CODE(DOMi)@en[[[WebSocket]]]] [[インターフェイス]]の
[DFN[[CODE(DOMa)@en[[[readyState]]]]]] [[属性]]は、
[[WebSocket接続]]の状態を表します。

[7] [CODE(DOMi)@en[[[WebSocket]]]] [[インターフェイス]]には
4つの [CODE(IDL)@en[[[unsigned short]]]] [[型]]の[[定数]]が定義されています [SRC[>>4]]。
そのいずれかを返すことになっています。

[FIG(list)[
:[CODE(DOMc)@en[[[CONNECTING]]]] ([CODE[[[0]]]]):
[[接続]]がまだ確立されていないことを表します [SRC[>>4]]。
:[CODE(DOMc)@en[[[OPEN]]]] ([CODE[[[1]]]]):
[[接続]]が確立され通信できることを表します [SRC[>>4]]。
:[CODE(DOMc)@en[[[CLOSING]]]] ([CODE[[[2]]]]):
[[接続]]の [[closing handshake]] が進行中か
[CODE(DOMm)@en[[[close]]]] が呼び出されたことを表します [SRC[>>4]]。
:[CODE(DOMc)@en[[[CLOSED]]]] ([CODE[[[3]]]]):
[[接続]]が閉じられたか開けなかったことを表します [SRC[>>4]]。
]FIG]

[9] これらの[[属性値]]の変更は、[[WebSocket接続の確立]]や
[[WebSocket接続を閉じる]]の処理の中で行われます。

[8] これらの定数は [[HTML Standard]] で規定されています。
[[RFC 6455]] でも定数名は言及されていますが、それが何であるかは全く説明がありません。

[11] [[WebSocket]] と[[スクリプト]] ([[イベントループ]]) は別個に動作します。
[[WebSocket接続]]の状態としてプロトコル側が保持している値と
[CODE(DOMa)@en[[[readyState]]]] 属性値は、更新されるタイミングが異なることがあります。

[12] [[[CODE(DOMi)@en[WebSocket]]のごみ収集]]は、[[event loop step 1]]
時点での [CODE(DOMi)@en[[[readyState]]]] の状態によって処理します。

;; [13] [[event loop step 1]] 開始前に[[ごみ収集]]可能か検査しても良いとも解釈できます。

* 接続の確立

[1] [[WebSocket接続の確立]]を参照。

* データの送受信

[3] [[WebSocketソケット]]、[[データソケット]]を参照。

* 接続の切断

[2] [[WebSocket接続を閉じる]]を参照。

* 下位層

[16] [[WebSocket]] の下位層としては、 [[TCP]] または [[TLS]] over [[TCP]]
を用いることになっています。

[17] ただし [[TCP]] そのものではなく、[[プロキシ]]への接続 ([[SOCKS]] や [[HTTP]] など)
が使われる可能性もあります。

;; [18] [[WebSocket接続の確立]]や [[HTTP接続]]も参照。

[19] [[TLS]] の利用方法は、 [[HTTPS]] と同じです。

;; [20] [[RFC]] は [[TLS handshake]] のみ [[HTTPS]] と同じと規定しており、
それ以外には言及していません。しかし他の部分も [[HTTPS]] と同様に処理するべきと思われます。

[21] [[TCP]] の利用方法は、 [[WebSocket接続を閉じる]]際の処理が規定されている他は明確になっていません。
例えば [[TCP]] [[緊急データ]]をどう扱うべきかは不明です。

;; [22] [[HTTP接続]]も参照。
