37

我开始意识到我过去问过的几个问题,比如这个真的可以归结为一个更基本的问题。

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

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

编辑:

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

编辑2:

我很难相信没有人想出任何通用的网络通信模式。是的,我知道“这取决于”,但是您可以对任何项目这么说,但是有很多模式涵盖了一般的想法。

4

7 回答 7

14

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

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

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

交互方式:{同步,异步}

对话复杂度:{命令响应,对话}

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

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

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

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

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

(底层(虚拟)OS 网络设施(当然)也极大地影响了实现。以 JVM 为例:基于 NIO 选择的通道处理可以很好地与 FSM 一起工作。)

希望有帮助。

于 2009-03-26T12:25:09.310 回答
9

我会说责任链模式对于从网络发送/接收数据可能很有用。

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

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

命令 --> 包装一些 --> 加密 --> 发送数据
发送数据
              命令
              (来源,额外
              信息如果
              需要)

在数据接收时,链可能是相似的,但反过来

接收数据 --> 解密 --> 解包额外数据 --> 执行命令

您可以查看本文以获取有关责任链的更多信息。 http://www.vincehuston.org/dp/chain.html

于 2009-04-05T05:38:39.450 回答
3

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

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

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

于 2009-03-22T11:57:24.683 回答
3

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

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

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

于 2012-09-09T09:44:39.580 回答
0

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

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

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

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

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

于 2009-03-22T13:58:03.957 回答
-1

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

并不是说回答“想使用 ASN.1”会迫使回答很多协议设计问题。

于 2009-03-22T11:08:50.103 回答
-1

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

此外,看起来像一本好书:

于 2009-11-18T05:19:13.847 回答