本篇文章主要介绍

.无连接的和面向连接的协议之间的对比

.同步的和异步的消息交换之间的对比。

.消息传递和共享内存之间的对比。

1:无连接和面向连接的协议对比

  协议(protocol)是指一组规则,这些规则指明控制和数据信息如何在通信实体之间进行交换,比如说网络计算机环境内部做交互的应用进程这样的通信实体之间进行交换,协议通常分为无连接和面向连接的,在这一空间中需要做权衡取舍的方面主要包括延迟、可伸缩性和可靠性。

  无连接的协议提供了一种面向消息的服务,在这一服务中,每个消息都可以独立做路由和派发。无连接的协议经常使用“尽力而为”的传送语义,这样的语义并不保证一系列的消息会以某个特定的顺序到达它们的目的地,甚至不能保证它们能够到达目的地。

  用户数据报协议(User Datagram Protocol,UDP)和网际协议(Internet Protocol,IP)是两个广泛使用的无连接协议的例子,这些协议可以由诸如IP语音或流式视频一类的多媒体应用直接使用,这些应用可以容忍某种程度的数据丢失,UDP/IP还支持不可靠的组播和广播功能,这些功能是一个发送方可以与一组接收方通信。

  面向连接的协议提供了一个可靠、有序、不重复的发送服务,对于不能容忍数据丢失的应用来说,这一协议很有用,为了提高性能并确保可靠性,面向连接的协议交换和维护发送方和/或(一个或多个)接收方的状态信息。传输控制协议(TCP)就是一个面向连接的协议,他被应用在许多诸如web服务和电子邮件一类的面向会话的互联网应用中。

  在使用面向连接的协议的时候,应用和中间件的开发者还需要从如下的可选设计方案中做出选择:

(1):面向连接的协议提供了不同类型的数据组帧策略,例如,面向消息的传递策略由诸如TP4和XTP这样的一些面向连接的协议提供支持,相比之下,TCP则是一个并不保留应用消息的边界的字节流(bytestream)协议,因此,如果一个应用做了四次send()调用来通过TCP传输四个不同的消息的话,那么将有一个或多个(有可能多于四个)TCP段被传送给接收方。如果应用为此要求的是面向消息的派发的话,则发送方和接收方必须执行额外的处理把经由TCP交换的四个消息组成帧。如果消息的长度总是相等的,且网络错误从未发生,那么组成帧过程就会相对简单,否则,这将会一个不可忽视的问题。

(2):连接的多路复用策略

  在一个面向连接的协议上传输数据的两种常见的策略如下:

  

.多路复用。在这种连接策略中,从单个进程的多个线程发出的所有客户端请求都通过一个TCP连接传给服务器端进程,如上图(1)连接多路复用的一个优点是:节省了OS(操作系统)的诸如socket句柄和连接控制块一类的通信资源。这一策略的缺点是,编程的难度更高一些,效率更低一些,且不确定性更大一些。这些问题源于同步和上下文切换机制,这些机制需要把一个多路复用连接上的请求和应答关联起来。

.非多路复用。在这种策略中,每个客户端使用一个不同的连接来与一个对等的服务通信,如图(2)所示,非多路复用的连接的一个主要优点是对通信的优先级能进行的更好的控制,在非多路复用的连接设计中,每个连接的优先级可以做单独设置,这样具有高优先级的通信就会被较快的传递出去,即使在其他的线程之间存在着大量的低优先级的通信也是如此,这种设计避免了优先级的倒置,在这种情况下,低优先级线程会独占单一的一个多路复用连接。此外由于连接是非共享的,因此这一策略会带来较低的同步开销,因为不需要额外的锁来发送和接收双向的请求,与多路复用连接策略相比,非多路复用策略使用了更多的OS资源,因此在诸如大规模的互联网电子商务服务器一类的环境中,其伸缩性不是太好。

2:同步和异步的消息交换对比

  在许多网络应用中,客户端给服务器端发送一个请求,服务器处理请求后往回发送一个响应,这些请求/响应协议既可以在无连接协议上实现,也可以在面向连接的协议上实现,安排请求/响应(request/response)协议做交换的两种可选策略分别是同步的和异步的

  如下图所示:

      (1)同步消息交换策略                  (2)异步消息交换策略

影响到是选异步还是同步的消息交换策略的两大元素是:

(1)请求之间的相互关联性

(2)底层协议或通信介质的延迟

同步的请求/响应协议是最简单的实现形式,在这类协议中,请求和响应是以一种锁步(lock-step)顺序进行交换的,每个请求在下一个请求发送之前都必须要同步接收到一个响应,如上图(1)所示,同步的请求/响应协议适用下列情况

  .当请求的结果决定决定了后续的请求时,例如,一个要求验证交换的应用必须要等到安全证书完全成功交换之后才会发送敏感信息请求。

  .当用户交换的信息需要在低延迟网络中做短时间处理时,例如,在高速局域网络中NFS(网络文件系统 Network File System)的read()和write()操作

