3.1. 【拡張仕様】 WebSocket トランスポート

本拡張仕様では、iSCPの下位層のトランスポートプロトコルとして RFC6455 で規定される WebSocket を使用した場合の仕様について規定します。

3.1.1. シーケンス

3.1.1.1. 接続開始

はじめに、クライアントはサーバーに対して、WebSocket のコネクションを確立します。

3.1.1.2. メッセージの送受信

すべての iSCP メッセージは、WebSocket メッセージのペイロードに格納して送信されなければなりません。 このとき、1つの WebSocket メッセージにつき、1つの iSCP メッセージを格納する必要があります。

本規定においては、いずれの QoS についても、信頼性のあるトランスポートを用いて実現します。 よって、 QoS=UNRELIABLE のストリームにおいても、コネクションが継続している間の伝送欠損は発生しません。

3.1.1.3. 接続終了

クライアントおよびサーバーは、接続を切断する際に Disconnect メッセージを送信します。 Disconnect メッセージを受信したクライアントおよびサーバーは、WebSocket のコネクションを切断します。 Disconnect メッセージを送信したクライアントおよびサーバーは、WebSocket のコネクションが切断されるのを待機します。 妥当な時間が経過してもコネクションが切断されない場合は、 WebSocket コネクションを切断します。

3.1.2. メッセージ境界

メッセージ境界は、WebSocket プロトコルにより特定されるため、本規定はメッセージの境界づけの方法を提供しません。

3.1.3. メッセージ分割

WebSocket の最大メッセージ長が十分に長いため、本規定はメッセージ分割の方法を提供しません。

3.1.4. エンコーディング

バイナリで表現されるエンコーディングを使用する場合は、Binary タイプのフレームを使用して送信しなければなりません。 テキストで表現されるエンコーディングを使用する場合は、Text タイプのフレームを使用して送信しなければなりません。 なお、 Text タイプのフレームを使用する場合は、 RFC 6455 に則り、 UTF-8 の文字エンコーディングを使用しなければなりません。

3.1.5. 事前ネゴシエーション

本拡張仕様では、事前ネゴシエーションのためにクエリ文字列を使用します。

3.1.5.1. クエリ文字列で使用できる値

クエリ文字列には以下を使用する事ができます。

表 87 クエリ文字列で使用できる値

クエリ名

内容

enc

エンコーディング名。省略された場合は、サーバーが指定するデフォルト値が使用されます。(例: proto)

comp

圧縮のタイプ名。省略された場合は、圧縮を使用しません。(例: per-message, context-takeover)

clevel

圧縮レベル。省略された場合は、デフォルト値を使用します。(例: 1, 2, ... 9)

cwinbits

context-takeover 圧縮時のウィンドウサイズ。省略された場合は、デフォルト値を使用します。(例: 8, 9, ... 15)

以下に、クエリ文字列の例を示します。

表 88 クエリ文字列の例

?enc=proto&comp=per-message&clevel=6

?enc=proto&comp=context-takeover&clevel=6&cwinbits=15

?enc=proto

なお、同一のクエリ文字列は、複数送信してはいけません。 ブローカーが同一のクエリ文字列を複数を受け取った場合は、 400 Bad Request を返却します。

3.1.5.2. ブローカーからの応答

ノードが指定したクエリ文字列に、ブローカーが対応できない場合は 406 Not Acceptable を返却してコネクションを切断します。 問題なく受け入れが可能な場合は、 101 Switching Protocols を返却して、後続の処理に移ります。