目次|| Java Remote Method Invocation


10.6 RMIの多重プロトコル

多重化の目的は、エンド・ポイントの一方だけがほかの機能(TCP接続など)を使って双方の接続を開くことができる環境において、2つのエンド・ポイントが相互に、他端に対して多重の全二重接続を開くことができるモデルを提供することです。RMIにより、この単純な多重化プロトコルを使って、ほかの方法では不可能な状況においても、クライアントがRMIサーバー・オブジェクトに接続できるようになります。たとえば、アプレット環境のセキュリティ・マネージャの中には、入ってくる接続を受信するためのサーバー・ソケットの作成を禁止して、アプレットがRMIオブジェクトをエクスポートして直接ソケット接続からのリモート呼出しをサービスできないようにするものがあります。アプレットがcodebaseホストへの通常のソケット接続を開くことができる場合には、その接続上で多重プロトコルを使うことにより、そのアプレットがエクスポートしたRMIオブジェクトのメソッドを、codebaseホストが呼び出せるようになります。このセクションでは多重プロトコルの形式と規則を説明します。


10.6.1定義

このセクションでは、後述のプロトコルの説明で使用される用語を定義します。

エンド・ポイントとは、多重プロトコルを使って接続されている2人のユーザーの一方を指します。

多重プロトコルは、双方向の、信頼できる既存のバイト・ストリームの上位層になります。また、このバイト・ストリームは、エンド・ポイントの一方が他方に対して開いたものです。現在のRMIの使用法では、これは常にjava.net.Socketオブジェクトで作られたTCP接続です。この接続のことを具象接続と呼びます。

多重プロトコルでは、仮想接続機能を使用できます。仮想接続は、双方向の信頼できるバイト・ストリームであり、2つのエンド・ポイント間の特定のセッションを表現するものです。2つのエンド・ポイント間の1つの具象接続上の仮想接続のセットが多重接続を構成します。多重プロトコルを使用して、どちらのエンド・ポイントからでも仮想接続のオープンとクローズが行えます。仮想接続の、あるエンド・ポイントに関する状態は、具象接続上でやり取りされる多重プロトコルの要素により定義されます。この状態には、接続のオープンまたはクローズ、行き来する実際のデータ、および関連するフロー制御メカニズムが含まれます。特に他の説明がない場合、この項のこれ以降の部分では接続という用語は仮想接続の意味で使用されます。

ある多重接続の中の仮想接続は16ビット整数で特定され、これを接続識別子と呼びます。したがって、1つの多重接続上には、最大65,536の仮想接続が存在することになります。同時に使用できる仮想接続の数は実装によって制限されることがあります。


10.6.2接続状態とフロー制御

接続は、種々の多重プロトコルにより定義されたオペレーションにより操作されます。プロトコルで定義されたオペレーションには、OPEN、CLOSE、CLOSEACK、REQUEST、およびTRANSMITという名前のものがあります。すべてのオペレーションに関する正確な形式と規則の詳細は「セクション10.6.3プロトコルの形式」に説明されています。

OPEN、CLOSE、およびCLOSEACKオペレーションは接続を開いたり閉じたりし、REQUESTとTRANSMITオペレーションは開いた接続上でフロー制御メカニズムの制限下でのデータ伝送に使われます。


接続状態

仮想接続は、エンド・ポイントがOPENオペレーションをその接続に対して送り、その接続に対するOPENオペレーションを受け取ると(ただし、そのあとにクローズされていない場合)、その特定のエンド・ポイントに対してオープンした状態になります。種々のプロトコル・オペレーションを次に説明します。

仮想接続は、エンド・ポイントが接続にCLOSEオペレーションを送ったが、まだそれに続くCLOSEまたはCLOSEACKを受け取っていないときに、そのエンド・ポイントに対してペンディング・クローズの状態にあります。

仮想接続は開かれなかったとき、あるいはCLOSEやCLOSEACKオペレーションを受け取ったときに(そしてそれ以後オープンされていないならば)、その特定のエンド・ポイントに対してクローズの状態にあります。


フロー制御

多重プロトコルでは、単純パケット・フロー制御メカニズムを使用することにより、同じ具象接続上に複数の仮想接続が同時に存在することが認められます。フロー制御メカニズムにおける高度な要件として、仮想接続の状態は他から独立していなければならないという要件があります。つまり、1つの接続の状態は、他の接続に対して影響を及ぼしません。たとえば、ある接続から入ってくるデータを扱うバッファがいっぱいになったとしても、これが他の接続のデータ伝送やデータ処理を妨げることはありません。このことは、1つの接続の進行が、他の接続の使用の終了に依存する場合に必要です。たとえば、RMIの再帰的な呼出しなどの場合です。したがって、実際問題として、接続の実装は具象接続上に入ってくる多重プロトコル・データ(この仕様を満たしていると仮定して)を常に消費および処理できる必要があります。

