我有一个简单的协议(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/