19

我有一个现有的独立应用程序,它将由第三方使用网络协议进行扩展。这些功能已经实现,我所需要的只是将它们暴露给外部。

假设已经选择了传输协议 (UDP),是否有任何资源可以帮助我设计我的应用程序协议?

似乎有很多关于软件设计的信息,但没有关于协议设计的信息。我已经看过Application Protocol Design

4

8 回答 8

8

请参阅Jabber 协议设计指南RFC 4101。尽管它旨在使 RFC 更易于审阅者理解,但该 RFC 提供了一些有趣的建议。

于 2008-11-10T12:13:36.857 回答
5

你看过谷歌协议缓冲区吗?这似乎是解决此问题的好方法。

您可以创建一个与现有应用程序通信的端点,然后使用 protobuffer 协议从“外部”响应。它是二进制的,所以它又小又快,你不必编写自己的协议管理器,因为你可以使用谷歌的。缺点是它必须在系统的两侧(在您的“服务器”端和消费者/客户端)上实现。

于 2008-11-10T10:10:20.100 回答
4

首先,UDP 主要是一种单向广播传输方法。此外,它可能是有损的,因此您需要能够处理丢失的数据包和乱序的数据包。如果您需要 UDP 的任何级别的可靠性,或者需要双向连接,那么您最终将需要 TCP 的所有内容,因此您最好从它开始并让网络堆栈来处理它。

接下来,如果您的数据可能大于单个 IP 数据包,那么您将需要某种方法来识别每个数据包的开始和结束,以及处理非法或损坏数据包的方法。我会推荐某种带有数据包长度的标头,某种页脚,也许还有校验和。

然后,您需要某种方式对消息和响应进行编码。周围有许多 RPC 协议。您可以查看 SOAP,或者设计一个自定义的基于 XML 的协议,或者一个二进制协议。

于 2008-11-10T09:52:35.050 回答
4

协议缓冲区的另一个建议- 很好的紧凑二进制文件。但是请注意,虽然二进制协议定义明确,但还没有一个公认的 RPC 标准(有几个标准正在进行中,倾向于 TCP 或 HTTP)。

该规范使得在不同架构中拥有客户端和服务器变得非常容易,这很好——而且它是可扩展的。

警告:我是其中一个.NET 版本的作者,所以我很可能有偏见;-p

于 2008-11-10T10:43:39.423 回答
2

你真的应该认真思考你是否真的想设计、记录和维护自己的协议或使用已经存在的东西。很可能已经有符合您需求的书面协议。取决于你在做什么,一开始它可能看起来有点矫枉过正,实现所有规范看起来很乏味,而且比编写自己的规范要少得多,但如果你打算在几年内继续积极开发你的应用程序,它应该可以节省你大量的时间和金钱来使用已经存在并为第三方所知的东西。此外,如果您可以为该协议使用现有的库,那么实现部分应该会快很多。

设计新协议比实现一个协议更有趣,但比维护一个协议要少,因为你必须忍受所有的缺陷。没有一种协议是完美的,但如果你从未设计过一种协议,你可以放心,与设计你可以使用的现有众所周知的协议的人相比,你在设计它时会犯更多的错误。

简而言之,尽可能利用已经存在的东西。

于 2008-11-11T22:18:23.983 回答
1

如果您选择 XML,请记住您将有大量的标记开销。

与 xml 相比,一个简单的二进制协议也不需要太多的资源来解析。

于 2008-11-10T09:58:36.770 回答
0

如果您不想从头开始构建您的协议,您应该看看SOAP。对不同编程语言的支持各不相同,但明确鼓励跨语言通信。

不幸的是,UDP 和 SOAP 似乎还处于起步阶段,HTTP 是最常用的。

于 2008-11-10T09:54:06.310 回答
0

我有一个现有的独立应用程序,它将由第三方使用网络协议进行扩展。

这将有助于更多地了解您的程序的功能以及这些 3rd 方扩展的性质。也许使用UDP的一些理由?

于 2008-11-10T10:28:09.407 回答