通信设计空间
讨论以下网络编程中的通信设计空间:
- 无连接协议与面向连接协议
- 同步及异步消息交换
- 消息传递与共享内存
1.无连接协议与面向连接协议
需要权衡的地方:延迟、可伸缩性、可靠性
无连接协议:
-
提供面向消息的服务。
-
每一条消息都可以独立寻址和发送
-
一般采用”尽力“发送语义
-
这些语义不保证某组消息会以特定次序到达目的地,甚至根本不会到达目的地
如用户数据报协议(UDP)、网际协议(IP)。
这些协议可以被多倍体应用程序使用,这些应用允许一定程度的数据丢失。
UDP/IP还支持不可靠的多播和广播功能,允许一个发送者和一组接收者进行通信。
面向连接协议
- 提供可靠、有序、不重复的发送服务
- 用于不允许数据丢失的应用程序
- 在发送端和接收端交换并维护状态信息。
如传输控制协议(TCP),用于很多面向会话的应用,如web服务和电子邮件。
数据成帧策略 & 连接多路复用策略
使用面向连接协议时,应用程序和中间件开发者还必须做出以下设计选择:
- 数据成帧策略
比如TCP,是一种字节流协议,不保护应用程序的边界。
因此在TCP上,如果某一应用程序通过4个send()
传输4条不同的消息,会有一个或多个(可能大于四个)TCP数据段(segment)被传输给接收端。
所以,如果需要面向消息发送,发送端和接收端必须执行将4条在TCP上交换的消息分割成帧的处理。
- 连接多路复用策略
两个一般性策略:
- 多路复用
一个进程中的多个线程发出的所有客户请求都通过一条TCP连接传递给一个服务器进程。
优点:节省OS的通信资源(如socket句柄和连接控制块)。
缺点:难以编程,缺乏效率和确定性。
这些问题源自”同步“机制和”环境切换“机制。多路连接上,这些机制用来将请求和应答联系起来。
- 非多路复用:
每一个客户都使用不同的连接和对等服务器通信。
优点:可以更好地控制通信地优先级。在非多路复用连接地设计中,每一个连接地优先级可以单独设定,这样一来,即使其他线程之间存在大量低优先级通信任务,高优先级通信也可以快速完成。(这避免了低优先级线程占用一个单独的多路连接,即优先级倒置现象)
此外,因为连接没有被共享,这个策略的同步开销很小,这是因为发送和接收双向请求时不需要额外的锁定工作。
缺点:需要更多OS资源,在某些环境中伸缩性不是很好。
2.同步及异步消息交换
网络应用程序中,客户向服务器发送一个请求,服务器在处理这个请求后返回一个应答。
管理请求/应答协议交换有两种可选策略——同步和异步。
选择同步或者异步需要考虑两个因素:
- 请求之间的关联性
- 底层协议或传输介质的延迟
同步的请求/应答协议
-
是最容易实现的形式
-
请求和应答以锁步次序交换:每一个请求必须同步地接收到一个应答,然后才能发送下一个请求。
-
适用场景:
-
请求的结果影响后续请求的决定。例如要交换验证信息,需要安全认证信息交换成功后才能发送机密信息请求。
-
应用程序中交换的信息需要在低延迟网络中执行短期处理。(如高速LAN中的NFS
read()
和write()
操作) -
如果实现的简易性、协议交换的少量性,重要于异步请求/应答协议可能的获得性能上的提高的话,就选择同步的方式。
异步的请求/应答协议
-
异步方式将请求从客户连续发送至服务器,无需同步地等待应答。
-
因为无需等待应答,异步需要一种策略来检查请求的丢失或失败,然后重新发送
-
应答的顺序可能不同于请求的顺序
-
适用场景:
- 无需应答就可以决定后续请求。
- 通信的延迟与请求所需的处理时间密切相关。此时异步策略有利于有效利用网络以减少高延迟带来的影响。
- 对性能提高的侧重大于将应答和请求关联起来并实现重试的策略所带来的额外复杂度。
3.消息传递与内存共享
消息传递
信息在不同计算机的对等体之间传输,称为消息传递。消息传递是明确地通过IPC(进程间通信)机制来交换字节流和面向记录地数据。
- 消息传递IPC机制通过IPC信道,将数据以消息的形式从一个进程或线程传输给另一个进程或线程。
- 如果要传输的数据量很大,数据就会被分段,以消息序列的形式发送。
- 如果有一个以上的进程接收数据,则每一条消息会发送多次,每次发送给一个接收者。
- 很多流行的中间件体系结构,如PRC(Remote Procedure Call,远程过程调用)、CORBA(Common Object Request Broker Architecture,通用对象请求代理结构)和MOM(Message-oriented middleware,面向消息中间件),其内部都是基于消息传递通信模型。
内存共享
内存共享允许相同或不同主机上的多个进程访问和交换数据,仿佛数据是位于每个进程的本地地址空间意义。
-
如果数据必须被多个进程读取与处理,内存共享是比消息传递更有效的通信机制
-
若要在应用程序中使用原始的OS共享内存机制,则应用程序需要定位和映射共享内存区,还要定义放在共享内存内的数据结构。
-
本地内存共享
本地内存共享允许同一计算机上的进程拥有一个或多个内存共享区,这些内存区被映射为不同的虚拟地址范围。
常见的共享内存机制有:
-
System V UNIX内存共享。
-
内存映射文件:
一个文件的部分或者全部被映射到一块虚拟内存区,此虚拟内存区被多个进程共享。内存映射文件的内容可以转存到永久存储器中。这样一来,它提供了一条在执行程序之间保存和回复信息的捷径。
所有可以映射共享内存区的进程都可以直接读写其中的内容,这具有相当的灵活性。然而编程时开发者必须保证共享数据不被竞态条件破坏。
-
-
分布式内存共享
分布式内存共享是程序设计中的一种抽象,它扩展了OS虚拟内存机制。
虚拟内存机制提供了一组策略,用于必要时来获取、放置、替换一组内存页,从而让程序看起来自己享是拥有了一块比实际物理内存要大的地址空间。
- 分布式内存共享在网络上扩展了虚存的概念,以通过全局/共享内存中的数据进行透明的进程间通信
- 它是共享内存多处理器和分布式系统这两种计算范式(computing paradigm)的结合。
- 在一些平台上,多台计算机被cluster为一套逻辑系统,系统中的内存在cluster中共享而被网络计算机共同管理,应用程序通过该共享内存通信。分布式共享内存系统提供了配合进程和网络节点更新的机制。通常这样的通信模型在底层会使用消息传递机制,来协调数据交换,使读取者与写入者同步。
消息传递IPC模型在实际应用中比分布式内存共享更常见。
网友评论