Управление наборами сетевых подключений (ассоциации)
Начиная с Windows 2000, время выполнения RPC может поддерживать несколько подключений между клиентом и сервером. Это упрощает работу с транспортами, которые не поддерживают изменение удостоверения клиента без повторной установки подключения, многопоточных клиентов и асинхронных клиентов. Набор соединений между клиентским процессом и конечной точкой сервера в терминологии RPC называется связью . Понимание связей может улучшить реализацию RPC.
В сценарии однопотокового удостоверения с одним клиентом RPC открывает одно подключение между клиентским процессом и конечной точкой сервера для выполнения вызовов RPC. При синхронном вызове RPC клиент отправляет запрос серверу в этом подключении и получает ответ на него. Когда число потоков, выполняющих вызовы RPC в клиентском процессе, увеличивается, удостоверение безопасности клиента может измениться. Если асинхронные вызовы или вызовы канала смешиваются с синхронными вызовами на клиенте, RPC может потребоваться несколько сетевых подключений. Все подключения в наборе помещаются в пул соединений, называемый ассоциацией.
Синхронный удаленный вызов процедуры использует только заданное подключение для соответствия стандартам RPC. Соединение, используемое синхронным вызовом RPC, считается занятым, если запрос был отправлен, но ответ не получен. Никакой другой трафик на этом подключении не разрешен до получения ответа. Время выполнения RPC пытается мультиплексировать асинхронные и конвейерные вызовы RPC при одном подключении. Синхронные и асинхронные вызовы не могут быть смешанными при одном соединении. Это означает, что данное подключение можно использовать как для синхронных вызовов RPC, так и для асинхронных вызовов RPC.
RPC активно пытается повторно использовать подключения из пула. При выполнении нового вызова RPC RPC пытается найти подходящее подключение из пула и создает новое подключение только в том случае, если не удается найти подходящее подключение. Чтобы подключение считалось подходящим, оно должно:
- Соответствующий тип (синхронный или асинхронный или конвейерный).
- Будьте свободны.
- Иметь то же удостоверение безопасности, что и дескриптор привязки, на котором выполняется вызов. Если используется динамическое отслеживание удостоверений, удостоверение дескриптора привязки обновляется из маркера потока в начале вызова. Если используется статичное отслеживание удостоверений, используется удостоверение клиента, помеченное на дескрипторове привязки.
После завершения вызова после получения ответа подключение помечается как бесплатное и может использоваться для других вызовов RPC.
Удостоверение безопасности при подключении не может измениться. Например, если большое количество вызовов к одному и тому же серверу выполняется с разными удостоверениями безопасности, количество подключений в пуле потоков увеличивается. Сама связь учитывается, и когда все ссылки отсутствуют, она останавливается и закрывает все соединения. Каждый дескриптор привязки и каждый дескриптор контекста содержат ссылку на связь. При закрытии всех связей связь исчезает. В Windows XP связи не обязательно исчезают немедленно; они могут оставаться в течение короткого периода (целевой период составляет 20 секунд, но время выполнения RPC может отложить уничтожение связи, если для выполнения задачи нет потоков). Если вы не хотите, чтобы связь оставалась активной после закрытия последнего дескриптора контекста или дескриптора привязки, используйте параметр RPC_C_OPT_DONT_LINGER, чтобы среда выполнения RPC немедленно закрыла подключение.