📄 563.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 + -