网络通信设计模式

37

我意识到我过去提出的一些问题,例如这个,实际上可以归结为一个更基本的问题。

有没有关于网络通信的常用设计模式以及协议的构造/解析的模式?通过Google搜索并没有发现太多相关内容。

请注意,我不是在寻找任何特定问题的解决方案,而是在寻找有关网络通信及其协议的已记录的设计模式。

编辑:

除非与设计模式有关,否则请不要建议各种实现细节或讨论特定协议。协议设计不是问题所在,我正在寻找创建或解析协议的设计模式,更不用说通信模式本身了。

编辑2:

我很难相信没有人提出过关于网络通信的常见模式。是的,我知道“这取决于”,但你可以对任何项目都说出这句话,然而有很多涵盖一般思想的模式。


2
嗨,我试图问类似的问题,并找到了你的问题。我开发了许多应用程序,其中有监听器线程和每个节点上的客户端。正如你所说,不同的应用程序可能有不同的需求。有些可能需要ACK,有些可能依赖于重复的消息等。在开发过程中,大多数时候我会回顾我的以前的代码或者按照最合乎逻辑的方式去做某些事情。如果有任何关于应用层通信的模式,那将非常有帮助。还是应该只看现有的协议,寻找解决方案? - Kalp
还可以了解Proactor / Reactor模式。这里有一篇文章作为例子:http://www.artima.com/articles/io_design_patterns.html - alariq
@casperOne - 关闭一个已经有答案的三年老问题的目的是什么? - Erik Funkenbusch
@MystereMan 帖子的年龄并不重要,如果它目前不适合该网站,那么它将被关闭。如果您不同意关闭,请随时在 [Meta] 上提出。 - casperOne
这个:(http://www.amazon.com/Pattern-Oriented-Software-Architecture-Volume-Patterns/dp/0471958697)已经存在一段时间了。还有第二卷。 - Ray Tayek
7个回答

14

这个问题非常广泛,需要相当密集的书籍来处理。我本人不知道有这样的资源,但让我们思考一下,在网络通信模式空间中会有哪些维度:

连接模态: {基于连接、无连接}

交互模态: {同步、异步}

对话复杂性: {命令响应、对话}

消息形式: {自由格式流、半结构化块、完全结构化块} ..?

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

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

前者(显然)是两者中更简单的,很可能是最初的实现(除非你以前做过这种事情)。

后者(可能)更健壮、高效(以loc衡量),并且允许采用对协议的更改(如果它仍然受到设计更改的影响)。

(底层(虚拟)操作系统的网络设施(当然)也极大地影响了实现。以JVM为例:NIO选择基于通道处理与有限状态机非常相配)。

希望能有所帮助。


9
我认为责任链模式可用于从/向网络发送/接收数据。
您可以构建一系列命令,将其从客户端发送到服务器。每个命令都通过责任链进行处理,并添加数据以正确处理命令。
在发送数据时,责任链可能如下所示:
命令-->包装一些数据-->加密-->发送数据
(围绕命令的数据(源,如果需要,则为其他信息))
在接收数据时,责任链可能类似,但方向相反:
接收数据-->解密-->取消数据包装-->执行命令
您可以查看此文章以获取有关责任链的更多信息。 http://www.vincehuston.org/dp/chain.html

3
我建议:将网络协议/ s抽象掉。
首先确定功能、模块和它们之间的API。然后决定数据将通过什么协议在网络上传输。
然后,小心地将所有与网络有关的问题封装在它们自己的层中,这样您以后可以以与功能正交的方式应用加密、压缩、添加http传输(以通过防火墙)或任何您想要添加的内容。

3

0

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

BitTorrent是一种非常流行的去中心化协议,具有许多扩展功能。

OpenSSH也是另一个不错的选择;它支持特性协商、多种加密类型和通道的复用/分离。

VoIP协议非常适合流媒体应用:RTP和H.323。

网络路由协议也很不错:BGP(及其扩展)、LDP、VRRP/CARP。


-1

还没有彻底研究过这个,但我想 this 是一个很好的文档:

另外,this 看起来是一本不错的书:


-1

我不知道模式方面的内容,但有一些“显而易见”的选择点。 首先,您是否想使用ASN.1(这会影响很多东西)? 其次,您想要一个人类可读的协议还是二进制协议? 第三,您是否希望在协议中包含任何安全方面的内容?

回答“想使用ASN.1”将强制回答相当多的协议设计问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接