⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rfc1057.txt

📁 RFC中文技术文档
💻 TXT
📖 第 1 页 / 共 3 页
字号:
为:
   const BASE = 3;
   const MODULUS = "d4a0ba0250b6fd2ec626e7efd637df76c716e22d0944b88b"
	该方法工作的方式用例子很好得到阐述。假设有两个人“A”和“B”,他们想互相发送
加密信息。所以A和B都用随机数生成自己的密钥。假设这些密钥表示为SK(A)和SK(B)。
他们都发布他们的共钥。共钥的计算方法为:
         PK(A) = ( BASE ** SK(A) ) mod MODULUS
         PK(B) = ( BASE ** SK(B) ) mod MODULUS

   符号"**"在这表示求幂。现在A和B都可以求的公共密钥,用CK(A,B)表示,但是不
用显示出密钥:
A的计算方法为:
      CK(A, B) = ( PK(B) ** SK(A)) mod MODULUS

   B的计算方法为:
      CK(A, B) = ( PK(A) ** SK(B)) mod MODULUS
这两个值其实是相等的:
      (PK(B) ** SK(A)) mod MODULUS = (PK(A) ** SK(B)) mod MODULUS
去掉"mod MODULUS"部分假设去模运算为简单运算:
      PK(B) ** SK(A) = PK(A) ** SK(B)
	因此,用前面B计算的值替代PK(B),对PK(A)采取类似计算:
      ((BASE ** SK(B)) ** SK(A) = (BASE ** SK(A)) ** SK(B)
	那么将:
      BASE ** (SK(A) * SK(B)) = BASE ** (SK(A) * SK(B))
	在协议中该共钥CK(A,B)不用来加密时间戳。而是用来加密用来加密时间戳的密钥。
这么做的原因是尽量少用共钥,以为被破译。破译交谈密钥的严重性小多了,因为谈话时间
相对小。
对话密钥用56位的DES密钥加密,但是共钥是192位。为了减少数量,从共钥中按照下面选
取56位。中间8字节从共钥中提取,然后在每个字节的低位加上奇偶校验,生成一个有8
位校验位的56位密钥。
10. 记录记号标准
	当RPC信息传送到上层传送协议(如TCP),为了检查和从协议错误中恢复,必须界定信
息。这个就是记录标志(RM)。Sun用这种RM/TCP/IP传送方式在TCP流上传送RPC信息。一
个RPC信息装入一个RM记录。
一个记录由一个或多个记录碎片组成。一个记录片是4字节头后面跟上0到(2**31)-1字
节片数据。这些字节编码成无符号二进制数;和XDR整数一样,字节顺序是从高位到低位。
数字编码两个值---布尔值表示该片是否是记录的最后一片(位值1表示是最后一片)和31-
位的二进制只表示片数据的字节长度。布尔值是报头的高位;长度是31位低位。(注意记录
说明不是XDR标准格式)。

11. RPC语言
	正如有必要描述正式语言的XDR数据类型,有必要描述操作这些数据类型的过程。RPC
语言是XDR语言的扩展,增加了“程序”,“过程”和“版本”说明。下面的劳资用来描述语
言部分。
11.1 RPC语言描述的例子:
	这是简单ping程序的说明例子。      program PING_PROG {
            /*
             * 最新最完整版本
             */
            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;

            /*
             * 原始版本             */
            version PING_VERS_ORIG {
               void
               PINGPROC_NULL(void) = 0;
            } = 1;
         } = 1;

         const PING_VERS = 2;      /* latest version */
	第一个版本PING_VERS_PINGBACK有两个过程,PINGPROC_NULL 和 PINGPROC_PINGBACK. 
PINGPROC_NULL没有参数和返回值,但是它用于计算从客户端到服务器的往返时间。一般,
任何RPC协议的过程0应该有相同的意义,不需要任何认证。第二个过程用作服务器反向ping
客户机操作,然后返回所用时间(微妙计)。第二版PING_VERS_ORIG是协议的初始版本,它
不包含PINGPROC_PINGBACK过程,当这个程序完成后,它可能从整个协议退下来。
11.2 RPC语言说明
除了增加下面描述的"program-def"外,RPC语言和RRC1014定义的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
        ("," type-specifier )* ")" "=" constant ";"

11.3 语法注意事项:
1.	增加了下面的关键字 ,它们不能用作标志符。“program"和"version".
    2在一个程序定义域里一个版本名和版本数量不能出现两次。  
    3在一个版本定义里一个过程名不能出现多次。同样适用于过程数量。
4 在相同的空间里,程序标志符作为常量和类型标志符。
5 只有无符号常量可以赋给程序,版本和过程。

附录:程序协议端口映射
	端口映射程序映射RPC程序和版本号到特定传输端口号的关系。该程序动态绑定远程过
程。
	因为保留端口数量非常少和可能远程过程调用非常多,因此这样处理非常必要。通过对
保留端口运行端口映射程序,其它远程过程的端口数可以查询到。
	端口映射同样可以辅助广播RPC.一个RPC程序通常在不同机器上用不同的端口数,所以
不可能直接广播这些程序。但是,端口映射程序有一些固定端口号。所以如果要广播一程序,
客户可以发送信息到端口映射程序寻找广播地址。每个广播影射接收广播然后调用客户端的
本地服务。当端口映射程序获得从本地服务的答案,将它发送给客户端。
A.1 端口映射协议说明(用RPC语言)
         const PMAP_PORT = 111;      /* portmapper port number */

   从程序,版本和协议到端口号的映射:
         struct mapping {
            unsigned int prog;
            unsigned int vers;
            unsigned int prot;
            unsigned int port;
         };
"prot"域支持的值:
         const IPPROTO_TCP = 6;      /* protocol number for TCP/IP */
         const IPPROTO_UDP = 17;     /* protocol number for UDP/IP */
映射列表:
         struct *pmaplist {
            mapping map;
            pmaplist next;
         };

   Arguments to callit:

         struct call_args {
            unsigned int prog;
            unsigned int vers;
            unsigned int proc;
            opaque args<>;
         };

   Results of callit:

         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和TCP)。在每一个程序上端口映射程序工作在分派的
