我已经意识到我过去曾问过的几个问题,例如this,实际上归结为一个更基本的问题。
是否有任何众所周知的网络通信设计模式,以及它的性质,协议构造/解析?谷歌搜索没有透露太多。
请注意,我不是在寻找任何特定问题的解决方案,我正在寻找处理网络通信及其协议的文档化设计模式。
编辑:
请不要提出各种实施细节或讨论具体协议,除非它与设计模式相关联。协议设计不是问题,它是用于创建或解析我正在寻找的协议的设计模式,更不用说通信模式本身了。
EDIT2:
我发现很难相信没有人提出任何常见的网络通信模式。是的,我知道“这取决于”,但你可以说任何项目,但有很多模式涵盖一般的想法。
答案 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)