跳到主要内容

ADR-001: 服务包

状态: 已接受

日期: 2025-09-22

原因

我们需要控制平面信号(例如会话重置),这些信号必须明确、解析时零分配,并且向后兼容。

决定

两种编码共存:

  • 旧版:

    [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;否则保持旧版。