网络通信设计模式

时间:2009-03-22 10:19:41

标签: design-patterns network-programming network-protocols

我已经意识到我过去曾问过的几个问题,例如this,实际上归结为一个更基本的问题。

是否有任何众所周知的网络通信设计模式,以及它的性质,协议构造/解析?谷歌搜索没有透露太多。

请注意,我不是在寻找任何特定问题的解决方案,我正在寻找处理网络通信及其协议的文档化设计模式。

编辑:

请不要提出各种实施细节或讨论具体协议,除非它与设计模式相关联。协议设计不是问题,它是用于创建或解析我正在寻找的协议的设计模式,更不用说通信模式本身了。

EDIT2:

我发现很难相信没有人提出任何常见的网络通信模式。是的,我知道“这取决于”,但你可以说任何项目,但有很多模式涵盖一般的想法。

7 个答案:

答案 0 :(得分:13)

这是一个相当广泛的问题,它的处理可能需要一本相当密集的书。

我自己并不知道任何此类资源,但让我们考虑一下并考虑网络通信模式空间的维度:

连接模式:{基于连接,无连接}

互动模式:{同步,异步}

会话复杂性:{command-response,dialog}

消息表单:{freeform-stream,半结构化块,完全结构化块} ..?

一个好的起点是采用TCP / IP系列协议,将它们映射到上述空间,并查看在上述协议中占据独特位置的一个或多个样本的实现 - 特征模式空间。你最喜欢的* nix操作系统的源代码是个好看的地方。

解析器实现可能分为两大类:{命令交换处理,有限状态机}。

前者(显然)是两者中较简单的,可能是初始实现(除非你之前已经做过这类事)。

后者(可能)更健壮,更有效(就loc而言),并且允许对协议进行更改(如果仍然需要进行设计更改)。

(底层(虚拟)OS网络设施(当然)也会对实现产生很大影响。例如,采用JVM:基于NIO选择的通道处理可以很好地与FSM配合使用。)

希望有所帮助。

答案 1 :(得分:8)

我想说,责任链模式对于从网络发送/接收数据非常有用。

您构建了一系列命令以从客户端发送到服务器。 每个命令都通过责任链进行处理,并添加数据以正确处理命令。

在数据发送时,链可能看起来像那样


Command   --> Wrap some       --> Encrypt --> Send data
to send       data around 
              the command 
              (source, extra 
              information if 
              needed)

在数据接收上,链可能类似,但反过来

Receive Data  -->  Decrypt --> Unwrap extra data --> Execute command

您可以查看此文章,了解有关责任链的更多信息。 http://www.vincehuston.org/dp/chain.html

答案 2 :(得分:3)

我建议:抽象出网络协议。

首先确定它们之间的功能,模块和API。然后决定数据将通过网络传输的协议。

然后仔细地将所有网络问题封装在他们自己的层中,以便稍后可以以与功能正交的方式应用加密,压缩,添加http传输(以传递防火墙)或任何您想要添加的内容。

答案 3 :(得分:2)

接受器/连接器模式:http://www.cs.wustl.edu/~schmidt/PDF/Acceptor.pdf

过滤器链基于Gof Chain Of Responsabiliy,它被用于许多网络堆栈/框架中。

用于编码/解码PDU的状态机。

答案 4 :(得分:0)

我不了解设计模式,但研究现有协议可能是一个很好的起点,特别是已经标准化的“现代”协议。

BitTorrent是一种非常受欢迎的分散协议,有许多扩展。

OpenSSH是另一个不错的候选人;它支持功能协商,多种加密类型和解复用通道。

VoIP协议适用于流媒体应用:RTP和H.323

网络路由协议也很好:BGP(和扩展),LDP,VRRP / CARP。

答案 5 :(得分:-1)

我不知道模式,但是有一些“明显的”选择点。 首先,您是否想要使用ASN.1(这会影响整个批次)? 其次,您想要一个人类可读的协议还是一个二进制协议? 第三,您希望协议中有任何安全方面吗?

并非回答“想要使用ASN.1”会强制回答很多协议设计问题。

答案 6 :(得分:-1)

没有详细说明,但我想this是好文档:

此外,this看起来是一本好书: