第3讲 进程间通信

3.1 简介

UDP的应用程序接口提供了消息传递(Message Passing)抽象
-进程间通信的最简单形式
-使得发送进程能够给一个接收进程传递一个消息
-包含消息的独立的数据包称为数据报(datagram)

TCP的应用程序接口提供了进程对之间的双向流(two-way stream)抽象
-相互通信的信息由没有消息边界的一连串数据项组成
-双向流为生产者—消费者通信提供了构造成分

3.2 互联网协议的API

1 进程间通信的特征
由Send和Receive这两个消息通信操作来支持一对进程间进行的消息传递,均用目的地和消息定义
一个进程发送一个消息到目的地,在目的地的另一个进程接收消息
该活动设计发送进程到接收进程间的数据通信,涉及两个进程的同步

同步和异步通信
每个消息目的地与一个队列相关:发送进程将消息添加到远程队列中,接收进程从本地队列中移除消息
发送进程和接收进程间可以是同步也可以是异步的
-同步(synchronous)通信
发送进程和接收进程在每个消息上同步
Send和Receive都是阻塞操作
-异步(asynchronous)通信
Send操作是非阻塞的,只要消息复制到本地缓冲区,发送进程就可以继续其他处理
消息传递和发送进程并行
Receive操作包括阻塞和非阻塞两种形式

什么是Socket
独立于具体协议的网络编程接口
在ISO模型中,主要位于会话层和传输层之间
BSD Socket(伯克利套接字)是通过标准的UNIX文件描述符和其它程序通讯的一个方法,目前已经被广泛移植到各个平台。

Socket类型
流式套接字(SOCK_STREAM)
-提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制,避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制。
数据报套接字(SOCK_DGRAM)
-提供无连接服务。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收。
原始套接字(SOCK_RAW)
-可以对较低层次协议,如IP、ICMP直接访问。

不同操作系统中的Socket
Windows Socket (Winsock)
Linux Socket (BSD Socket)

2 套接字
UDP和TCP都是用套接字(Socket)抽象
套接字提供进程间通信的一个端点
进程间通信是在两个进程各自的一个套接字之间传送一个消息

用于互联网地址的Java API
Java提供了一个InetAddress类,用以表示互联网地址
可以通过调用InetAddress的静态方法来获得地址
InetAddress aComputer = InetAddress.getByName(“bruno.dcs.qmul.ac.uk”)
InetAddress类封装了互联网地址的细节,可以表示IPv4和IPv6

3 UDP数据报通信
由UDP发送的数据报从发送进程传输到接收进程,不需要确认或重发。如果发生故障,消息可能无法到达目的地。
当一个进程send数据报,另一个进程receive该数据报时,数据报就会在进程间传送。
要发送或接收消息,进程必须首先创建于一个本地主机的互联网地址和本地端口绑定的套接字。
-服务器将它的套接字绑定到一个服务器端口(server port),该端口应让客户端知道,以便客户端给该端口发送消息
-客户将它的套接字绑定到任何一个空闲的本地端口。
-Receive方法除了获得消息外,还获得发送方的互联网地址和端口,这些信息允许接收方发送应答。

数据报通讯相关问题
-消息大小(message size)
接收进程要指定固定大小的用于接收消息的字节数组。
如果消息大于数组大小,那么消息会在到达时被截断。
-阻塞(blocking)
套接字通常会提供非阻塞的send操作和阻塞的receive操作
除非套接字上设置了超时,否则receive方法将会一直阻塞直到接收到一个数据报为止。
-超时(timeout)
在有些程序中,receive操作不适合无限制等待下去
-任意接收(receive from any)
receive方法不指定消息的来源

UDP的使用
对一些应用而言,使用偶尔有遗漏故障的服务是可接受的-域名服务、VOIP等
UDP的优势在于没有保证消息传递相关的开销
UDP的开销主要包括:
需要在源和目的地存储状态信息
传输额外的消息
发送方的延迟

4 TCP流通信
TCP协议的API源于BSD 4.x UNIX,它提供了可读写的字节流。
流抽象可以隐藏网络的下列特征:
消息大小(message size)
消息丢失(lost message)
流控制(flow control)
消息重复和排序(message duplicate and ordering)
消息的目的地(message destination)

客户和服务器的套接字对由一对流相连接,每个方向一个流
每个套接字都有一个输入流,一个输出流
进程对中的任何一个进程都可以通过将信息写入它的输出流来发送信息给另外一个进程,而另一个进程可以通过读取它的输入流来获得信息
当一个应用close一个套接字时,表示它不再写任何数据到它的输出流。输出缓冲区的中所有数据被送到流的另一端,放在目的地套接字的队列中,并指明流已断开。

3.3 外部数据表示和编码

存储在运行的程序中的信息都表示成数据结构,而消息中的信息由字节序列组成
不论使用何种通信形式,数据结构在传输时都必须转换成字节序列,到达目的地后再重构
在消息中传送的单个简单数据项可以是不同类型的数据值

编码(marshalling)是将多个数据项组成合适消息传送的格式的过程
解码(unmarshalling)是在消息到达后分解消息,在目的地生成相等的数据项的过程

