目次 | 前へ | 次へ | Java Remote Method Invocation |
エンドポイントとは、多重プロトコルを使って接続されている 2 人のユーザーの一方を指します。
多重プロトコルは、双方向の、信頼できる既存のバイトストリームの上位層になります。また、このバイトストリームは、エンドポイントの片側が他方に対して開いたものです。現在の RMI の使用法では、これは常に java.net.Socket
オブジェクトを使って作られた TCP 接続です。この接続のことを具象接続と呼びます。
多重プロトコルでは、仮想接続機能を使うことができます。仮想接続は、双方向の信頼できるバイトストリームであり、2 つのエンドポイント間の特定のセッションを表現するものです。2 つのエンドポイント間の 1 つの具象接続上の仮想接続のセットが多重接続を構成します。多重プロトコルを使って、どちらのエンドポイントからでも仮想接続のオープンとクローズが行えます。仮想接続のあるエンドポイントに対する状態は、具象接続上でやり取りされる多重プロトコルの要素により定義されます。この状態には、接続のオープンまたはクローズ、行き来する実際のデータ、および関連するフロー制御メカニズムが含まれます。特にほかの説明がない場合、このセクションのこれ以降の部分では接続という用語は仮想接続の意味で用いられます。
ある多重接続の中の仮想接続は 16 ビット整数で特定され、これを接続識別子と呼びます。したがって、1 つの多重接続上には、最大 65,536 の仮想接続が存在することになります。同時に使用できる仮想接続の数は実装によって制限されることがあります。
OPEN、CLOSE、および CLOSEACK オペレーションは接続を開いたり閉じたりし、REQUEST と TRANSMIT オペレーションは開いた接続上でフロー制御メカニズムの制限下でのデータ伝送に使われます。
仮想接続は、エンドポイントが接続に CLOSE オペレーションを送ったが、まだそれに続く CLOSE または CLOSEACK を受け取っていないときに、そのエンドポイントに対してペンディングクローズの状態にあります。
仮想接続は開かれなかったとき、あるいは CLOSE や CLOSEACK オペレーションを受け取ったときに (そしてそれ以後オープンされていないならば)、その特定のエンドポイントに対してクローズの状態にあります。
各エンドポイントは、それぞれの接続に関して 2 つの状態値を持ちます。1 つ目の状態値は、エンドポイントが何バイトのデータを要求し、そのうちの何バイトをまだ受け取っていないか (入力要求カウント) を示し、2 つ目の状態値は、エンドポイントが何バイトのデータを要求し、その中でこちらのエンドポイントが何バイトを残しているか (出力要求カウント) を示します。
1 つのエンドポイントの出力要求カウントは、もう一方のエンドポイントから REQUEST オペレーションを受けるたびに増加し、TRANSMIT オペレーションを送ると減少します。1 つのエンドポイントの入力要求カウントは、それが REQUEST オペレーションを送ると増加し、TRANSMIT オペレーションを受信すると減少します。どちらかの数値がマイナスになるとプロトコル違反です。
1 つのエンドポイントが、入力要求カウントを、現時点でブロックされることなく処理できるバイト数以上に、増加させてしまうほど大きな REQUEST オペレーションを送ることはプロトコル違反です。しかし、接続しているユーザーがデータを読み込むために待機している状態では、入力要求カウントは必ずゼロ以上の値でなければなりません。
1 つのエンドポイントが、出力要求カウントを超えた TRANSMIT オペレーションを送るのはプロトコル違反です。送出されるデータが、その接続のユーザーが明示的にフラッシュを要求するまで、バッファリングされる可能性があります。明示的なフラッシュ要求、または実装の出力バッファーがいっぱいであるために、その接続を経由してデータを送られなければならない場合は、接続上のユーザーは TRANSMIT オペレーションが十分に進行するまでブロックされる可能性があります。
ここで説明した規則以外でも、適切と判断される範囲内で自由に REQUEST や TRANSMIT オペレーションを実行する実装が可能です。たとえば、エンドポイントは自分の受信バッファーが空でなかったとしても接続に対して追加データを要求できます。
値 |
名前 |
---|---|
0xE1 |
OPEN |
0xE2 |
CLOSE |
0xE3 |
CLOSEACK |
0xE4 |
REQUEST |
0xE5 |
TRANSMIT |
レコードの最初のバイトが上に定義されたオペレーションコード以外のときは、プロトコル違反になります。次のセクションでそれぞれのオペレーションコードに対するレコード形式を説明します。
サイズ (バイト) |
名前 |
説明 |
---|---|---|
1 |
opcode |
オペレーションコード (OPEN) |
2 |
ID |
接続識別子 |
エンドポイントは、OPEN オペレーションを送ることによって、指定された接続を開きます。ID が指示する接続がすでにオープンしていたり、送り側のエンドポイントに対してペンディングクローズの状態でこのコマンドを送ったりするのは、プロトコル違反です。接続がオープンされたあとでは、その接続に対する入力および出力の要求カウントの状態は、両側のエンドポイントでゼロになっています。
OPEN オペレーションの受信は、他端のエンドポイントが指定の接続を開こうとしていることを示します。接続がオープンされたあとでは、その接続に対する入力および出力の要求カウントの状態は、両側のエンドポイントでゼロになっています。
両側のエンドポイントでの識別子の競合を防止するために、有効接続識別子のためのスペースは MSB (Most significat bit) の値によって 2 つに分かれています。それぞれのエンドポイントは、高位ビットが特定の値を持っている場合にだけ、接続を開くことが許されます。具象接続を開始しようとするエンドポイントは、最高位ビットが設定された識別子でだけ接続を開くことができ、他端のエンドポイントは、最高位ビットがゼロに設定された識別子で接続を開かなければなりません。たとえば、サーバーソケットを作成できない RMI アプレットが自分の codebase ホストに対して多重化接続を開始しようとするときは、アプレットは仮想接続を識別子 0x8000-7FFF の範囲で開くことができ、サーバーは識別子の範囲 0-0x7FFF の範囲で仮想接続を開くことができます。
サイズ (バイト) |
名前 |
説明 |
---|---|---|
1 |
opcode |
オペレーションコード (OPEN) |
2 |
ID |
接続識別子 |
エンドポイントは、CLOSE オペレーションを送ることによって、指定の接続を閉じます。ID が指示する接続が現在閉じていたり、送信側に対してペンディングクローズになっているとプロトコル違反になります (この接続に対して CLOSE オペレーションを送っていると、受信側に対してペンディングクローズになっている可能性がある)。CLOSE を送ると、その接続は送信側のエンドポイントに対してペンディングクローズ状態になります。したがって、接続の他端から CLOSE または CLOSEACK を受け取ってからでないと、再度接続を開くことはできません。
CLOSE オペレーションの受信は、接続の他端がその接続を閉じたことを意味し、受信側にとっても接続は閉じられます。受信側エンドポイントは、この接続に対してこれ以上の (再度オープンされないかぎり) オペレーションを行う必要はありませんが、実装の入力バッファーにたまっているデータは、接続のユーザーへ渡さなければなりません。接続がペンディングクローズではなく前もってオープンされているならば、受信側エンドポイントはその接続に対して CLOSEACK で応答する必要があります。
サイズ (バイト) |
名前 |
説明 |
---|---|---|
1 |
opcode |
オペレーションコード (OPEN) |
2 |
ID |
接続識別子 |
エンドポイントは、受信側エンドポイントからの CLOSE を認識したことを知らせるために CLOSEACK オペレーションを送ります。ID が指定する接続の受信側が、このオペレーションを受信したときにペンディングクローズの状態になっていない場合は、プロトコル違反になります。
CLOSEACK オペレーションの受信は、その接続がペンディングクローズからクローズへ状態変化したことを示します。したがって、これ以後はその接続を再オープンできます。
サイズ (バイト) |
名前 |
説明 |
---|---|---|
1 |
opcode |
オペレーションコード (OPEN) |
2 |
ID |
接続識別子 |
4 |
count |
要求された追加バイト数 |
エンドポイントは、REQUEST オペレーションを送ることによって、その接続の入力要求カウントを増加させます。ID が指定する接続が、送信側のエンドポイントから見てオープンされていない場合は、プロトコル違反になります。エンドポイントの入力要求カウントは、count が示す値だけ増加します。count は、符号付きの 32 ビット整数であり、マイナスまたはゼロの場合はプロトコル違反です。
REQUEST オペレーションの受信は、その接続の出力要求カウントを count が示す値だけ増加させます。受信側にとってその接続がペンディングクローズ状態であるときは、いかなる REQUEST オペレーションも無視されます。
サイズ (バイト) |
名前 |
説明 |
---|---|---|
1 |
opcode |
オペレーションコード (OPEN) |
2 |
ID |
接続識別子 |
4 |
count |
伝送バイト数 |
count |
data |
伝送データ |
エンドポイントは、TRANSMIT オペレーションにより、指定の接続を介して実際のデータ伝送を行います。ID が指定する接続が、送信側のエンドポイントから見てオープンされていない場合は、プロトコル違反になります。エンドポイントの出力要求カウントは、count の値だけ減少します。count は、符号付きの 32 ビット整数であり、マイナスまたはゼロの場合はプロトコル違反です。また、TRANSMIT オペレーションで送信側のエンドポイントの出力要求カウントがマイナスになるのも、プロトコル違反です。
TRANSMIT オペレーションの受信は、count バイトのデータがキューに追加され、接続から読める状態になったことを示します。受信側エンドポイントの入力要求カウントは count の値だけ減少します。この結果、入力要求カウントがゼロになり、かつ接続のユーザーがさらにデータを読み込む必要がある場合は、エンドポイントは追加の REQUEST オペレーションで応答しなければなりません。接続が受信側のエンドポイントから見てペンディングクローズならば、いかなる TRANSMIT オペレーションも無視されます。