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 を送信;そうでなければレガシーを維持。