imjacob的专栏

首页博文目录订阅
正 文

关于远程过程调用RPC

(2009-1-4 20:58)

RPC远程过程调用实例剖析

 Paddy102

 

本文比较详细地介绍了远程过程调用(RPC)的OSF标准在Microsoft VC++中的实现原理, 以及如何使用它们来开发应用程序. 阅读本文你将了解RPC的基本原理, 并将看到如何开发使用RPC进行异种机网络分布式处理的客户机应用程序和服务器应用程序.

 

Para 1. RPC工作原理

RPC是把传统本地过程调用的概念加以扩充后引入分布式环境的一种形式. RPC的形式和行为与传统本地过程调用极为相似, 差别仅在于被调用的procedure(过程)实际运行在与调用者的场点不同的场点上(如图1). 也正是由于这一差别, 我们得通过编写程序来实现两场地之间的连接和信息沟通.

RPC机制的实质是实现OSI七层模型中的会话层功能. 它在两个试图进行通信的场点之间建立一条逻辑信道(即会话连接), 并利用这个信道交换信息, 不用时就释放连接. 下面我们就来看看RPC的通信模型(如下图2):

Client端:

1)     发送远程过程调用的消息(以消息包形式)给远程的server端;

2)     等待, 直到收到server端对该请求的回复;

3)     一旦接收到来自server端的返回执行结果, 就继续执行后面的程序.

Server端:

1)     倾听状态, 等待client端发送过程调用消息;

2)     一旦接收到过程调用消息, server就抽取参数并分析它, 然后执行所请求的过程;

3)     将执行结果以消息包形式回送给client.

至于RPC的具体实现, 我们可以借助下图3来理解:

其中stub是一组RPC机制的操作原语, 这些原语构成了RPC的实现细节, 它可以独立于client、server编程. 下面我们来解说图3的执行过程:

1)     调用者调用本地stub中的一个过程(开始远程过程调用请求).

2)     这个stub过程把有关的参数组装成一个消息包或一组消息包, 形成一条消息. 运行此执行过程的远程场点的IP地址和执行该过程的进程ID号也包含在这条消息中.

3)     将这条消息发送给对应的RPC runtime(RPC运行库)子程序, 由这个子程序将消息发送到远程场点.

4)     在接收到这条消息时, server端的RPC runtime子程序引用与被调用者对应的stub中的一个子程序, 并让它来处理消息.

5)     与被调用者对应的stub中的这个子程序撤卸消息, 解析出相关参数, 并用本地调用方式执行所指定的过程.

6)     返回调用结果, 调用者对应的stub子程序执行return语句返回到用户, 整个RPC过程结束.

实际上, 从上面这个执行过程中, 我们可以看到RPC的实现主要有两个问题需要解决. 一个是在远程过程调用时, 如何定位远程场点; 另外一个就是相关的两个场点必须能协同工作, 所有这些工作对用户都是透明的, 依次执行.

通常在实际编程中, 程序设计者主要负责设计计算过程并实现计算过程体, 而对应的stub由系统生成. 后面我们就要说到Microsoft的RPC实现机制,看看它是如何产生stub的。

Para2. 如何设计好的RPC

对调用双方来说, 传递RPC参数包括辅助处理本地数据表示和网络数据表示的相互转换. 此外, 输入输出参数需要一些存储分配. 同时, RPC中的等待时间也不能忽略.

所以, 一般来说, 应该尽可能降低调用次数. 例如,如果要对一个大数组的每个元素都执行计算, 我们就可以一次调用处理一整行或者整个数组, 而不用每次调用传递一个元素. 这样可以降低有RPC引入的额外开销.

Para3. 应用程序的组件

为了在client和server端使用RPC, 当然少不了client进程和server进程. 另外还有一个名称服务进程, 这个稍后再说.

开发过程大致是这样的:

1)       任何RPC调用都使用一个定义在IDL(interface definition language, 接口定义语言)文件中的接口,         然后MIDL(Microsoft IDL)编译器对IDL文件进行编译, 编译之后会自动生成一个.h文件, 同时生成一个 client stub 和一个server stub. 关于这个你可以在dos下运行midl.exe/?得到更详细的信息.

2)       Client端应用程序使用client stub调用RPC runtime以实现网络上的调用. 接下来RPC运行时使用一组DLL中的一个来实现被使用的特定网络协议.

3)       Server端也与RPC runtime连接. 不过server端应用程序使用一些其它的函数来将自己作为一个特殊接口的服务器进行注册(向谁注册?), 并开始侦听接口的请求.
=============================================

RPC:远程过程调用协议(Remote Procedure Call protocol)

远程过程调用 (RPC)是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC 协议假定某些传输协议的存在,如 TCP 或 UDP,为通信程序之间携带信息数据。在 OSI 网络通信模型中,RPC 跨越了传输层和应用层。RPC 使得开发包括网络分布式多程序在内的应用程序更加容易。

RPC 采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答 信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信 息,最后,客户端调用过程接收答复信息,获得进程结果,然后调用执行继续进行。

目前,有多种 RPC 模式和执行。最初由 Sun 公司提出。IETF ONC 宪章重新修订了 Sun 版本,使得 ONC PRC 协议成为 IETF 标准协议。现在使用最普遍的模式和执行是开放式软件基础的分布式计算环境(DCE)。

协议结构

远程过程调用(RPC)信息协议由两个不同结构组成:调用信息和答复信息。信息流程如下所示:

远程过程调用流程

RPC:远程过程调用流程

RPC 调用信息:每条远程过程调用信息包括以下无符号整数字段,以独立识别远程过程:

  • 程序号(Program number)
  • 程序版本号(Program version number)
  • 过程号(Procedure number)

RPC 调用信息主体形式如下:

struct call_body {
unsigned intrpcvers;
unsigned int prog;
unsigned int vers;
unsigned int proc;
opaque_auth cred;
opaque_auth verf;
1 parameter
2parameter . . .
};

RPC 答复信息:RPC 协议的答复信息的改变取决于网络服务器对调用信息是接收还是拒绝。答复信息请求包括区别以下情形的各种信息:

  • RPC 成功执行调用信息。.
  • RPC 的远程实现不是协议第二版,返回 RPC 支持的最低和最高版本号。
  • 在远程系统中,远程程序不可用。
  • 远程程序不支持被请求的版本号。返回远程程序所支持的最低和最高版本号。
  • 请求的过程号不存在。通常是呼叫方协议或程序差错。

RPC答复信息形式如下:

enum reply_stat stat {
MSG_ACCEPTED = 0,
MSG_DENIED = 1
};

相关链接:
http://www.javvin.com/protocol/rfc1831.pdf:RPC - Remote Procedure Call Protocol Specification Version 2 (ONC version)
http://www.javvin.com/protocol/rfc1057.pdf:RPC - Remote Procedure Call Protocol Specification Version 2 (Sun version)
The IEEE defines RPC in its ISO Remote Procedure Call Specification, ISO/IEC CD 11578 N6561, ISO/IEC, November 1991.



评 论
1楼 52RD网友 发表于 2010-4-29 21:27 回复
非常好 与众不同
博 主
进入imjacob的首页
博客名称:雅克的一府
日志总数:514
评论数量:901
访问次数:1858799
建立时间:2006-11-23 20:52
导 航
公 告
Locations of visitors to this page 本博客主要用于个人学习与资料收藏。当然大家应该读了之后也能学到不少东西。其中大多数资料都是来自网络,我转载时尽可能地表明文章出处与原作者姓名,但由于很多资料经多人转载,已不清楚原作者信息与出处,所以未表明相关…
评 论
链 接

ARM+LINUX 嵌入式博客
http://blog.chinaunix.net/u1/58780/index.html

嵌入式软件
http://blog.csdn.net/embeddedsoft

诚诚恳恳做人踏踏实实编程
http://blog.sina.com.cn/u/1244756857 

和我风格相似的一个blog
http://blogger.org.cn/blog/m…