RFC-0037:交易郵件標頭 v3

RFC-0037:交易訊息標頭 v3
狀態已接受
區域
  • FIDL
說明

這項提案會修改 FIDL 線路格式。交易標頭的保留位元組會分配給一個位元組的魔術數字,用於識別所用的線路格式,以及三個位元組的旗標,暫時用於軟體遷移。

作者
提交日期 (年-月-日)2019-03-07
審查日期 (年-月-日)2019-03-14

摘要

本提案會修改線路格式,如下所示。

交易標頭的保留位元組會分配給:

  • 一個位元組的魔術數字,用於識別所用的連線格式;
  • 以及用於暫時軟遷移的三個位元組的標記

此外,與其在標頭中硬塞墓誌銘值,不如使用墓誌銘酬載 struct{int32}

動機與設計

標頭中含有魔術數字:

  • 為讀者提供機制,判斷收到的訊息是否相容 (或附註),並為寫入者提供機制,指出傳送訊息的格式。
  • 魔術數字的排序並非目標,魔術數字應僅經過檢查,若不相容 (即不支援),則應遭到拒絕。具體來說,我們避免使用「版本」一詞,因為我們需要成對相容性檢查,而不是範圍相容性,例如「支援 v5 到 v8」。

在標題中加入旗標:

  • 提供機制協助軟轉換,尤其是繫結不得因不瞭解特定旗標的使用方式而拒絕訊息,而是直接忽略這些旗標。舉例來說,這項功能可用於從靜態聯集遷移
  • 我們偏好將更多位元組分配給旗標 (3 個位元組),而不是魔術數字 (1 個位元組),因為我們預期暫時需要的功能會比連線格式類型多得多。

墓誌銘:

  • 墓誌銘硬塞reserved 位元組,現在則用於魔術數字和旗標;
  • 將墓誌銘設為純粹的酬載 struct{int32} 可從線路格式中移除一個特殊雪花,通常可簡化繫結,並降低發生錯誤或不相容的機率。

最後,我們希望標頭盡可能小,因此明確目標是將標頭維持在 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)

繫結不得檢查旗標,但繫結使用的特定旗標或繫結知道的旗標除外,也就是說,設定接收端繫結不明的位元是有效的。

線路格式圖所示:

線路格式訊息標頭的圖表

何時應指派新的魔術數字

初始魔術數字為 0x01。我們稍後會提供更有趣的數字。

如果 FIDL 團隊無法合理淘汰演進或取代的線路格式,就必須為新的線路格式指派魔術數字。

效能

將墓誌銘設為 struct{int32} 酬載,而非嵌入交易標頭,可將讀取的最小位元組數從 16 個位元組增加至 24 個位元組。效能良好的繫結堆疊會分配小型緩衝區,增加 8 個位元組的影響極小。