RFC-0037:事务性邮件标头 v3

RFC-0037:事务性消息标头 v3
状态已接受
区域
  • FIDL
说明

此提案修改了 FIDL 有线格式。交易标头的预留字节分配给一个字节的 magic number,用于标识所用的有线格式;另外三个字节用于标志,这些标志旨在临时用于软迁移。

作者
提交日期(年-月-日)2019-03-07
审核日期(年-月-日)2019-03-14

摘要

此提案修改了有线格式,如下所示。

交易标头的预留字节分配给:

  • 一个字节的幻数,用于标识所用的有线格式;
  • 还有 3 个字节用于标志,这些标志旨在临时用于软迁移。

此外,墓志铭值不再强行塞入标头中,而是以 epitaph 载荷的形式存在,即 struct{int32}

动机和设计

在标头中包含魔数:

  • 为读取器提供一种机制,用于指示收到的消息是否兼容(或不兼容),并为写入器提供一种对称的机制,用于指示发送的消息的格式。
  • 魔法数的顺序不是目标,只需检查魔法数,如果不兼容(即不支持),则拒绝。具体来说,我们避免使用“版本”一词,因为我们希望进行成对的兼容性检查,而不是像“支持 v5 到 v8”那样基于范围的兼容性检查。

在标头中添加标志:

  • 提供一种机制来帮助实现软过渡,特别是要求绑定不得因不知道某些标志的用法而拒绝消息,而应直接忽略这些标志。例如,此功能用于从静态联合迁移
  • 我们更倾向于为标志分配更多字节 (3 字节),而不是为 magic number 分配更多字节 (1 字节),因为我们预计临时需要的功能比 wire 格式风格多得多。

在墓志铭中:

  • 墓志铭被强行塞入 reserved 字节中,而这些字节现在用于魔数和标志;
  • 将墓志铭设为普通的有效负载 struct{int32} 可从有线格式中移除一个特殊的 snowflake,这通常会简化绑定并降低出现 bug 或不兼容问题的可能性。

最后,我们希望尽可能缩小标头,并明确目标是将其保持在 16 字节,同时支持上述额外要求。

交易消息标头的演变

FIDL2(“v2”):

  • 交易 ID (uint32)
  • 预留(uint32
  • 标志(uint32 个)
  • 序数 (uint32)

RFC-0053

RFC-0029

最初,覆盖字节 4 到 7 的预留 (uint32) 字段旨在与 zx_channel_call 的要求保持一致。不过,该系统调用已稳定,不再需要此要求。

版本 3

我们将事务性消息标头(“v3”)稳定为:

  • 交易 ID (uint32)
  • 标志(array<uint8>:3,即 3 个字节)
  • 魔数 (uint8)
  • 序数 (uint64)

绑定不得检查标志,除非是这些绑定正在使用或了解的特定标志,也就是说,设置接收方绑定未知的位是有效的。

线框格式图如下:

线格式消息标头的示意图

何时应分配新的魔数

初始 magic number 将为 0x01。我们稍后会提供更有趣的数字。

当 FIDL 团队无法合理地逐步淘汰正在发展或替换的线格式时,必须为新线格式分配一个 magic number。

性能

让墓志铭成为 struct{int32} 载荷,而不是嵌入在交易标头中,可将读取的最小字节数从 16 字节增加到 24 字节。高性能绑定堆栈会分配一个小型缓冲区,增加 8 字节的影响很小。