网络通信基础
套接字socket
两种含义
socket API
socket数据结构与实例
三个特征
网域
表明一个socket用于哪一种网络或哪一族网络协议
类型
表明网络中通信所遵循的模式
- “面向连接”,或流模式
- “无连接”,或数据报模式
协议
表明具体网络协议
一般来说,网域与类型结合作就能决定协议。
- 网域为AF_INET,类型为“无连接”,则协议为UDP
- 网域为AF_INET,类型为“面向连接”,则协议为TC
远程过程调用(RPC)
RPC与本机过程调用的相同要素
- 参数传递
- 指令执行
RPC是一种客户机/服务器形式的服务
一个客户机程序可以调用另一台计算机上的过程,向这个进程提供数据,获取这个进程运行的结果等。
RPC的实现
RPC引入了存根(Stub)的概
比如服务端有某个函数fn(),它为了能够被远程调用,通过编译器自动生成两个stub:
- 客户端的一个stub:c_fn()
- 服务器端的一个stub:s_fn()
在客户端,一个进程在执行过程中调用到了函数fn(),此函数的具体实现是在远程的某台机器上
那么此进程实际上是调用了位于当地机器上的另外一个代理的fn()(即c_fn())
当客户端的消息发送到服务器端时
服务器端也不是把消息直接就交给真正的fn(),而是同样先交给一个代理的fn()(即s_fn())
Stub的功能
Stub的主要功能是对要发送的参数进行marshalling(可理解成一种打包操作)和对接收到的参数(或返回值)进行unmarshalling(解包)。
Server stub的功能:(在服务器端运算)
- 对发送给它的参数消息unmarshal,收集参数
- 调用位于本机上的过程
- 将此过程执行的结果marshal成消息,然后调用服务器端的运行时系统将结果消息发送给客户端
Client stub的功能:
- 收集调用远程函数需要的参数
- 将这些参数marshal成消息,把消息转化成标准的网络数据表示,用于在网络上传递
- 调用客户端的运行时系统,将此消息发送给服务器端。
- 当服务器端将结果消息返回后,将结果消息unmarshal,把结果返回给应用进程
RPC执行的步骤
1.客户过程以普通方式调用相应的客户存根。
2.客户存根建立消息并激活内核陷阱。
3.内核将消息发送到远程内核。
4.远程内核将消息送到服务器存根。
5.服务器存根取出消息中的参数后调用服务器的过程。
6.服务器完成工作后将结果返回至服务器存根。
7.服务器存根将它打包并激活内核陷阱。
8.远程内核将消息发送至客户内核。
9.客户内核将消息交给客户存根。
10.客户存根从消息中取出结果返回给客户。
RPC一般架构结构
RMI(远程方法调用)模型
RMI的服务程序通常是一个Java应用程序
而客户程序既可以是一个Java应用程序,也可以是一个Java Applet。
RMI体系结构
存根/框架层
存根是远程对象在客户端的代理,负责将远程调用请求通过远程引用层和传输层转发给服务端的框架
客户程序中的远程对象引用实际上是对本地存根的引用
框架将来自客户端的远程调用申请在服务端接收,并负责调用相应的对象方法,再将结果返回给客户端。
关键技术
对象串行化技术:存根与框架利用对象串行化技术打包(marshal)与解包(unmarshal)远程调用的参数与返回值。
动态类装载技术:动态类装载技术用于支持将客户端的存根作为远程对象本身,存根实现了相同的远程接口集合,从而支持Java语言的类型检查与类型转换机制。
远程引用层和传输层
远程引用层定义和支持RMI连接的调用语法、语义,远程引用层还为上一层屏蔽了服务程序的激活方式。
传输层建立于TCP/IP之上,主要负责Java虚拟机之间的连接,侦听调用请求,建立连接,管理和监视连接
RMI分布式应用程序基本构成
- 远程对象接口
规定客户程序与服务器程序的交互接口。 - 远程对象实现
为远程对象接口规定的每个方法提供具体实现。 - 服务程序
创建远程对象实现并注册。 - 客户程序
与终端用户交互,调用远程对象提供的服务
RMI服务注册
提供远程服务的对象必须注册到RMI命名服务器,记录名字与对象的和关系。
RMI注册表rmiregistry是运行在服务器上的一个后台进程,必须在服务程序启动之前就已启动完毕,它相当于客户程序与服务程序之间的通信网关。
服务程序将远程对象的名字注册到RMI注册表,客户程序通过RMI注册表将远程对象名字解析为远程对象引用,通过该对象引用调用远程对象上的方法。