各エンド・ポイントは、それぞれの接続に関して2つの状態値を持ちます。1つ目の状態値は、エンド・ポイントが何バイトのデータを要求し、そのうちの何バイトをまだ受け取っていないか(入力要求カウント)を示し、2つ目の状態値は、エンド・ポイントが何バイトのデータを要求し、その中でこちらのエンド・ポイントが何バイトを残しているか(出力要求カウント)を示します。

1つのエンド・ポイントの出力要求カウントは、もう一方のエンド・ポイントからREQUESTオペレーションを受けるたびに増加し、TRANSMITオペレーションを送ると減少します。1つのエンド・ポイントの入力要求カウントは、それがREQUESTオペレーションを送ると増加し、TRANSMITオペレーションを受信すると減少します。どちらかの数値がマイナスになるとプロトコル違反です。

1つのエンド・ポイントが、入力要求カウントを、現時点でブロックされることなく処理できるバイト数以上に、増加させてしまうほど大きなREQUESTオペレーションを送ることはプロトコル違反です。しかし、接続しているユーザーがデータを読み込むために待機している状態では、入力要求カウントは必ずゼロ以上の値でなければなりません。

1つのエンド・ポイントが、出力要求カウントを超えたTRANSMITオペレーションを送るのはプロトコル違反です。送出されるデータが、その接続のユーザーが明示的にフラッシュを要求するまで、バッファリングされる可能性があります。明示的なフラッシュ要求、または実装の出力バッファがいっぱいであるために、その接続を経由してデータを送られなければならない場合は、接続上のユーザーはTRANSMITオペレーションが十分に進行するまでブロックされる可能性があります。

ここで説明した規則以外でも、適切と判断される範囲内で自由にREQUESTやTRANSMITオペレーションを実行する実装が可能です。たとえば、エンド・ポイントは自分の受信バッファが空でなかったとしても接続に対して追加データを要求できます。


10.6.3プロトコルの形式

多重プロトコルのバイト・ストリーム形式は、可変長レコードが隣接して繋がったものです。レコードの最初のバイトは、オペレーション・コードであり、そのレコードに対するオペレーションを明示し、それ以後の内容の形式を決定します。許されるオペレーション・コードは次のとおりです。

名前

0xE1

OPEN

0xE2

CLOSE

0xE3

CLOSEACK

0xE4

REQUEST

0xE5

TRANSMIT

レコードの最初のバイトが上に定義されたオペレーション・コード以外のときは、プロトコル違反になります。次のセクションでそれぞれのオペレーション・コードに対するレコード形式を説明します。


OPENオペレーション

OPENオペレーションの形式を次に示します。

サイズ(バイト)

名前

説明

1

opcode

オペレーション・コード(OPEN)

2

ID

接続識別子

エンド・ポイントは、OPENオペレーションを送ることによって、指定された接続を開きます。IDが指示する接続がすでにオープンしていたり、送り側のエンド・ポイントに対してペンディング・クローズの状態でこのコマンドを送ったりするのは、プロトコル違反です。接続がオープンされたあとでは、その接続に対する入力および出力の要求カウントの状態は、両側のエンド・ポイントでゼロになっています。

OPENオペレーションの受信は、他端のエンド・ポイントが指定の接続を開こうとしていることを示します。接続がオープンされたあとでは、その接続に対する入力および出力の要求カウントの状態は、両側のエンド・ポイントでゼロになっています。

両側のエンド・ポイントでの識別子の競合を防止するために、有効接続識別子のためのスペースはMSB (Most significat bit)の値によって2つに分かれています。それぞれのエンド・ポイントは、高位ビットが特定の値を持っている場合にだけ、接続を開くことが許されます。具象接続を開始しようとするエンド・ポイントは、最高位ビットが設定された識別子でだけ接続を開くことができ、他端のエンド・ポイントは、最高位ビットがゼロに設定された識別子で接続を開かなければなりません。たとえば、サーバー・ソケットを作成できないRMIアプレットが自分のcodebaseホストに対して多重化接続を開始しようとするときは、アプレットは仮想接続を識別子0x8000-7FFFの範囲で開くことができ、サーバーは識別子の範囲0-0x7FFFの範囲で仮想接続を開くことができます。


