Verwalten von Netzwerkverbindungssätzen (Zuordnungen)

Ab Windows 2000 kann die RPC-Laufzeit mehrere Verbindungen zwischen dem Client und dem Server beibehalten. Dadurch wird der Vorgang für Transporte erleichtert, die das Ändern der Clientidentität nicht unterstützen, ohne die Verbindung, multithreadierte Clients und asynchrone Clients erneut einzurichten. Der Satz von Verbindungen zwischen einem Clientprozess und einem Serverendpunkt wird als Zuordnung in der RPC-Terminologie bezeichnet. Das Verständnis von Zuordnungen kann die Implementierung von RPC verbessern.

In einem Einzelthread-Szenario öffnet RPC eine Verbindung zwischen einem Clientprozess und einem Serverendpunkt, um RPC-Aufrufe zu tätigen. Wenn ein synchroner RPC-Aufruf ausgeführt wird, sendet der Client die Anforderung an den Server in dieser Verbindung und empfängt auch die Antwort darauf. Wenn die Anzahl der Threads, die RPC-Aufrufe im Clientprozess tätigen, wächst, kann sich die Sicherheitsidentität des Clients ändern. Wenn asynchrone/Pipe-Aufrufe mit synchronen Anrufen auf dem Client gemischt werden, benötigt RPC möglicherweise mehrere Netzwerkverbindungen. Alle Verbindungen im Satz werden in einem Verbindungspool mit dem Namen "Zuordnung" platziert.

Ein synchroner Remoteprozeduraufruf verwendet ausschließlich eine bestimmte Verbindung, um RPC-Standards zu entsprechen. Eine Verbindung, die von einem synchronen RPC-Aufruf verwendet wird, wird als ausgelastet betrachtet, wenn eine Anforderung gesendet wurde, eine Antwort wurde jedoch nicht empfangen. Für diese Verbindung ist kein anderer Datenverkehr zulässig, bis die Antwort empfangen wird. Die RPC-Laufzeit versucht, multiplex-asynchrone und RPC-Aufrufe in derselben Verbindung zu leiten. Synchrone und asynchrone/pipe-Aufrufe können nicht in derselben Verbindung gemischt werden. Dies bedeutet, dass eine bestimmte Verbindung entweder für synchrone RPC-Aufrufe oder für asynchrone/Pipe-RPC-Aufrufe verwendet werden kann.

RPC versucht aggressiv, Verbindungen aus dem Pool wiederzuverwenden. Wenn ein neuer RPC-Aufruf ausgeführt wird, versucht RPC, eine geeignete Verbindung vom Pool zu finden, und erstellt nur dann eine neue Verbindung, wenn eine geeignete Verbindung nicht gefunden werden kann. Damit eine Verbindung als geeignet betrachtet werden kann, muss sie:

  • Be of the appropriate type (synchron, or asynchron/pipe).
  • Seien Sie kostenlos.
  • Weisen Sie dieselbe Sicherheitsidentität wie das Bindungshandle auf, auf dem der Aufruf ausgeführt wird. Wenn die dynamische Identitätsnachverfolgung verwendet wird, wird die Identität des Bindungshandpunkts am Anfang des Aufrufs vom Threadtoken aktualisiert. Wenn die statische Identitätsnachverfolgung verwendet wird, wird die Clientidentität, die auf dem Bindungshandpunkt stempelt, verwendet.

Wenn der Anruf abgeschlossen ist, wird die Verbindung nach Dem Empfang der Antwort als kostenlos gekennzeichnet und kann für andere RPC-Anrufe verwendet werden.

Die Sicherheitsidentität für eine Verbindung kann nicht geändert werden. Wenn beispielsweise eine große Anzahl von Aufrufen an denselben Server unter verschiedenen Sicherheitsidentitäten vorgenommen wird, wächst die Anzahl der Verbindungen im Threadpool. Die Zuordnung selbst wird referenzgezählt, und wenn alle Verweise nicht mehr vorhanden sind, wird alle Verbindungen beendet und geschlossen. Jeder Bindungshandpunkt und jeder Kontexthandpunkt enthalten einen Verweis auf die Zuordnung. Wenn alle geschlossen sind, verschwindet die Zuordnung. Bei Windows XP werden Zuordnungen nicht unbedingt sofort ausgeblendet. Sie bleiben möglicherweise für einen kurzen Zeitraum (der Zielzeitraum beträgt 20 Sekunden, aber die RPC-Laufzeit kann die Vernichtung der Zuordnung verzögern, wenn keine Threads zur Ausführung der Aufgabe verfügbar sind). Wenn Sie nicht möchten, dass die Zuordnung nach abschluss des letzten Kontexthandpunkts/Bindungshandpunkts lebendig bleibt, verwenden Sie die Option RPC_C_OPT_DONT_LINGER, um die RPC-Runtime zu erzwingen, die Verbindung sofort zu schließen.