protocols - 存储大小受限协议(protocol)的前向兼容性

标签 protocols backwards-compatibility forward-compatibility

我有一个简单的协议(protocol),其中包含 4 个字段:

Field-1 (4-bits)
Field-2 (6-bits)
Field-3 (4-bits)
Field-4 (2-bits)

目前,我将它们组织为字节对齐:

Field-1,Field-3,Field-2,Field-4

消息总共占用 2 个字节,开销为 0 个字节。

为了使其向后兼容,以便我可以理解以前版本的消息,我在开头添加了一个 1 字节版本字段,它变成:

Version-Field,Field-1,Field-3,Field-2,Field-4

总共 3 个字节,开销为 1 个字节。

如何添加前向兼容性,以便可以在新版本的协议(protocol)中添加新字段,同时确保旧版本的软件仍然可以以尽可能低的开销理解消息?

最佳答案

通常,您的协议(protocol)会指定每条消息具有:

  • 适用于所有 future 版本的消息长度指示器。这通常是保证足够大的固定大小整数,或者是使用扩展位的可变长度编码整数,就像您在 VLQ 或 UTF-8 中看到的那样。
  • 您需要了解以解析消息的协议(protocol)最低版本的指示符。这很重要,因为新版本可能 介绍必须理解的事情。

每个新版本的协议(protocol)都允许您将新数据添加到符合先前版本协议(protocol)的前缀,并且每个版本的协议(protocol)都必须指定如何识别它定义的数据的结尾(在您的示例是固定长度的,因此很容易),以及在未来版本中定义的数据的开始。

为了处理消息,消费者会检查以确保它是足够高的版本,处理它理解的前缀,并使用长度字段跳过其余部分。

对于像你的协议(protocol)这样空间受限的东西,我可能会这样做:

  • 第一个字节是 4 位最小版本和 4 位长度字段。

  • 如果长度字段L在0-11之间,则消息的其余部分长度为L+1字节。

  • 否则第一个字节之后的 L-11 字节是包含长度的整数。
  • 当您必须了解的最低版本 > 15 时,版本 15 之前的某些协议(protocol)版本将在消息中定义附加版本信息。

关于protocols - 存储大小受限协议(protocol)的前向兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47455284/

相关文章:

tcp - tcp/ip 协议(protocol)是否解释了连接超时或被拒绝的时间?

c++ - 向函数添加具有默认值的参数是否会破坏 ABI?

c# - 具有向后兼容性的 XML 读取

html - http-equiv Cache-Control 和 Pragma 指令是否有符合 HTML5 的替代方案?

crash - 带有 JAWS 16 的 Microsoft Edge 在关注多个网站上的输入字段时行为异常

c++ - 将一个蓝牙设备连接为多个设备

swift - 在 Swift 中存储然后转换为元类型

c++ - Boost Serialize 向后兼容性问题

swift - 有没有办法将协议(protocol)属性声明为私有(private)?