管理网络连接集 (关联)

从 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 运行时立即关闭连接。