ネットワーク接続セットの管理 (関連付け)
Windows 2000 以降では、RPC ランタイムによってクライアントとサーバーの間に複数の接続が維持される場合があります。 これにより、接続、マルチスレッド クライアント、および非同期クライアントを再確立することなく、クライアント ID の変更をサポートしないトランスポートでの操作が容易になります。 クライアント プロセスとサーバー エンドポイントの間の接続のセットは、RPC 用語では 関連付け と呼ばれます。 関連付けを理解すると、RPC の実装を改善できます。
単一スレッドの単一クライアント ID シナリオでは、RPC はクライアント プロセスとサーバー エンドポイントの間に 1 つの接続を開いて RPC 呼び出しを行います。 同期 RPC 呼び出しが行われると、クライアントはこの接続上のサーバーに要求を送信し、応答も受信します。 クライアント プロセスで RPC 呼び出しを行うスレッドの数が増えると、クライアントのセキュリティ ID が変更される可能性があります。 非同期呼び出しまたはパイプ呼び出しがクライアントの同期呼び出しと混在している場合、RPC では複数のネットワーク接続が必要になる場合があります。 セット内のすべての接続は、関連付けと呼ばれる接続プールに配置されます。
同期リモート プロシージャ 呼び出しでは、RPC 標準に準拠するために特定の接続のみが使用されます。 同期 RPC 呼び出しで使用される接続は、要求が送信されたが応答が受信されていない場合はビジーと見なされます。 応答が受信されるまで、その接続で他のトラフィックは許可されません。 RPC ランタイムは、非同期呼び出しとパイプ RPC 呼び出しを同じ接続で多重化しようとします。 同期呼び出しと非同期呼び出しまたはパイプ呼び出しを同じ接続で混在させることはできません。つまり、特定の接続を同期 RPC 呼び出しまたは非同期/パイプ RPC 呼び出しに使用できます。
RPC は、プールからの接続を積極的に再利用しようとします。 新しい RPC 呼び出しが行われると、RPC はプールから適切な接続を見つけようとし、適切な接続が見つからない場合にのみ新しい接続を作成します。 接続を適切と見なすには、次の手順を実行する必要があります。
- 適切な型 (同期、または非同期/パイプ) である。
- 無料です。
- 呼び出しが行われるバインディング ハンドルと同じセキュリティ ID を持ちます。 動的 ID 追跡が使用されている場合、バインディング ハンドルの ID は、呼び出しの開始時にスレッド トークンから更新されます。 静的 ID 追跡を使用する場合は、バインディング ハンドルにスタンプされたクライアント ID が使用されます。
呼び出しが完了すると、応答を受信すると、接続は free としてマークされ、他の RPC 呼び出しに使用できます。
接続のセキュリティ ID は変更できません。 たとえば、同じサーバーに対して多数の呼び出しが異なるセキュリティ ID で行われると、スレッド プール内の接続の数が増えます。 関連付け自体は参照カウントされ、すべての参照がなくなると、すべての接続が停止して閉じられます。 すべてのバインディング ハンドルとすべてのコンテキスト ハンドルは、関連付けの参照を保持します。 すべて閉じると、関連付けは消えます。 Windows XP では、関連付けはすぐに消えるわけではありません。これらは短い期間残る可能性があります (ターゲット期間は 20 秒ですが、タスクを実行できるスレッドがない場合、RPC の実行時間は関連付けの破棄を遅らせることを選択できます)。 最後のコンテキスト ハンドル/バインド ハンドルを閉じた後も関連付けを維持したくない場合は、RPC_C_OPT_DONT_LINGER オプションを使用して、RPC ランタイムに接続を直ちに閉じさせます。