异步的请求/响应协议的请求持续地从客户端发向服务器而无须同步等待响应,在任何来自服务器端的响应到达之前,多个客户端请求就可以传送出去,如上图(2),因此,异步的请求/响应协议往往要求有一种检测请求丢失或失败,并在之后重新发送它们的策略。异步的请求/响应适用于下列情况:

  .在决定后续的请求之前不需要响应的时候,例如,Web浏览器可以使用异步策略从同一服务器提取多个内嵌的图像,由于每个请求都是独立的,因此它们都可以做异步的发送而无须等待响应,每个响应都包含了浏览器可用来把它与之相应的请求做匹配的信息,即便是响应的顺序与请求发送的顺序不一致也不会出现问题。

  .当通信延迟与请求所要求的处理时间高度相关的时候,异步请求策略有助于高效地使用网络,减少高延迟的影响。与关联响应和请求,以及正确实现重试策略所带来的额外复杂性相比,由此产生的性能改善更加有价值。

3:消息传递和共享内存的对比

  以上讨论的都是假设消息是在驻留与不同计算机上的对等端(peer)之间做传输的,这种交换方式被称作消息传递。当通信的对等端访问某个共享内存区域时,就会出现另一种类型的消息交换。

  消息传递是IPC(进程间通信)机制来显示地交换字节流和面向记录的数据。应用开发者通常会定义这些消息的格式和内容,以及参与者必须遵循的用于交换消息的应用协议。相应应用协议还定义了每个交换【如点对点(点播,组播或广播】的可能参与者的个数,以及参与者开始、进行以及结束每个消息传递会话的方式。

  

  消息传递IPC机制通过一个IPC通道把数据以消息的方式从一个进程或线程传递到另一个进程或线程中,如上图(1)所示,如果有大量的数据要做传输的话,数据可能会做分段处理,然后在消息序列中进行发送。如果有多于一个进程在接收数据的话,每个消息可能都要发送多次,每次发给一个接收者。许多流行的中间件框架,如RPC以及面向消息的中间件(Message-Oriented Minddleware, MOM)等,其内部都是基于消息传递这一通信模型的。

  共享内存(shared memory)允许位于同一或不同主机上的多个进程访问和交换数据,就像数据本身就位于每个进程的本地地址空间中一样,当网络应用拥有需要由多个进程来查看和/或操纵的数据时,共享内存的措施可能是比消息传递更有效的通信机制。使用了本地的OS共享内存机制的应用需要定义的是,定位和映射共享内存区域的方式,以及放置在共享内存中的数据结构,而不是定义在实体之间传输消息的方法。

  共享内存可分为本地的和分布式的,具体介绍如下:

  

  本地的共享内存

  本地的共享内存允许位于同一计算机上的多个进程把一个或多个共享内存区域映射到不同的虚拟地址空间上,两种常见的共享内存机制如下:

  (1)System V UNIX 共享内存:  在这种情况下,shmget()系统函数创建一个新的共享内存区域或返回一个现有的,进程使用shmat()系统函数把共享内存区域挂接到它们的虚拟地址空间上。

  (2)内存映射文件:  在这种情况下,某个文件的部分或者全部都可以被映射到虚拟内存的某一块上,这部分虚拟内存跨多进程共享。映射到内存文件的内容可被刷新到永久存储器中,这种做法提供了一种便捷地保存和恢复跨程序执行的信息的途径。

在这两种机制中,OS都能够让多个进程把共享内存区域映射到它们的地址空间中,如上图(2),所有映射了共享内存区域的进程都能够直接对共享内存进行读写操作。

尽管共享内存很灵活,但通过共享内存在多个进程间进行通信的编程要非常小心,例如,应用开发者必须确保被共享的数据不会被竞争条件所破坏。

分布式的共享内存

  分布式的共享内存(distributed shared Memory,DSM)是一种编程抽象,它为应用提供了OS虚拟机制的一个扩展。虚拟内存提供了一组根据需要来提取、放置和取代一组页面的策略,以给程序这样一种错觉,即它们拥有比物理内存多得多的可用地址空间。DSM把虚拟内存概念扩展到了整个网络上,使得经由全局/共享内存中的数据进行透明化的进程化的进程间通信成为可能。它代表了两种计算范式的一个混合模式,这两种计算范式分别是:共享内存的多处理器和分布式系统。

  例如,存在这样的硬件/软件平台,这些平台把多台计算机集群成一个逻辑系统,在一系统中,内存是横跨集群共享的,参与其中的应用通过托管在整个网络的计算机上的共享内存来进行通信。DSM系统提供了横跨进程和网络节点的协调更新机制,这一通信模型通常在其较低的层面中采用消息传递机制来协调数据的交换及同步数据的读取和写入者。

本节完毕!!!!

ACE之通信的设计空间的更多相关文章

  1. Modbus RTU 通信工具设计(转)

    Modbus RTU 通信工具设计 Modbus 是一个工业上常用的通讯协议.一种通讯约定. ModBus 协议是应用层报文传输协议(OSI 模型第7层),它定义了一个与通信层无关的协议数据单元(PD ...

  2. 移动端与PHP服务端接口通信流程设计(增强版)

    前面讲过:移动端与PHP服务端接口通信流程设计(基础版) 对于 api_token 的校验,其安全性还可再增强: 增强地方一: 再增加2张表,一个接口表,一个授权表,设计参考如下: 接口表 字段名 字 ...

  3. 移动端与PHP服务端接口通信流程设计(基础版)

    针对 --->非开放性平台 --->公司内部产品 接口特点汇总: 1.因为是非开放性的,所以所有的接口都是封闭的,只对公司内部的产品有效: 2.因为是非开放性的,所以OAuth那套协议是行 ...

  4. 012 基于FPGA的网口通信实例设计【转载】

    一.网口通信设计分类 通过上面其他章节的介绍,网口千兆通信,可以使用TCP或者UDP协议,可以外挂PHY片或者不挂PHY片,总结下来就有下面几种方式完成通信: 图8‑17基于FPGA的网口通信实例设计 ...

  5. ACE框架 同步原语设计

    ACE框架常用的同步机制设计成统一的原语接口.同步原语使用系统平台(操作系统,多线程库)提供的同步原语,并为系统平台不提供的同步原语提供模拟实现.ACE框架使用了外观模式和适配器分两层,将同步原语统一 ...

  6. 移动端与PHP服务端接口通信流程设计(基础版)

    转载自:http://blog.snsgou.com/post-766.html --->非开放性平台 --->公司内部产品 接口特点汇总: 1.因为是非开放性的,所以所有的接口都是封闭的 ...

  7. 移动端与PHP服务端接口通信流程设计(增强版)

    增强地方一: 再增加2张表,一个接口表,一个授权表,设计参考如下: 接口表 字段名 字段类型 注释 api_id int 接口ID api_name varchar(120) 接口名,以"/ ...

  8. distri.lua线程间通信的设计

    首先简单介绍下distri.lua中的线程设计方案. distri.lua提供一个API函数fork用于创建新的C线程,这个C线程运行独立的lua虚拟机,为了在各线程之间通信 每个线程都会创建一个ch ...

  9. Windows进程通信-共享内存空间

    三个模块 1,game.exe,三个方法,控制台输入指令('A','B','R')分别控制三个方法的调用: 2,WGDll.dll,要注入到game进程中的dll文件: 3,myconsole.exe ...

随机推荐

  1. Vue常用开源项目汇总

    前言:Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅易于上手,还 ...

  2. 使用localStorage保存搜索记录

    //过滤一个结果的空记录添加,过滤空搜索 默认保存10条记录,自己可修改 function setHistoryItems(keyword) { keyword = keyword.replace(& ...

  3. 浅谈 JSON.stringify 方法

    一.前言 最近项目中,遇到需要将对象转换成字符串进行传递,上次写过一篇文章关于json字符串转换成json对象,json对象转换成字符串,值转换成字符串,字符串转成值.当时主要是用在有时候处理字符串和 ...

  4. git解决修改代码后无法push的问题failed to push some refs to 'ssh://git@xxx.xxx.xx/xx.git'

    今天在使用git提交代码的时候,犯了个很低级的错误,按照一切流程当我add并commit提交代码,最后使用push到远程仓库, 接下来奇怪的事情发生了,push之后,查看远程仓库代码并没有发现提交记录 ...

  5. 客户端(winform)更新

    winform更新有两种情况,一种是在线更新在线使用:直接右击项目发布出去就可以更新在线使用了.还有一种更新是不用一直连接网络的模式. 1:C#Winform程序如何发布并自动升级--------ht ...

  6. 云计算--网络原理与应用--20171123--网络地址转换NAT

    NAT的概述 NAT的配置 实验 一. NAT的概述 NAT(Network address translation,网络地址转换)通过将内部网络的的私有地址翻译成全球唯一的共有网络IP地址,是内部网 ...

  7. Transaction 事务简单详解

    Transaction 也就是所谓的事务了,通俗理解就是一件事情.从小,父母就教育我们,做事情要有始有终,不能半途而废. 事务也是这样,不能做一半就不做了,要么做完,要么就不做.也就是说,事务必须是一 ...

  8. 记录python接口自动化测试--pycharm执行测试用例时需要使用的姿势(解决if __name__ == "__main__":里面的程序不生效的问题)(第三目)

    1.只运行某一条case 把光标移动到某一条case后面,然后右键,选择"Run..."来运行程序 此时,pycharm会只运行光标所在位置的这一条case 2.如果想执行全部ca ...

  9. 高级软件工程第三次作业 赵坤&黄亦薇

    0.小组成员 赵坤2017282110261 黄亦薇201728210260 1.项目Github地址  https://github.com/zkself/homework3 PS:建议使用chro ...

  10. 2017-2018-1 Java演绎法 第二周 作业

    团队任务:讨论Android上的游戏软件 参考现代软件工程 第一章 [概论]练习与讨论: 软件有很多种,也有各种分类办法,本次团队任务是讨论选取Android上的一个游戏软件,考虑到每位组员接触的游戏 ...