开放式系统:可按照协议进行通信
协议:消息的格式、内容和意义
协议的种类:
ISO OSI参考模型分层协议(1983)
ISO OSI参考模型的特点
报文(message)格式:
物理层:
数据链路层:
网络层:
传输层
会话层:
表示层:
应用层:
中间件层(Middleware)
电子邮件:
保存方式
交互方式
像本地子程序一样,调用远地子程序;调用者和被调用者都不用考虑消息通信
int read(int fd, char* buf, int nbytes);
count = read(fd, buf, nbytes);
参数传递:
客户存根程序(client stub):主程序端的子程序代理
服务器存根程序:子程序端的主程序代理
效果:讲客户过程对客户存根发出的本地调用转换成对服务器过程的本地调用,而客户和服务器都不会意识到有中间步骤的存在。
参数编排(marshalling):将参数装入消息
参数编排(marshalling):将参数装入消息
例:远程过程 add(i,j)
例: x0005,’JILL’; x5000,’JILL’; x0005,’LLIJ’
延期的同步RPC(deferred synchronous RPC)
客户发出请求后, 不等待服务器应答, 立即继续执行
DCE(Distributed Computing Environment)
IDL编译器输出
头文件 :如c语言形式的interface.h
客户存根程序:由客户程序调用的过程
服务器存根程序:由运行系统调用的过程
最多一次(at-most-once) : 不重复执行
幂等性(Idempotent) : 可重复执行, 效果相同
支持TCP/IP的 Berkeley Sockets 原语
使用Socket的面向连接的通信模式
消息队列系统(message queuing system)
面向消息的中间件(MOM, message oriented middleware)
使用消息队列的四种松散耦合通信
原语 | 意义 |
Put |
将消息追加进指定队列 |
Get |
调用进程阻塞,直到指定队列变为非空为止,然后取出队列中的第一个消息 |
Poll |
查看指定队列中的消息,并且取出队列中的第一个消息。不阻塞调用进程。 |
Notify |
注册一个处理程序,在有消息进入指定队列时调用该处理程序。 |
队列分类:
队列寻址
队列管理器
队列层寻址和网络层寻址之间的联系
带有路由器的消息队列系统的结构
作用
实现
消息队列系统中消息代理器的通用结构
通道: 实现发送方和接收方QM之间的单向的、可靠的连接
消息通道代理(MCA)
通道代理的启动
通道代理的关闭
通道代理的属性:
属性 | 描述 |
Transport type | 决定要采用的传输协议 |
FIFO delivery | 表明消息将要按照发送的次序到达 |
Message length | 单个消息的最大长度 |
Setup retry count | 指定启动远程MCA的最大重试次数 |
Delivery retries | MCA将收到的消息放入队列的最大重试次数 |
组:由系统或用户确定的若干个进程的集合
通信方式:
封闭组:只有组内成员之间可以广播通信
开放组:反之,组外进程也可以对组内进行广播
对等组:成员之间的地位是平等的
分层组:反之,存在控制其他节点的超级节点,称为协调者
组的成员籍管理(membership)
组的加入/退出
组的寻址
group_send
group_receive
one-way
)模型原子性广播:一个消息被所有成员接收到,或者,一个也没有接收到。
全局时间顺序
if ts(m1) < ts(m2) then G(m1) < G(m2)
[//]: # (G表示所有组员收到消息m的时间)一致性时间顺序
G(m1) < G(m2)
或者 G(m2) < G(m1)
例:不一致性问题
在不同组之间的进行协调非常困难
例:在互联网络上,网关会在多个LAN上重复传送一个消息
很难在跨网络环境上实现
ISIS:康奈尔大学开发的工具集(1987)
因果相关的(causally-related):如果事件A的发生可能影响事件B的发生,或反之
并发的(concurrent):事件A的发生与事件B的发生没有关系
时间戳向量:设组内有n个进程,每个进程设置一个n元向量 V [ n ] = { V [ 1 ] , V [ 2 ] , . . . , V [ n ] } V[n] = \{V[1], V[2], ..., V[n]\} V[n]={V[1],V[2],...,V[n]}
发送者:修改向量:$ V[j] = V[j] + 1; $(第j个进程)
接收者:
其中, V i V_i Vi是发送方向量种的第i位, L i L_i Li是接收方向量中的第i位,假设消息由进程j发送。
示例:
举例1:对于下列表格表示的进程,由进程1向其他的进程发送消息,此时刻,哪些进程需要等待,哪些进行可以接收消息。
对于此题,需要分别分析两个条件是否满足。
对于条件(1):消息由进程1发送,则首先需要满足 V 1 = L 1 + 1 V_1 = L_1 + 1 V1=L1+1
也就是对于每个进程的第一维数据(4,3,3,3,2,3)而言,4=3+1,所以可以看出进程5不能接收消息,需要等待,其余进程均满足条件(1)。
对于条件(2):消息由进程1发送,则需要满足 i ≠ j i \neq j i=j(即所有进程排除第一维数据),有 V i ≤ L i V_i ≤ L_i Vi≤Li
所以对于1-6这几个进程而言,排除第一维数据后,其余的数据都需要比进程1的各维数据相等或更大,所以可以看出对于进程3而言5<6,所以进程3不能接收消息,需要等待。
综上两个条件,进程3,5需要等待,其余进程均可同时满足条件(1)(2),所以可以接收进程1发送的消息。
示例2:下面表格中分别是进程1到进程6中消息的时间戳向量,在满足因果关系的前提下,试分析说明进程2中当前的消息m在哪些进程中能够递交,在哪些进程中暂时不能递交。
1 | 2 | 3 | 4 | 5 | 6 | |||||
7 | 7 | 7 | 5 | 7 | 7 | |||||
5 | 7 | 6 | 6 | 6 | 6 | |||||
5 | 5 | 5 | 5 | 5 | 5 | |||||
4 | 4 | 4 | 4 | 3 | 4 | |||||
3 | 3 | 3 | 3 | 3 | 3 | |||||
1 | 1 | 1 | 1 | 1 | 1 |
就是进程1,4,5需要等待;3,6可以接收消息。
将节点组织成一个覆盖网络(overlay network),用来实现组通信
树型覆盖网络:节点之间只有唯一路径
网状覆盖网络:节点之间由多条路径
覆盖网络的链接与实际网络层中路由器的链接之间的关系
链接树(link tree):计算数据包通过每个物理链接的次数
延长(stretch)或相对延时惩罚(relative delay penalty)
两个节点之间的延时比
Cost(B-Rb-Ra-Rc-C) =59
Cost (B-Rb-Rd-Rc-C) =47
stretch = 59/47 = 1.25
树开销
传染协议(epidemic protocol):用于使本地信息在大规模节点集合中快速地传播
消息传播模型:基于传染病理论
节点状态
O(log(N))
轮,N为系统的节点数。谣传(rumor spreading)或称为传言(gossiping)
仍为疑似的服务器的比例: s = e − ( k + 1 ) ( 1 − s ) s=e^{-(k+1)(1-s)} s=e−(k+1)(1−s)
有 1 / k 1/k 1/k 不再传播信息的概率
例如: k = 4 , s < 0.007 k=4,s<0.007 k=4,s<0.007,即0.7% 未被感染
旧版本问题
死亡证