CLOSEオペレーション

CLOSEオペレーションの形式を次に示します。

サイズ(バイト)

名前

説明

1

opcode

オペレーション・コード(OPEN)

2

ID

接続識別子

エンド・ポイントは、CLOSEオペレーションを送ることによって、指定の接続を閉じます。IDが指示する接続が現在閉じていたり、送信側に対してペンディング・クローズになっているとプロトコル違反になります(この接続に対してCLOSEオペレーションを送っていると、受信側に対してペンディング・クローズになっている可能性がある)。CLOSEを送ると、その接続は送信側のエンド・ポイントに対してペンディング・クローズ状態になります。したがって、接続の他端からCLOSEまたはCLOSEACKを受け取ってからでないと、再度接続を開くことはできません。

CLOSEオペレーションの受信は、接続の他端がその接続を閉じたことを意味し、受信側にとっても接続は閉じられます。受信側エンド・ポイントは、この接続に対してこれ以上の(再度オープンされないかぎり)オペレーションを行う必要はありませんが、実装の入力バッファにたまっているデータは、接続のユーザーへ渡さなければなりません。接続がペンディング・クローズではなく前もってオープンされているならば、受信側エンド・ポイントはその接続に対してCLOSEACKで応答する必要があります。


CLOSEACKオペレーション

CLOSEACKオペレーションのレコード形式を次に示します。

サイズ(バイト)

名前

説明

1

opcode

オペレーション・コード(OPEN)

2

ID

接続識別子

エンド・ポイントは、受信側エンド・ポイントからのCLOSEを認識したことを知らせるためにCLOSEACKオペレーションを送ります。IDが指定する接続の受信側が、このオペレーションを受信したときにペンディング・クローズの状態になっていない場合は、プロトコル違反になります。

CLOSEACKオペレーションの受信は、その接続がペンディング・クローズからクローズへ状態変化したことを示します。したがって、これ以後はその接続を再オープンできます。


REQUESTオペレーション

REQUESTオペレーションのレコード形式を次に示します。

サイズ(バイト)

名前

説明

1

opcode

オペレーション・コード(OPEN)

2

ID

接続識別子

4

count

要求された追加バイト数

エンド・ポイントは、REQUESTオペレーションを送ることによって、その接続の入力要求カウントを増加させます。IDが指定する接続が、送信側のエンド・ポイントから見てオープンされていない場合は、プロトコル違反になります。エンド・ポイントの入力要求カウントは、countが示す値だけ増加します。countは、符号付きの32ビット整数であり、マイナスまたはゼロの場合はプロトコル違反です。

REQUESTオペレーションの受信は、その接続の出力要求カウントをcountが示す値だけ増加させます。受信側にとってその接続がペンディング・クローズ状態であるときは、いかなるREQUESTオペレーションも無視されます。


TRANSMITオペレーション

TRANSMITオペレーションのレコード形式を次に示します。

サイズ(バイト)

名前

説明

1

opcode

オペレーション・コード(OPEN)

2

ID

接続識別子

4

count

伝送バイト数

count

data

伝送データ

エンド・ポイントは、TRANSMITオペレーションにより、指定の接続を介して実際のデータ伝送を行います。IDが指定する接続が、送信側のエンド・ポイントから見てオープンされていない場合は、プロトコル違反になります。エンド・ポイントの出力要求カウントは、countの値だけ減少します。countは、符号付きの32ビット整数であり、マイナスまたはゼロの場合はプロトコル違反です。また、TRANSMITオペレーションで送信側のエンド・ポイントの出力要求カウントがマイナスになるのも、プロトコル違反です。

TRANSMITオペレーションの受信は、countバイトのデータがキューに追加され、接続から読める状態になったことを示します。受信側エンド・ポイントの入力要求カウントはcountの値だけ減少します。この結果、入力要求カウントがゼロになり、かつ接続のユーザーがさらにデータを読み込む必要がある場合は、エンド・ポイントは追加のREQUESTオペレーションで応答しなければなりません。接続が受信側のエンド・ポイントから見てペンディング・クローズならば、いかなるTRANSMITオペレーションも無視されます。


プロトコル違反

上述したプロトコル違反が発生した場合、または具象接続で通信エラーが発生した場合は、多重接続はシャットダウンされます。実際の接続が終了し、すべての仮想接続も即時に閉じられます。仮想接続上ですでに読込み可能になっていたデータは接続のユーザーによって読みとり可能です。



目次||
Copyright © 1997,2006, Oracle and/or its affiliates. All rights reserved.