RPC 的工作原理

RPC 工具使用户看起来就像客户端直接调用位于远程服务器程序中的过程一样。 客户端和服务器各有其自己的地址空间;也就是说,每个资源都有自己的内存资源分配给过程使用的数据。 下图演示了 RPC 体系结构。

rpc 体系结构

如图所示,客户端应用程序调用本地存根过程,而不是实现该过程的实际代码。 存根被编译并与客户端应用程序链接。 客户端存根代码不是包含实现远程过程的实际代码:

  • 从客户端地址空间检索所需的参数。
  • 根据需要将参数转换为标准 NDR 格式,以便通过网络传输。
  • 调用 RPC 客户端运行时库中的函数,将请求及其参数发送到服务器。

服务器执行以下步骤来调用远程过程。

  1. 服务器 RPC 运行时库函数接受请求并调用服务器存根过程。
  2. 服务器存根从网络缓冲区检索参数,并将其从网络传输格式转换为服务器所需的格式。
  3. 服务器存根调用服务器上的实际过程。

然后,远程过程运行,可能生成输出参数和返回值。 远程过程完成后,类似的步骤序列会将数据返回给客户端。

  1. 远程过程将其数据返回到服务器存根。
  2. 服务器存根将输出参数转换为通过网络传输所需的格式,并将其返回到 RPC 运行时库函数。
  3. 服务器 RPC 运行时库函数将网络上的数据传输到客户端计算机。

客户端通过网络接受数据并将其返回到调用函数,从而完成该过程。

  1. 客户端 RPC 运行时库接收远程过程返回值,并将其返回到客户端存根。
  2. 客户端存根将数据从其 NDR 转换为客户端计算机使用的格式。 存根将数据写入客户端内存,并将结果返回给客户端上的调用程序。
  3. 调用过程继续,就像在同一台计算机上调用该过程一样。

运行时库分为两个部分:与应用程序链接的导入库和 RPC 运行时库(作为动态链接库实现 (DLL) )。

服务器应用程序包含对服务器运行时库函数的调用,这些函数注册服务器的接口并允许服务器接受远程过程调用。 服务器应用程序还包含客户端应用程序调用的特定于应用程序的远程过程。