メインコンテンツまでスキップ

ADR-001: サービスパケット

ステータス: 承認済み

日付: 2025-09-22

理由

コントロールプレーンのシグナル(例:セッションリセット)が必要です。これらは明確で、パース時にゼロアロケーションで、後方互換性がある必要があります。

決定

2つのエンコーディングが共存します:

  • レガシー:

    [type]        // 1 バイト

    後方互換性のために維持(現在は SessionReset のみ)。

  • V1 フレーム:

    0xFF 0x01 [type]   // 3 バイト:プレフィックス、バージョン、タイプ

    将来の進化のためのバージョニングを提供。

検出(厳密)

パケットがサービスパケットであるのは、次の場合のみ:

  • len==1 かつ type が既知(レガシー)、または
  • len==3 かつ バイトが 0xFF 0x01 <既知のタイプ>(v1)。 それ以外はすべてサービスパケットではない

API

package service

type PacketType uint8
const (
Unknown PacketType = iota
SessionReset
)

type PacketHandler interface {
TryParseType(pkt []byte) (PacketType, bool) // ゼロアロケーション
EncodeLegacy(t PacketType, buffer []byte) ([]byte, error) // ゼロアロケーション:buffer は事前割り当て済み
EncodeV1(t PacketType, buffer []byte) ([]byte, error) // ゼロアロケーション:buffer は事前割り当て済み
}

互換性とロールアウト

  • 受信: 常にレガシーと v1 の両方を受け入れる。
  • 送信: デフォルトはレガシー。ハンドシェイクの機能フラグ(ServicePacketsV1=true)後、そのクライアントには v1 を送信;そうでなければレガシーを維持。