网络通信基础

云计算中的通信技术 - 图1

套接字socket

云计算中的通信技术 - 图2

两种含义

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一般架构结构

云计算中的通信技术 - 图3

RMI(远程方法调用)模型

RMI的服务程序通常是一个Java应用程序

而客户程序既可以是一个Java应用程序,也可以是一个Java Applet。

RMI体系结构

云计算中的通信技术 - 图4

存根/框架层

存根是远程对象在客户端的代理,负责将远程调用请求通过远程引用层和传输层转发给服务端的框架

客户程序中的远程对象引用实际上是对本地存根的引用

框架将来自客户端的远程调用申请在服务端接收,并负责调用相应的对象方法,再将结果返回给客户端。

关键技术

对象串行化技术:存根与框架利用对象串行化技术打包(marshal)与解包(unmarshal)远程调用的参数与返回值。

动态类装载技术:动态类装载技术用于支持将客户端的存根作为远程对象本身,存根实现了相同的远程接口集合,从而支持Java语言的类型检查与类型转换机制。

远程引用层和传输层

远程引用层定义和支持RMI连接的调用语法、语义,远程引用层还为上一层屏蔽了服务程序的激活方式。

传输层建立于TCP/IP之上,主要负责Java虚拟机之间的连接,侦听调用请求,建立连接,管理和监视连接

RMI分布式应用程序基本构成

  1. 远程对象接口
    规定客户程序与服务器程序的交互接口。
  2. 远程对象实现
    为远程对象接口规定的每个方法提供具体实现。
  3. 服务程序
    创建远程对象实现并注册。
  4. 客户程序
    与终端用户交互,调用远程对象提供的服务

RMI服务注册

提供远程服务的对象必须注册到RMI命名服务器,记录名字与对象的和关系。

RMI注册表rmiregistry是运行在服务器上的一个后台进程,必须在服务程序启动之前就已启动完毕,它相当于客户程序与服务程序之间的通信网关。

服务程序将远程对象的名字注册到RMI注册表,客户程序通过RMI注册表将远程对象名字解析为远程对象引用,通过该对象引用调用远程对象上的方法。