目次|前|次 | 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オペレーションも無視されます。