📄 rfc1050.txt
字号:
然后,用以前B计算得到的结果来替换PK(B),对PK(A)也进行这样的步骤
((PROOT ** SK(B)) ** SK(A) = (PROOT ** SK(A)) ** SK(B)
这将导致:
PROOT ** (SK(A) * SK(B)) = PROOT ** (SK(A) * SK(B))
不使用公共密钥CK(A, B)来加密在协议中使用的时间戳。它只用于加密会话密钥,而使用这个会话密钥来加密时间戳。这样做的原因是因为应该尽可能少的使用公共密钥,以防公共密钥被破译。会话密钥即使被破译,造成的损失也较小,因为会话的时间总是相对较短。
会话密钥是使用56比特DES密钥加密的。而这个公共密钥是128比特位。为了减少比特的数量,象下面这样从公共密钥中选择56比特。从公共密钥中选择最中间的8个字节,然后把奇偶校验加在每一个字节的最低比特位。这样就产生了一个带有8比特奇偶校验位的56比特密钥。
10.记录标记的标准
当RPC消息在一个字节流协议(象TCP/IP)上层传送的时候,有必要在一个消息和另一个消息之间划定界线,这样是为了检测出用户协议的错误,并可能对错误进行恢复。这就叫做记录标记(RM)。Sun使用RM/TCP/IP来在TCP流上传送RPC消息。一个RPC消息适配一个RM记录。
一个记录是由一个或者多个记录片断组成。一个记录片断是4字节的头,后跟0至(2**31)-1字节的片断数据。片断头的字节编码成一个无符号的二进制数;象是XDR中的整数一样,字节的顺序是从高到底的。这个数字编码成两个部分的值:一个部分是布尔值,指示这个片断是否是记录的最后一个记录片断(值1表明此片断是最后一个片断),另一部分是一个31比特的无符号二进制值,它是这个片断数据用字节计数时的长度。布尔值是这个片断头的最高位比特;长度是低位的31比特。(注意这个记录规范并不是XDR的标准形式!)
11.RPC语言
就象在一个正式的语言中需要定义XDR数据类型一样。也需要在正式的语言中定义操作XDR数据类型的过程。为了这个目的,我们使用RPC语言。它是XDR语言的扩展。使用下面的例子来描述这种语言的精髓。
用RPC语言描述的服务的例子
这里有一个简单ping程序的例子说明。
/*
*简单的ping程序
*/
program PING_PROG {
/*
* 最近和最好的版本
*/
version PING_VERS_PINGBACK {
void PINGPROC_NULL(void) = 0;
/*
* Ping这个调用者,返回往返时间(用微秒来表示)。如果操作超时,
* 返回-1。
*/
int PINGPROC_PINGBACK(void) = 1;
} = 2;
/*
* 原来的版本
*/
version PING_VERS_ORIG {
void PINGPROC_NULL(void) = 0;
} = 1;
} = 1;
const PING_VERS = 2; /* 最近的版本*/
在第一个版本中,PING_VERS_PINGBACK有两个过程PINGPROC_NULL 和 PINGPROC_PINGBACK。PINGPROC_NULL不需要参数,也不返回结果,但是它对计算从客户端到服务器再回到客户端的往返时间很有用。在会话中,任何RPC协议的过程0都应该有同样的语义,不需要任何种类的认证。客户端用第二个过程来使服务器对客户端进行一个反向的ping操作,并且它返回使用这个操作的时间值(用微秒表示)。下一个版本PING_VERS_ORIG是这个协议的原来的版本,它不包含PINGPROC_PINGBACK过程。这对兼容旧的客户端程序很有用,随着程序的升级,它可能从整个协议中删去。
11.1 RPC语言规范
RPC语言除了加入了"program-def"的定义,与XDR语言一样。
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 ")"
"=" constant ";"
11.2语法的注意事项
(1) 下面的关键字不能用作标识符:"program" and "version";
(2)版本名不能在一个程序定义的范围内出现超过一次。
同样,版本号在这个程序定义的范围里也不能出现超过一次。
(3) 过程名不能在一个版本定义的范围内出现超过一次。
同样,过程号在这个版本定义的范围里也不能出现超过一次。
(4) 程序的标识符有象常数标识符和类型标识符同样的名字空间。
(5) 只有无符号的常数可以分配给程序,版本和过程。
附录A:端口映射器程序协议
端口映射器程序把RPC程序和版本号映射到特定的传输端口号上。这个程序可以对远程的程序进行动态绑定。
这种方法是符合需要的,因为保留的端口号的范围是有限的,而潜在的远程程序是很多的。在一个保留端口号上运行端口映射器,只要查询这个端口映射器就可以确定其它远程成程序的端口号。
端口映射器也在广播RPC中使用。一个给定的RPC程序在不同的机器上经常绑定到不同的端口号上,所以没有方法直接广播到所有的这些程序。而端口映射器有固定的端口号。要向给定的程序发送广播,客户端实际上把消息发送到广播地址上的端口映射器。获得广播的每一个端口映射器调用由客户端指定的本地服务。当端口映射器收到本地服务的响应,它再把这个响应发送给客户端。
A.1端口映射器协议规范(用RPC语言)
const PMAP_PORT = 111; /* 端口映射器的端口号*/
/*
*(程序,版本,协议)到端口的映射
*/
struct mapping {
unsigned int prog;
unsigned int vers;
unsigned int prot;
unsigned int port;
};
/*
* "prot"字段支持的值
*/
const IPPROTO_TCP = 6; /* TCP/IP的协议号 */
const IPPROTO_UDP = 17; /* UDP/IP的协议号*/
/*
* 一个映射列表
*/
struct *pmaplist {
mapping map;
pmaplist next;
};
/*
* 调用的参数
*/
struct call_args {
unsigned int prog;
unsigned int vers;
unsigned int proc;
opaque args<>;
};
/*
* 调用的结果
*/
struct call_result {
unsigned int port;
opaque res<>;
};
/*
* 端口映射器的过程
*/
program PMAP_PROG {
version PMAP_VERS {
void PMAPPROC_NULL(void) = 0;
bool PMAPPROC_SET(mapping) = 1;
bool PMAPPROC_UNSET(mapping) = 2;
unsigned int PMAPPROC_GETPORT(mapping) = 3;
pmaplist PMAPPROC_DUMP(void) = 4;
call_result PMAPPROC_CALLIT(call_args) = 5;
} = 2;
} = 100000;
A.2 端口映射器操作
端口映射器程序当前支持两种协议(UDP/IP和TCP/IP)。端口映射器在这两种协议中的任一种中都分配在端口111上(SUNRPC [8])。下面是每一个端口映射器过程的描述:
PMAPPROC_NULL:
这个过程不工作。按照习惯,任何协议的0号过程不接收参数,也不返回结果。
PMAPPROC_SET:
当一个程序在一个机器上可用时,它要向同一台机器上的端口映射器注册它自己。
这个程序传递它的程序号 "prog",版本号 "vers", 传输协议号 "prot"和端口号
"port"。在 "port"这个端口号上,程序等待服务的请求。这个过程返回一个布尔值,如果过程成功建立了映射,这个值为"TRUE"。否则,这个值为"FALSE"。
如果已经存在"(prog, vers, prot)"元组,这个过程拒绝建立映射。
PMAPPROC_UNSET:
当程序变为不可用的时候,它将在同一台机器上的端口映射器中注销它自己。
它的参数和结果和"PMAPPROC_SET"有同样的含义。参数中的协议和端口
号字段将被忽略。
PMAPPROC_GETPORT:
当被给出了程序号 "prog",版本号 "vers"和传输协议号 "prot",这个过程将返回
此程序等待调用请求的端口号。返回一个0的端口值意味着这个程序没有注册。
参数中的 "port"字段将被忽略。
PMAPPROC_DUMP:
这个过程列举了端口映射器数据库中的所有条目。
此过程不需要参数,它返回一个程序,版本,协议,和端口值的列表。
PMAPPROC_CALLIT:
这个过程允许调用者调用在同一台机器上的另一个远程过程,而不需要知道这个远程过程的端口号。通过众所周知的端口映射器的端口号,它支持二进制远程程序的广播。 参数"prog", "vers", "proc","args"分别是程序号,版本号,过程号和远程过程的参数。
注意:
(1) 如果过程成功执行,过程仅发送一个响应。否则保持沉默(不响应)。
(2) 端口映射器只使用UDP/IP协议与远程程序通信。
这个过程返回远程程序的端口号和远程过程执行的结果。
参考书目
[1] Birrel, A. D., and Nelson, B. J., "Implementing Remote
Procedure Calls", XEROX CSL-83-7, October 1983.
[2] Cheriton, D., "VMTP: Versatile Message Transaction Protocol",
Version 0.7, RFC-1045, Stanford University, February 1988.
[3] Diffie & Hellman, "Net Directions in Cryptography", IEEE
Transactions on Information Theory IT-22, November 1976.
[4] Postel, J., and Harrenstien, K., "Time Protocol", RFC-868,
Network Information Center, SRI, May 1983.
[5] National Bureau of Standards, "Data Encryption Standard",
Federal Information Processing Standards Publication 46,
January 1977.
[6] Postel, J., "Transmission Control Protocol - DARPA Internet
Program Protocol Specification", RFC-793; Network Information
Center, SRI, September 1981.
[7] Postel, J., "User Datagram Protocol", RFC-768, Network
Information Center, SRI, August 1980.
[8] Reynolds, J. and Postel, J.; "Assigned Numbers", RFC-1010,
Network Information Center, SRI, May 1987.
[9] Sun Microsystems; "XDR: External Data Representation
Standard", RFC-1014; Sun Microsystems, June 1987.
RFC1050---Remote Procedure Call Protocol Specification 远程过程调用协议规范
1
RFC文档中文翻译计划
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -