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