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

📄 563.htm

📁 unix高级编程原吗
💻 HTM
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://apue.dhs.org"><font face="黑体"><big><big>apue</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center">               ● UNIX网络编程                       (BM: clown)                </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p   align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="100" align="center" valign="top"><br><p align="center">[<a href="index.htm">回到开始</a>][<a href="15.htm">上一层</a>][<a href="564.htm">下一篇</a>]
<hr><p align="left"><small>发信人: cloudsky (小四), 信区: Security <br>

标  题: RPC/XDR/NFS系列之----远程过程调用 <br>

发信站: 武汉白云黄鹤站 (Wed Feb 23 17:26:59 2000), 站内信件 <br>

  <br>

标题:RPC/XDR/NFS系列之----远程过程调用 <br>

  <br>

原作:Douglas E. Comer & David L. Stevens <br>

      << Internetworking With TCP/IP Vol III >> <br>

  <br>

概述: <br>

  <br>

    本文重点介绍远程过程调用的概念,同时对于RPC报文 <br>

    给点感性认识,就是抓包上来看看啦。 <br>

  <br>

测试: <br>

  <br>

    RedHat6.0 <br>

  <br>

目录: <br>

  <br>

    ★ Sun Microsystems 的远程过程调用 <br>

    ★ 远程程序和远程过程 <br>

    ★ 减少远程过程的形式参数数量 <br>



    ★ 标识远程程序和远程过程 <br>

    ★ 远程程序的版本号 <br>

    ★ 远程程序中的互斥 <br>

    ★ 零或多次执行 <br>

    ★ RPC重传机制 <br>

    ★ 动态端口映射(重要) <br>

    ★ ONC RPC的报文格式(Redhat) <br>

    ★ 对远程过程的参数进行序列化 <br>

    ★ 鉴别机制 <br>

    ★ RPC请求报文的一个例子(协议分析软件抓包) <br>

    ★ 其他问题(需要讨论) <br>

    ★ 相关RFC以及参考资料 <br>

  <br>

★ Sun Microsystems 的远程过程调用 <br>

  <br>

Sun定义了自己特定形式的远程过程调用,称为Sun RPC、开放网络计算RPC <br>

(Open Network Computing, ONC RPC),简称RPC。ONC RPC已经成为事实上 <br>

的标准,并成为许多应用软件的实现机制,包括网络文件系统(NFS, Network <br>

File System)。 <br>

  <br>

ONC RPC允许底层支持协议为TCP或者UDP,使用了XDR。ONC RPC还提供了rpcgen <br>

这样的工具简化分布式编程。 <br>



  <br>

★ 远程程序和远程过程 <br>

  <br>

ONC RPC定义了一个远程程序,对应于我们平时所理解的RPC Server,它包含 <br>

一组远程过程以及所有远程过程所共享的远程全局数据。比如我们在 <br>

<< RPC/XDR/NFS系列之----RPC编程初战(1) >>中提供的rdictd就是一个RPC Server, <br>

也是一个远程程序,其中包含了几个远程过程,insertw、lookupw等等,字典本身就 <br>

是远程全局数据。 <br>

  <br>

★ 减少远程过程的形式参数数量 <br>

  <br>

在RPC编程中,通常使用一个结构收集所有的远程过程所需要的参数,而把这个结构 <br>

作为形式参数传递给远程过程。同理,远程过程的所有需要返回的数据可以收集到 <br>

一个结构中统一返回。 <br>

  <br>

★ 标识远程程序和远程过程 <br>

  <br>

ONC RPC标准中,在某个计算机上运行的远程程序(RPC Server)拥有唯一分配的32bit <br>

整数标识,rpc client需要使用该标识。此外,ONC RPC为一个给定的远程程序中的 <br>

每个远程过程分配了一个整数标识,依序递增1,2,...,N,0永远保留作为回送远程 <br>

过程(echo procedure),用于测试该远程程序是否正常运做。 <br>

  <br>

  <br>

ONC RPC已经划分了远程程序号: <br>

  <br>

0x00000000 - 0x1fffffff Sun Microsystems公司 <br>

0x20000000 - 0x3fffffff 用户使用 <br>

0x40000000 - 0x5fffffff <br>

0x60000000 - 0x7fffffff 保留 <br>

0x80000000 - 0x9fffffff 保留 <br>

0xa0000000 - 0xbfffffff 保留 <br>

0xc0000000 - 0xdfffffff 保留 <br>

0xe0000000 - 0xffffffff 保留 <br>

  <br>

在第一组中已经分配的远程程序号有: <br>

  <br>

名字            远程程序号      描述 <br>

  <br>

portmap         100000          端口映射器 <br>

rstatd          100001          rstatd <br>

rusersd         100002 <br>

nfs             100003          网络文件系统 <br>

ypserv          100004          yp(现在叫做NIS) <br>

mountd          100005 <br>

dbxd            100006 <br>



ypbind          100007          NIS绑定程序 <br>

walld           100008          rwalld <br>

yppasswdd       100009 <br>

etherstatd      100010          以太网统计 <br>

rquotad         100011 <br>

sprayd          100012 <br>

selection_svc   100015          选择服务 <br>

dbsessionmgr    100016 <br>

rexd            100017          远程执行 <br>

