1 / 50

第 三 讲 软件互操作

第 三 讲 软件互操作. 在一定程度上 人类的思维产生于 简单个体之间的相互作用. ——Marvin Minsky. 内 容. 一、互操作的基础 二、远程过程调用( RPC ) 三、基于 RPC 的程序开发 四、互操作体系. 一、互操作的基础. 1 、互操作是什么 2 、 TCP/IP 3 、基于 Socket 的网络软件. 1、互操作是什么?. Interoperability Peter Wegner [96]: Interoperability is the ability of two or more

abdalla
Download Presentation

第 三 讲 软件互操作

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第 三 讲 软件互操作

  2. 在一定程度上 人类的思维产生于 简单个体之间的相互作用 ——Marvin Minsky

  3. 内 容 一、互操作的基础 二、远程过程调用(RPC) 三、基于RPC的程序开发 四、互操作体系

  4. 一、互操作的基础 1、互操作是什么 2、TCP/IP 3、基于Socket的网络软件

  5. 1、互操作是什么? Interoperability Peter Wegner [96]: Interoperability is the ability of two or more software components to cooperate despite differences in language, interface, and execution platform. Heiler [95]: Interoperability among components of large-scale, distributed system is the ability to exchange services and data with one another. 软件互操作是 应用层的某一实体使用另一实体的能力

  6. 网络应用发展三步曲: 协同工作 互操作 消息传递

  7. 消息传递 消息传递是指具有一定结构的信息从一个结点传输到另外一个结点的过程。 消息传递突破了单机环境中通过共享内存(变量)进行信息交换的模式。通过消息的发送、消息的接收等环节,消息传递实现了不同运行实体间的信息交流。 消息传递使计算机从封闭、独立的模式向开放、交流的模式转变,这一转变极大地丰富了计算机学科的研究内容与应用范围。 消息传递的目的性不强,只要正确地将信息从一结点传给另一结点即认为成功,因此对语法的要求较高。 例如:TCP/IP

  8. 互操作 互操作是一个结点上的成员对另一个结点上资源的使用。互操作过程中,发送方将操作的方法与参数打包,作为一条消息进行发送,接收方则对消息头进行解释,并根据所载信息的含义、参数执行相应的操作。 互操作的目标在于实现操作发出方的功能调用,并提供一定的透明性支持(Transparent utility),实现不同操作空间之间的无缝连接(seamless connection),强调消息的语义,即消息所包含的意义。 例如:RPC、ORB、RMI

  9. 协同工作 协同工作是协作范围的进一步扩展,也是消息传递、互操作的目标与结果。协同工作的主体既可以是人,也可以是其他的计算机资源。 协同工作的目标在于完成由许多人共同承担的大型任务。消息被传递后,不仅要求语法、语义正确,还要求接收方根据消息的含义进行反应,使消息体现出一定的效用,而不是被简单的传送。 例如:CSCW (Computer Supported Cooperative Work)

  10. 协作三步曲与通信层次的对应: 协作三步曲: 消息传递 互操作 协同工作 通信三层次: 语法 语义 语用 协同工作 语用 互操作 语义 消息传递 语法

  11. 2、TCP/IP (1)ISO/OSI 参考模型与TCP/IP的对照 TCP/IP ISO/OSI 参考模型 Application 应用层: telnet、ftp、smtp、snmp、 dns、http、nntp Presentation Session Transport TCP, UDP Network 因特网层:IP Data link 主机与网络的连接: ethernet、token-ring Physical

  12. (2)IP:Internet Protocol 地址范围 类 1.0.0.0 ~ 127.255.255.255 A B C D E 0 Network Host 1 0 Network Host 128.0.0.0 ~ 191.255.255.255 1 1 0 Network Host 192.0.0.0 ~ 223.255.255.255 1 1 1 0 Multicast address 224.0.0.0 ~ 239.255.255.255 1 1 1 1 0 Reversed for future use 240.0.0.0 ~ 247.255.255.255

  13. IP头 Vers. H.len Service type Total length Identification Flags Fragment offset 20 bytes Time to live Protocol Header checksum Source IP address Destination IP address IP options (may be omitted) Padding data Service type Precedence D T R unused

  14. (3)TCP :Transmission Control Protocol • TCP 为两个分布式的构件提供了双向的消息通信 • UNIX 中的命令 rsh, rcp 及rlogin 全部基于TCP • 它是一个可靠但较慢的协议 • 在客户服务器双方进行缓冲 以提高速度

  15. TCP头格式 Source port Destination port Sequence number Acknowledgement number Window size Code bits H.len Reserved Checksum Urgent pointer Options (0 or more words) Data (optional)

  16. UDP : User Datagram Protocol • 一个构件向另一个构件发送消息 • 另一个构件的标识包含在消息中 • 不可靠但快速的协议 • 消息长度固定 • 消息在接受方排队 • UNIX rwho 命令基于UDP

  17. 3、基于Socket的网络软件 客户 服务器 面向非连接: Socket() bind() Socket() readfrom() bind() 请求服务 阻塞,等待 客户数据 sendto() 处理请求… readfrom() 应答数据 sendto() close() close()

  18. 客户 服务器 面向连接: Socket() bind() listen() Socket() accept() 建立连接 connect() 阻塞,等待 客户连接 请求服务 read() write() 处理请求… 应答数据 write() read() close() close()

  19. 二、RPC 1、动因与实例 2、工作原理 3、编排/还原 4、请求分派

  20. 1、动因与实例 开发基于SOCKET的网络软件非常复杂 FTP TELNET 位于不同机器上的软件互操作困难 连接管理 异构 导致RPC(Remote Procedure Calling )的产生 主要实例: SUN公司等提出的ONC(Open Network Computing)RPC 主要由SUN予以实现 OSF(Open Software Foundation)RPC影响最大 主要由DCE(Distributed Computing Environment)实现 DCE是OSF提出的分布计算体系结构

  21. 2、 工作原理 以对某银行帐户的一个存款过程为例: 客户端程序 服务器端程序 Deposit( 1000 ) 启动服务器上的存款过程 int Deposit(number){ return total + number; } 继续运行

  22. Client Stub Server Stub RPC Interface RPC Interface ( 1)调用过程 服务器端程序 客户端程序 Server Program Client Program send receive send receive Network

  23. 过程描述: 1、客户按本地调用的方式 直接调用本地的客户指代 客户指代具有与服务器相同的过程接口 2、客户指代 将客户的调用请求进行加工、打包 向底层通信机制(如套接字)发出请求消息 客户指代 不进行任何逻辑处理 只是一个中介 3、客户端通过底层的通信机制 将消息传送给服务器端的底层通信机制

  24. 4、服务器 需要部分地解析消息 找出客户希望调用的服务器程序 5、服务器指代对消息进行解析 从中获得调用者的参数 然后调用服务器程序 6、服务器程序执行相应的过程 7、服务器程序将结果返回给服务器指代 8、服务器指代将结果打包 向底层通信机制发出应答消息 9、服务器端通信机制将消息传送给客户端通信机制

  25. 10、客户端节点上也可能有多个调出点 通信机制需要部分地解析返回的消息 找出消息应该返回给哪个客户程序 并将消息发送给对应的客户指代 11、客户指代从消息中解析结果 返回给客户程序

  26. (2)编排/还原 指代(Stub)的主要工作包括: (1)建立客户与服务器之间的连接 (2)将客户的高层调用语句打包为一条底层的请求消息 这一过程在RPC中被称为编排(marshal) (3)等待服务器返回应答消息 (4)将来自服务器底层的应答消息解析为可以返回的数据 这一过程在RPC中被称为还原(unmarshal) (5)将返回值传送给客户程序 需要特别处理: 编码、字节序 等问题

  27. (3) 请求分派 服务器端的指代: 除了需要进行编排、还原外 还需要 区分客户所请求的过程名 然后将客户的请求分派(dispatch)给正确的过程 “指代” 目前主要被用于专门代表客户端的代理程序 而服务器端则由新的机制予以支持 在CORBA中专门分离出了对象适配器(OA:Object Adaptor) 在EJB中发展出了构件容器 用于在运行过程中专门管理构件的各种状态 此时的服务器端不仅负责请求分派 还负责向底层机制的注册(以方便请求的定位) 以及过程的激活(以加强系统的灵活性) 等等功能

  28. 三、基于RPC的开发过程 1、定义并编译接口 2、编写实现具体服务功能的代码 3、编译、连接,产生可执行的服务器程序 4、编写客户端代码 5、编译、连接,产生客户程序 6、运行服务器端程序 7、运行客户端程序

  29. 客户端开发过程 服务器端开发过程 IDL IDL编译器 (rpcgen) account.h account _svc.c server.c account_clnt.c client.c rpclib.o 客户端程序 服务器端程序

  30. 1、定义并编译接口 仍然结合银行帐号的例子 接口定义文件account.x : program ACCOUNT{ version ACCOUNT_VER{ int deposit(int) = 2; int withdraw(int) = 1; }=1; }=0x20010929; 编译后生成三个主要文件: account.h account_clnt.c account_svc.c

  31. account.h extern "C" { #define ACCOUNT 0x20010929 #define ACCOUNT_VER 1 #define deposit 2 extern int * deposit_1(int *, CLIENT *); extern int * deposit_1_svc(int *, struct svc_req *); #define withdraw 1 extern int * withdraw_1(int *, CLIENT *); extern int * withdraw_1_svc(int *, struct svc_req *); extern int account_1_freeresult (SVCXPRT *, xdrproc_t, caddr_t); }

  32. account_clnt.c static struct timeval TIMEOUT = { 25, 0 }; int * deposit_1(int *argp, CLIENT *clnt){ static int clnt_res; memset((char *)&clnt_res, 0, sizeof(clnt_res)); if (clnt_call (clnt, deposit, (xdrproc_t) xdr_int, (caddr_t) argp, (xdrproc_t) xdr_int, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } int * withdraw_1(int *argp, CLIENT *clnt){ static int clnt_res; memset((char *)&clnt_res, 0, sizeof(clnt_res)); if (clnt_call (clnt, withdraw, (xdrproc_t) xdr_int, (caddr_t) argp, (xdrproc_t) xdr_int, (caddr_t) &clnt_res,TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); }

  33. account_svc.c int main (int argc, char **argv){ register SVCXPRT *transp; pmap_unset (ACCOUNT, ACCOUNT_VER); transp = svctcp_create(RPC_ANYSOCK, 0, 0); if (transp == NULL) { fprintf (stderr, "%s", "cannot create tcp service."); exit(1); } if (!svc_register(transp, ACCOUNT, ACCOUNT_VER, account_1, IPPROTO_TCP)) { fprintf (stderr, "%s", "unable to register (ACCOUNT, ACCOUNT_VER, tcp)."); exit(1); } svc_run (); fprintf (stderr, "%s", "svc_run returned"); exit (1); }

  34. static void account_1(struct svc_req *rqstp, register SVCXPRT *transp){ union { int deposit_1_arg; int withdraw_1_arg; } argument; char *result; xdrproc_t _xdr_argument, _xdr_result; char *(*local)(char *, struct svc_req *); switch (rqstp->rq_proc) { case NULLPROC: (void) svc_sendreply (transp, (xdrproc_t) xdr_void, (char *)NULL); return; case deposit: _xdr_argument = (xdrproc_t) xdr_int; _xdr_result = (xdrproc_t) xdr_int; local = (char *(*)(char *, struct svc_req *)) deposit_1_svc; break; case withdraw: _xdr_argument = (xdrproc_t) xdr_int; _xdr_result = (xdrproc_t) xdr_int; local = (char *(*)(char *, struct svc_req *)) withdraw_1_svc; break;

  35. default: svcerr_noproc (transp); return; } memset ((char *)&argument, 0, sizeof (argument)); if (!svc_getargs (transp, _xdr_argument, (caddr_t) &argument)) { svcerr_decode (transp); return; } result = (*local)((char *)&argument, rqstp); if (result != NULL && !svc_sendreply(transp, _xdr_result, result)) { svcerr_systemerr (transp); } if (!svc_freeargs (transp, _xdr_argument, (caddr_t) &argument)) { fprintf (stderr, "%s", "unable to free arguments"); exit (1); } return; }

  36. 2、编写实现具体服务功能的代码 server.c #include "account.h" int total= 10000; int * deposit_1_svc(int *argp, struct svc_req *rqstp){ static int result; total= total + *argp; result = total; printf(“new total =%d”, total); return &result; } int * withdraw_1_svc(int *argp, struct svc_req *rqstp){ static int result; total= total - *argp; result = total; printf(“new total =%d”, total); return &result; }

  37. 3、编译、连接,产生可执行的服务器程序 cc –o server server.c account_svc.c

  38. 4、编写客户端代码 client.c #include "account.h" void account_1(char *host){ CLIENT *clnt; int *result_1; int deposit_1_arg=1000; int *result_2; int withdraw_1_arg=2000; clnt = clnt_create (host, ACCOUNT, ACCOUNT_VER, "tcp"); result_1 = deposit_1(&deposit_1_arg, clnt); printf(“result =%s”, result_1); result_2 = withdraw_1(&withdraw_1_arg, clnt); printf(“result =%s”, result_2); clnt_destroy (clnt); } int main (int argc, char *argv[]){ char *host; if (argc < 2) { printf ("usage: %s server_host\n", argv[0]);exit (1); } host = argv[1]; account_1 (host); }

  39. 5、编译、连接,产生客户程序 cc –o client client.c account_clnt.c

  40. 6、运行服务器端程序 server • 7、运行客户端程序 client 128.0.0.1(server 的IP地址) • 服务器端应当显示: • new total = 11000 • new total = 9000 • 客户端应当显示: • result = 11000 • result = 9000

  41. 四、互操作体系 为支持 应用层的某一实体使用另一实体 而制定的一套技术规范

  42. 内 容 1、底层协议 2、互操作消息 3、互操作接口定义 4、互操作查找方式 5、现有体系比较

  43. RPC 互操作规范 互操作实现(以 为例) 服务器端程序 互操作查找 客户端程序 决定 客户端指代 服务器端指代 互操作接口定义语言 决定 互操作协议 互操作消息 互操作消息 底层协议 网络基础设施 网络基础设施

  44. 软件互操作体系与人类交互过程的比较 • 底层协议提供了基本的通信基础 • 互操作消息是软件之间进行交互时所表述的语言 • 互操作协议是对这些语言的语法说明 • 互操作接口定义是软件之间的一种约定 • 接口定义语言是合约的撰写规则 • 互操作查找是交互双方建立联系的途径 • 包括白页、黄页、绿页等多种途径

  45. 1、底层协议 底层协议是互操作协议所依赖的底层通信机制 目前最受重视的协议 是前面讲过的 TCP/IP协议 也可以是 ATM等其它协议

  46. 2、互操作协议 RPC中关于字节序、数据表示等问题的解决方法 体现了通信双方之间关于消息的 数据格式 消息的类型 等的约定 类似的约定还有 服务器的管理 等等 所有这些约定 共同构成了互操作的高层协议 互操作协议一般独立于底层协议 即互操作协议可以向不同的底层协议进行映射 从而由不同的底层协议进行支持 互操作协议一般都比较烦琐 其实现由应用服务器开发者承担 应用系统的开发者在开发具体系统时 不必关心协议的实现问题

  47. 3、互操作接口定义语言 • 客户指代主要完成上层代码(客户程序、服务器程序) • 与底层代码(RPC API等)之间的“映射” • 其参数传递、编排、服务器定位等功能完全 • 与应用系统具体的业务逻辑实现细节无关 • 因此 • 只要系统明确定义了服务器的接口 • 即可以产生与该接口对应的指代 • 接口定义语言(Interface Definition Language) • 描述了 客户与服务器之间的接口

  48. 4、互操作查找 • 互操作查找方式主要是指服务器的定位 • 根据自己掌握的信息 • 客户如何才能查找到具体服务器 • 这实际上涉及 服务器端服务信息的发布 • 服务信息的管理等问题

  49. 互操作体系名称 互操作协议 接口定义语言 服务查找 RPC RPC IDL RPC注册 DCOM ORPC MIDL 系统注册 CORBA GIOP(IIOP) IDL 命名服务 J2EE JRMP Java Interface JNDI Web Services SOAP WSDL UDDI 5、现有体系比较

  50. 思 考 题 作业:完成 RPC 实验 • 消息传递、互操作、协同工作之间的关系是什么? • RPC是如何工作的? • 不同互操作体系的异同点是什么?

More Related