1 CORBA的公共数据表示
CORBA的公共数据表示(Common Data Representation, CDR)是CORBA 2.0定义的外部数据表示。
CDR能表示所有在CORBA远程调用中用作参数和返回值的数据类型。
基础类型(Primitive):
CDR定义了大序法排序和小序法排序的表示
值按照发送端消息中指定的顺序传送
接收端如果要求不同的顺序就要进行翻译
结构化类型(Constructed Types):
组成每个结构化类型的简单类型值按特定的顺序加到字节序列中

CORBA中的编码
根据在消息中传送的数据项类型的规约,可以自动生成编码操作
数据结构的类型和基本数据类型用CORBA IDL描述
CORBA接口编译器根据远程方法的参数类型和结果类型的定义为参数和结果生成适当的编码和解码操作

2 JAVA对象序列化
在Java RMI中,对象和简单数据值都可以作为方法调用的参数和结果传递。一个对象是一个Java类的实例。
例如:CORBA IDL中定义的Person struct作用相当于Java类

Public class Person implements Serializable{
        private String name;
        private String place;
        private int year;
        public Person(String aName, String aPlace, int aYear){
              name = aName;
              place = aPlace;
              year = aYear;
        }
}

上面的类表明实现了Serializable接口,该接口没有方法,意味着它的实例能够序列化

3 可扩展标记语言
可扩展标记语言(Extensible Markup Language, XML)
XML和HTML都是从SGML(标准化的通用标记语言)派生出来的
XML数据项以“标记”串做标签,标记用于描述数据的逻辑结构,并将属性—值对与逻辑结构关联起来。
XML可用于实现客户与Web服务的通信以及定义Web服务的接口和其他属性
XML是可扩展的,这意味着用户能定义自己的标记
XML文档是文本形式存储的
-使得XML可以独立于某个平台
-使用文本而不是二进制会使得消息内容变大

4 远程对象引用
客户端调用远程对象中的一个方法时,就会向存放远程对象的服务器进程发送一个调用消息。这个消息需要指定哪一个对象具有要调用的方法。
远程对象引用(remote object reference)是远程对象的标识符,在整个分布式系统中有效。
远程对象引用在调用消息中传递,以指定调用哪一个对象。
远程对象应用必须确保空间和时间唯一性的方法生成
-在远程对象上有许多进程,所以远程对象引用在分布式系统的所有进程中必须是唯一的

3.4 组播通信

一个进程与一组进程通信是必要的
消息成对交换不是一个进程到一组进程通信的最佳模式
组播操作(multicast operation)是更合适的方式
-将单个消息从一个进程发送到一组进程的每个成员的操作
-组的成员对发送方通常是透明的
组播的行为有很多种情况,最简单的组播不提供消息传递保证或排序保证

组播消息为构造具有下列特征的分布式系统提供了基础设施:
-基于复制服务的容错
一个复制服务由一组服务组成,客户请求被组播到所有成员,每个成员执行相同操作
-在自发网络中发现服务
客户和服务器使用组播消息来找到可用的发现服务
-通过复制的数据获得更好的性能
例如:数据副本放在用户计算机上,每次数据改变,新值就组播到副本数据各个进程中
-事件通知的传播
在发生某些事件时通知相关进程

3.5 网络虚拟化:覆盖网络

互联网通信协议通过API提供了一组有效的构造分布式软件的构造块
-不断增加的大量不同类型的应用在互联网上并存
-改变互联网协议来适用运行在其上的每一个应用是不实际的
-IP传输服务是实现在网络技术之上的
网络虚拟化涉及在一个已有的网络之上构造多个不同的虚拟网络
每个虚拟网络被设计成支持一个特定的分布式应用
-支持多媒体数据流、多人在线游戏
面向特定应用的虚拟网络构建在一个已有的网络上并为特定的应用进行优化,而不改变底层网络的特征

覆盖网络(overlay network)
节点和虚拟链接组成的虚拟网络,位于一个底层网络之上
-满足一类应用需求的服务或一个特别高层的服务,例如:多媒体内容分发
-在一个给定的联网环境中的更有效的操作,例如:在一个自组织网络中的路由
-额外的特色,例如:组播或安全通道

覆盖网络的好处:
不改变底层网络就能定义新的网络服务-取决于该领域标准化的水平和修补底层路由功能的困难
鼓励对网络服务进行实验和对服务进行面向特定应用的定制
能定义多个覆盖网,它们能同时存在,从而形成更开放和扩展的网络体系结构

覆盖网的不足:
引入了额外的间接层(因此可能会有性能损失)

覆盖网与熟悉的分层概念相关:
一个覆盖网是一层,是标准体系结构(TCP/IP)外存在的一层
覆盖网可以定义如上所述的网络的核心元素:寻址模式、扫采用的协议、路由方法等

Skype:一个覆盖网络的例子
Skype是一个对等应用,在IP上提供语音电话服务(Voice over IP)。
-包括SkypeIn和SkypeOut提供即时消息、视频会议和标准电话服务的接口
-2009年已有3.7亿用户
Skype在不修改互联网体系结构的前提了,展示了如何以应用特定的方式提供高级功能。
Skype构建了一个虚拟网络,用于建立用户间的连接。在此之上创建一个呼叫无需IP地址或端口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值