The WebSocket Connection Close Code

状態符号 (WebSocket)

[1] WebSocket状態符号 (status code) は、 WebSocket接続を閉じる (閉じられた) 理由を示すものです。

[2] HTTP状態符号とは関係ありません。

仕様書

Close フレームの状態符号

[3] Closeフレーム応用データの最初の2バイトは、 (あれば) 状態符号を表します。

Closeフレームを参照。

WebSocket 接続閉じ符号

[30] WebSocket接続閉じ符号 (The WebSocket Connection Close Code) は、 応用が最初に受信した Closeフレームに含まれていた状態符号です。 当該フレーム状態符号を含まない時は、 1005 です。 そのようなフレームが無いまま The WebSocket Connection is Closed となった場合は、 1006 です。 10051006 は、 Closeフレームで使ってはなりません>>12

[31] サーバークライアントはそれぞれ状態符号を送ったり送らなかったりしますが、 両者の認識するWebSocket接続閉じ符号は同じかもしれませんし、違うかもしれません。

CloseEvent インターフェイス code 属性

[80] CloseEvent インターフェイスcode 属性は、WebSocket接続閉じ符号を表します。

[81] この属性は、その属性値として設定された値を返さなければなりません >>77データ型unsigned short で、初期値は 0 です >>77

状態符号の一覧

[42] 次の状態符号が定義されています。

[43] 1004 は、予約されています >>12

[44] 1015 は、TLS handshake に失敗して接続が閉じられたことを示します。 Closeフレームで使ってはなりません>>12 また利用者エージェントは使用しません >>62

[76] 1015 が使われる場面はありません。理論上はサーバーが接続失敗時にログなどで使うのかもしれませんが。。。

[45] 0-999 は、使いません >>12

[46] 1000-2999 は、公開された仕様書で規定されるプロトコルや拡張により、 永続的なものとして利用します >>12

[47] 3000-3999 は、 ライブラリーフレームワーク応用で使うために予約されています。 IANA登録簿に登録できます。 >>12

[48] 4000-4999 は、 私用に予約されています。IANA登録簿に登録できません。 応用間の事前の合意で使うことができます。 >>12

[56] 実際には「予約」として登録されています >>55

[65] 使ってはならない状態符号や予約されている状態符号は、 使ってはならないだけで、使われない保証は無いようです。

[4] WebSocket インターフェイスclose メソッドでは、 10003000-4999 しか認められていません。 それ以外は例外が投げられます。

[53] 状態符号には、IANA登録簿があります >>52, >>55

用途

[10] 現実には、WebSocket状態符号はあまり積極的に利用されていないようにみえます。

[11] 接続失敗の場合について、WebSocket状態符号にはあまり有用な情報は現れません。 特にクライアントについては、セキュリティーのため、 敢えて失敗の詳細な理由がスクリプトに明かされないことになっています。

[13] 従って実質的には正常終了の場合にしか使いようがありませんが、 通常のデータとして送信せずに接続を閉じつつ情報を送らなければならない場面はほとんどありません。 より詳細な情報 (例えば受信したメッセージが不正だった時に、 そのエラーの詳細情報) を含めたいとすると、一応 WebSocket接続閉じ理由もあるとはいえ、 通常のデータで送ってから接続を閉じる方が考えることは少なくて済みます。

歴史

[7] 状態符号や理由は、 Ian Hickson 時代の WebSocket プロトコルには存在しませんでしたが、その後 IETF hybi により追加されました。

[8] [hybi] WebSocket Subprotocol Close Code: Bad Gateway () <https://www.ietf.org/mail-archive/web/hybi/current/msg10748.html>

[9] WebSocket Protocol Registries () <https://www.iana.org/assignments/websocket/websocket.xhtml#close-code-number>

1011 Internal Error [IESG_HYBI] [RFC6455][RFC Errata 3227]

1012 Service Restart [Alexey_Melnikov] [http://www.ietf.org/mail-archive/web/hybi/current/msg09670.html]

1013 Try Again Later [Alexey_Melnikov] [http://www.ietf.org/mail-archive/web/hybi/current/msg09670.html]

1014 The server was acting as a gateway or proxy and received an invalid response from the upstream server. This is similar to 502 HTTP Status Code. [Alexey_Melnikov] [https://www.ietf.org/mail-archive/web/hybi/current/msg10748.html]

1015 TLS handshake [IESG_HYBI] [RFC6455]