端口111(SUNPRC)。
	下面对每个端口映射过程进行描述:
   PMAPPROC_NULL:
	这个过程不工作。一般,任何协议的过程0都是没有参数和返回值。
   PMAPPROC_SET:
	在一台机器上当一个程序首次有效,它在相同的机器上登记端口映射程序。该程序传送
程序号“prot"和在其上等待服务请求的端口"port"。过程返回布尔值:如果该过程成功建
立映射,该布尔值显示谁的值是对,反之亦然。如果已经存在三元组(程序,版本,程序号),
那么程序拒绝建立映射。
   PMAPPROC_UNSET:
	当一个程序失效,它从机器上把该端口程序去掉。参数和结果跟函数"PMAPPROC_SET"的
一样。参数的协议和端口域省去。
   PMAPPROC_GETPORT:
	给定一个程序号"prog",版本号“vers"和传输协议号“prot",该过程返回该程序等待
调用请求的端口号。端口值0表示该程序没有登记。参数的"port"忽略。
   PMAPPROC_DUMP:
	该程序列举在端口映射数据库中的所有输入。它没有参数,返回一系列程序,版本,协
议和端口值。
   PMAPPROC_CALLIT:
	该过程允许客户端在相同的机器上不用知道远程过程调用端口号调用另外一个远程过
程。它也可以通过众所周知的端口映射程序用来扩展支持广播到任意远程过程。参
数'prog","vers","proc"和"args"字节书是程序浩,版本号,过程号和远程过程的参数。
注意:
1.	如果过程成功执行,那么该过程只有发送一个应答。
   2 端口映射程序和远程过程只用UDP通讯。
该过程返回远程过程端口数,和远程过程应答。
参考资料:
   [1] Birrell, A. D.  & Nelson, B. J., "Implementing Remote Procedure
       Calls", XEROX CSL-83-7, October 1983.

   [2] Cheriton, D., "VMTP: Versatile Message Transaction Protocol",
       Preliminary Version 0.3, Stanford University, January 1987.

   [3] Diffie & Hellman, "New Directions in Cryptography", IEEE
       Transactions on Information Theory IT-22, November 1976.

   [4] Mills, D., "Network Time Protocol", RFC-958, M/A-COM Linkabit,
       September 1985.

   [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, Information Sciences
       Institute, September 1981.

   [7] Postel, J., "User Datagram Protocol", RFC-768, Information
       Sciences Institute, August 1980.

   [8] Reynolds, J., and Postel, J., "Assigned Numbers", RFC-1010,
       Information Sciences Institute, May 1987.

   [9] Sun Microsystems, "XDR: External Data Representation Standard",
       RFC-1014, June 1987.
RFC1057——RPC: Remote Procedure Call Protocol Specification Version 2  
RFC:远程过程调用协议说明第二版


1
RFC文档中文翻译计划

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -