设计一个应用程序协议

19
我有一个现有的独立应用程序,将由第三方使用网络协议进行扩展。功能已经实现,我只需要将它们暴露给外部即可。
假设传输协议已经选择(UDP),是否有任何资源可以帮助我设计应用程序协议?
似乎有很多关于软件设计的信息,但没有关于协议设计的信息。 我已经查看了 应用程序协议设计
8个回答

8

5

你看过Google Protocol Buffer吗?它似乎是解决这个问题的好方法。

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


请注意,RPC标准尚未完全形成。 - Marc Gravell

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

接下来,如果您的数据可能超过一个IP数据包,则需要一些方法来识别每个数据包的起始和结束,以及处理非法或损坏的数据包。我建议使用某种带有数据包长度、页脚和校验和的包头。

然后您需要某种编码消息和响应的方式。有许多RPC协议可供选择。您可以查看SOAP、设计自定义基于XML或二进制的协议等。


2
最好使用“不可靠”的而不是“有损”的。只是挑刺 :D - mdec
1
UDP不仅丢包率高,而且可能会无序传递数据包。这很糟糕。 - Rafał Dowgird
当头部有长度字段时,为什么需要页脚? - Vivek Sharma
2
从技术上讲,如果您正在使用UDP,则不需要识别数据包的起始和结束,因为这由IP层处理(允许每个数据包高达65K)。对于损坏,IP层校验和应该能够捕获此问题。 - Kevin Nisbet

4

另一个关于 协议缓冲 的推荐——紧凑的二进制格式,且不需要太多的努力。但是请注意,虽然二进制协议已经被定义得很好了,但还没有一个统一的 RPC 标准(有几个正在进行中, 并且趋向于 TCP 或 HTTP)。

规范使得在 不同架构 中轻松实现客户端和服务器非常容易,这是很好的,而且还可以扩展。

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


2
你应该认真考虑是否真的想要设计、文档化和维护自己的协议,还是使用已经存在的东西。很可能已经有一个符合你需求的文档化协议了。根据你的应用,一开始看起来可能过于复杂,实现所有规范也看起来比编写自己的协议更繁琐乏味,但如果你打算在未来几年内继续开发你的应用,使用已经存在并为第三方所知的东西将节省你大量的时间和金钱。此外,如果你可以使用一个现有的库来实现该协议,实现部分应该会更快。
设计新协议比实现一个协议更有趣,但维护协议的工作则比设计协议少了一些有趣的事情。没有哪个协议是完美的,但如果你从未设计过协议,可以肯定的是,在设计它时,你会犯比那些设计出现有知名协议的人更多的错误,而你可以使用他们设计的协议,而不是自己从头开始设计。
简而言之,尽可能利用已经存在的东西。

1

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

与XML相比,一个简单的二进制协议也需要更少的资源来解析。


0

如果您不想从头开始构建协议,可以看看SOAP。不同编程语言的支持有所不同,但跨语言通信得到了明确的鼓励。

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


0
我有一个现有的独立应用程序,将由第三方使用网络协议进行扩展。
了解一下您的程序是做什么的,这些第三方扩展的性质是什么会有所帮助。也许需要解释一下为什么要使用UDP?

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