设计原则
Subnetra 围绕一小组 不可妥协的约束 构建。它们不是愿景,而是塑造每个模块的、有约束力 的不变量。若某项变更与其中之一冲突,那就是变更错了。(项目内部称之为「铁律」。)
1. 零第三方依赖
无 WireGuard、无 ikcp.c、无网络框架、无外部加密库。只有 Zig 标准库与经 std.posix
的裸系统调用。即便未来的 v2 可靠性层也必须自研(基于 arena 的 ARQ),绝不 vendoring C
库。回报是一个无供应链的、可审计的单一产物。
2. 分层零动态分配
内存 按职责 约束,而非套用一条统一规则:
- 数据面(
reactor、crypto):严格零分配。 所有包缓冲区位于启动时固定的常驻内存; 热路径绝不分配。 - 控制面 / 可靠性:独立 arena。 策略重建与 UDS 路径可在拥有各自生命周期的隔离 arena 中分配,但绝不能污染数据面的内存曲线。
验收标准——「负载下 0 字节 RSS 抖动」——针对 raw_direct 数据面;控制面热更新可短暂使用
可回收的 arena 内存。
3. 单线程、无锁反应堆
单线程;一个无锁、无分配的就绪循环。永远无线程、无锁。 因为数据面与控制面之间没有并发,
所以不需要任何互斥锁;策略热更新通过原子指针交换(RCU)完成。具体的就绪原语在 comptime
选择——Linux epoll 边缘触发、macOS poll(2)——但单线程 / 无锁 / 每包无分配这条不变量
是铁律。
4. 无状态混淆 / 隐蔽
ChaCha20-Poly1305 全加密,密文中 无魔数。认证失败时 静默 Drop——绝不回以 TCP Reset、ICMP 或任何可观测之物。端点对探测物理隐形。
这针对的是主动探测;明文封装报头会让被动观察者对协议做指纹识别,全 mesh 一致的
obfuscate 开关(默认开启,线协议 → 报头混淆)以零字节开销掩盖它,
并把保活节奏去周期化(仅指纹,不含包长或时序)。
5. v1 强制传输安全
私有的每链路 PSK、每端点 64-bit 绝不复用的单调 nonce、每次重启的会话 epoch,以及滑动 窗口 防重放 检查。这些不可延后到后续版本。见 安全模型。
6. 单个极小二进制
默认 -O ReleaseSmall,每个平台上零第三方依赖。
- Linux: 基于 musl-libc 全静态;
ldd→not a dynamic executable;目标 ≤ 512 KB。 - macOS: 最小动态——仅 链接
libSystem(Apple 不提供静态 libc),并有自己记录的 体积基线。ldd静态检查是 仅 Linux 的门禁。
7. 测试驱动
纯逻辑随附测试;任何提交前 zig build test 必须保持绿色。线协议由机器可校验的已知答案
向量钉死(见 线协议)。
8. 无状态、无握手传输
每个数据报自描述、可独立解码——每包的 epoch 就是全部的会话建立机制。Subnetra 不做
连接建立往返、不做挑战/应答、不做带内会话协商——v1 不做,v2 也不做。任何未来的传输模式
都由 静态的每链路配置 选择(预留的 negotiation_version / flags 字段),绝不在线路上
协商。
两个后果 按设计接受、而非延后处理:
- 路径上的攻击者可重放一个尚未观测过 epoch 的捕获数据报,以 瞬时 迁移某对端的 endpoint——它会在该对端下一个真实包到来时自愈,且路径外的攻击者无法伪造它。
- 墙钟在重启之间倒退的节点会被对端拒绝,直到对端时钟前进——通过 NTP/RTC 运维缓解,绝不 通过协议内的 epoch 交换。
KEEPALIVEflag(bit 0)是由静态配置门控的、单向、永不确认的 spoke→hub NAT 孔数据报。 它 不是 握手,也不削弱本条铁律;bit 1–7 仍为静态模式选择预留。
范围纪律:v1 vs v2
- v1(已交付):
raw_direct数据面 + PSK 加密 + 防重放 + RCU 热更新策略引擎。 - v2(路线图,仅接口):
kcp_arq与fec_xor——自研可靠性模式,由静态每链路配置 选择,绝非线上握手。v1 只预留egress分支与报头的negotiation_version/flags字段;v2 分支返回error.NotImplemented。
路线图上没有握手。见 路线图。
为什么是这些约束?
目标是为通往最受限环境(RouterOS / BusyBox 容器)的专线打造一根钢管。确定性、极小的可审计 足迹与隐蔽性,比功能更重要。正是这些约束,让成品能部署到更重的工具去不了的地方。