office_auto     100018 <br>

lockd           100020 <br>

nlockmgr        100021 <br>

status          100024          状态监视器 <br>

bootparamd      100026 <br>

pcnfsd          150001 <br>

  <br>

scz注:100017是个相当危险的服务,如果你不是烧昏了就关闭这个服务。 <br>

       它几乎没有什么特别的保护机制,却可以做很危险的操作。 <br>

  <br>

★ 远程程序的版本号 <br>

  <br>

远程程序的第一个版本往往分配给版本号1。 <br>



在目前的实现当中,每个RPC报文通过一个三元组标识给定主机上所期望 <br>

的接收者: <br>

  <br>

( prog, vers, proc ) <br>

  <br>

ONC RPC允许一台主机同时运行远程程序的多个版本,这些不同版本之间 <br>

互相不影响。 <br>

  <br>

★ 远程程序中的互斥 <br>

  <br>

ONC RPC机制使得单个远程程序一次只能支持一个远程过程调用,当前远程 <br>

过程调用完成之前会自动阻塞其他远程过程调用,程序员设计分布式程序时 <br>

不需要考虑这种互斥。 <br>

  <br>

★ 零或多次执行 <br>

  <br>

ONC RPC标准中,用至少一次语义(at least once semantics)描述 <br>

rpc client至少接收到了一个应答,用零或多次语义(zero or more semantics) <br>

描述rpc client没有接收到应答。 <br>

  <br>

下面解释一下这些语义: <br>

  <br>

  <br>

至少一次语义 ---- 远程过程调用返回了,调用者只能认为远程过程至少被调用 <br>

                  了一次,而不能认为远程过程恰好被调用用了一次,因为远 <br>

                  程过程调用应答可能丢失,远程过程调用请求可能重复。 <br>

  <br>

零或多次语义 ---- 远程过程调用没有返回,调用者不能认为远程过程一定没有 <br>

                  被调用,远程过程调用应答可能丢失。 <br>

  <br>

后者意味着程序员的一个重要责任,选择UDP支持RPC,则设计的程序必须能够 <br>

容忍零或多次执行语义。这要求相应的远程过程调用是幂等的(idempotent)。 <br>

  <br>

★ RPC重传机制 <br>

  <br>

ONC RPC支持一种简单的超时重传机制,但无法保证严格意义下的可靠性。默认的 <br>

超时机制采用了固定(非自适应)超时时间间隔和固定重试次数。当RPC库软件发送 <br>

一个报文时(对应于进行一次远程过程调用),它便启动一个定时器,如果定时器在 <br>

远程过程调用应答达到前期满,软件便重发请求,程序员可以为某个给定应用调整 <br>

超时时间间隔以及重试次数,但无法自适应。这种简单机制无法保证可靠性,无法 <br>

保证rpc client可以判断远程过程执行情况。如果网络丢失了所有应答,rpc client <br>

可能会重传几次请求,每次请求都导致远程过程被调用一次,然而当rpc client <br>

端的RPC库软件达到重试上限,它会宣布远程过程无法被调用。 <br>

  <br>

必须注意,应用程序不能将失败解释成远程过程从来没有被调用过,很可能已经 <br>



被调用了多次。 <br>

  <br>

★ 动态端口映射(重要) <br>

  <br>

UDP/TCP使用16bit的协议端口号,而ONC RPC使用32bit的远程程序号,无法在二者 <br>

之间进行直接映射。此外,不是所有的RPC Server都能被分配一个唯一的协议端口 <br>

号。 <br>

  <br>

scz注:NFS使用了UDP 2049,这个端口是固定使用的。 <br>

  <br>

RPC Server的潜在数量超过了分配周知端口的能力,但RPC Server本身和其他server <br>

没有什么特别不同。在任意给定时间,某台主机上仅仅运行了少量RPC Server,可以 <br>

为这些RPC Server临时分配协议端口号用于socket通信。 <br>

  <br>

问题在于,如果RPC Server没有采用固定的周知端口,而是动态从操作系统获得空闲 <br>

协议端口号的话,RPC Client无法直接与之建立socket通信,因为client根本不知道 <br>

这次server启动后获得的端口号。所以必须辅助以其他技术,以便rpc client可以得 <br>

知此次rpc server启动后获得的端口号。 <br>

  <br>

ONC RPC提供了一个动态端口映射服务,每个RPC Server启动的时候向本机上运行的 <br>

动态端口映射器注册自己的远程程序号、版本号、动态获得的端口号,而RPC Client <br>

用远程程序号+版本号向远程主机上的portmapper查询相应的动态端口号,一旦 <br>



rpc client获得了rpc server的动态端口号,就不用理会portmapper了,直接使用 <br>

targetIp+targetPort建立socket通信。 <br>

  <br>

  <br>

-- <br>

            我问飘逝的风:来迟了? <br>

            风感慨:是的,他们已经宣战。 <br>

            我问苏醒的大地:还有希望么? <br>

            大地揉了揉眼睛:还有,还有无数代的少年。 <br>

            我问长空中的英魂:你们相信? <br>

            英魂带着笑意离去:相信,希望还在。 <br>

</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="15.htm">上一层</a>][<a href="564.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>

⌨️ 快捷键说明

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