首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

浅谈rpc(远程过程调用)(3)

浅谈rpc(远程过程调用)(3)

服务器可以因为版本原因或认证原因拒绝请求,下面是拒绝消息的格式:
union rejected_reply switch (reject_stat stat) {
case RPC_MISMATCH:
struct {
unsigned int low;
unsigned int high;
} mismatch_info;
case AUTH_ERROR:
auth_stat stat;
};
认证虽然对于RPC是透明的,可是RPC必须有两种认证必须实现。任何一种新的认证机制必须有一种独立的认证号,这个号是统一管理的,用户可以通过 rcp@sun.com 获得。其中NULL认证必须实现,我们推荐实现系统认证。NULL认证其实就是不认证,这里推荐相关的数据域长度为0。
RPC在其它通信协议之上,为了保证一个消息和另一消息分离并能够从错误中进行恢复,我们规定了一个消息片断称为RM,一个消息在一个RM中。一个 RM中可以有多个记录片断,每个片断除四个字节的头外,还有一个0到2的31次方减1的数据域。
下面我们来描述一下RPC语言,这是对XDR的一个扩展。下面是一个PING的例子:
program PING_PROG {
/*
* Latest and greatest version
*/
version PING_VERS_PINGBACK {
void
PINGPROC_NULL(void) = 0;
/*
* Ping the client, return the round-trip time
* (in microseconds). Returns -1 if the operation
* timed out.
*/
int
PINGPROC_PINGBACK(void) = 1;
} = 2;

/*
* Original version
*/
version PING_VERS_ORIG {
void
PINGPROC_NULL(void) = 0;
} = 1;
} = 1;

const PING_VERS = 2; /* latest version */
上程序中包括了三个小程序。通过上面的例子,我们可以看出RPC语言和XDR语言很象,不过就加了一个program-def而已。
program-def:
"program" identifier "{"
version-def
version-def *
"}" "=" constant ";"
version-def:
"version" identifier "{"
procedure-def
procedure-def *
"}" "=" constant ";"
procedure-def:
type-specifier identifier "(" type-specifier
("," type-specifier )* ")" "=" constant ";"
下面是一些基本的规定:
不使用program和version作为变量名;在一个域中版本名,过程名,版本号,过程号不能出现两次;程序标记在一个域中是常量,只能使用未 使用的常量可被指定到程序,版本和过程。最后我们来看看系统认证。如果要使用系统认证,它的标识为AUTH_SYS。证书由下面的结构表示:
struct authsys_parms {
unsigned int stamp;
string machinename<255>;
unsigned int uid;
unsigned int gid;
unsigned int gids<16>;
};
stamp是一个ID号由调用机产生。machinename是调用机的机器名,uid和gid是用户ID和组ID,gids是包括此用户的组的集 合。一般verf指定为AUTH_NONE。这个证书只在一个特定的域内有效(此域是由机器名,用户ID和组ID组成的)。
从服务器接收到的Verf的认证号可以是AUTH_NONE或AUTH_SHORT。在接收到后者时,返回的是一个新的认证结构。这个新的结构可以 取代原来的AUTH_SYS结构而被传送到服务器。这样客户可以传送比较少的数据而获得认证。服务器保留结构和旧结构的一个映射。当然,服务器可以随时取 消这种映射,此时客户的请求会被拒绝。此时用户可以必须使用原有的结构进行认证。这种认证本身并不能保证安全,真正的网络安全必须通过别的方式进行保证。
继承事业,薪火相传
返回列表