| English | 中文版 |
RFC 编号: NPS-RFC-0006 状态: 提议 (Proposed) 版本: 0.2 日期: 2026-06-12 作者: Ori Lynn / INNO LOTUS PTY LTD 依赖: NPS-1 (NCP) v0.7, NPS-3 (NIP) v0.9 Issue: GitHub NPS-Dev#45
NCP 定义了两种传输模式:HTTP 模式(NCP 帧承载于 HTTP 报文体)和原生模式(直接 TCP 或 QUIC 连接)。NCP v0.6 规定了连接前导字节(b"NPS/1.0\n",NPS-RFC-0001)及 HelloFrame/CapsFrame 握手,但 QUIC 流映射、重新加密密钥(rekeying)和合规要求均为实现自定。
本 RFC 正式规定了 TCP 和 QUIC 两种传输下的原生模式绑定,使六种参考 SDK 能够实现可互操作的原生模式支持。
本文中的关键词 “MUST”(必须)、”MUST NOT”(不得)、”SHOULD”(应)、”SHOULD NOT”(不应)、”MAY”(可以)依照 RFC 2119 解读。
b"NPS/1.0\n"(NPS-RFC-0001)。0x06)。0x04),否则发送 ErrorFrame 并关闭连接。NCP 帧在 TCP 上使用 5 字节长度前缀封装:
[4 字节: 载荷长度,大端序 uint32]
[1 字节: 帧类型字节(标志位 + 类型)]
[N 字节: 帧载荷]
帧总大小 MUST NOT 超过协商的 max_frame_payload。超出限制时,接收方 MUST 返回 NCP-FRAME-TOO-LARGE,并 MAY 关闭连接。
status = "closing" 的 CapsFrame。NCP-NODE-UNAVAILABLE。NCP over QUIC 使用 ALPN 标识符 nps/1.0(套件级 NPS 原生模式 ALPN token,见 §6.1)。此值取代 v0.1 草案中临时使用的 ncp/1。IANA 注册待后续 RFC;实现 MUST 使用 nps/1.0。
QUIC 上的帧无需 NCP 层长度前缀(QUIC 本身提供流级别帧边界):
[1 字节: 帧类型字节(标志位 + 类型)]
[N 字节: 帧载荷]
正常关闭使用应用错误码 0x00 的 CONNECTION_CLOSE 帧;协议违规使用错误码 0x01。
QUIC 上的 HelloFrame MUST 将 transport 字段设置为 "quic"。
当 E2E 加密处于活跃状态(NCP §7.4)时,实现 MUST 在以下条件满足后重新协商密钥(任一先到):
实现 SHOULD 在 2^32 - 65536 帧时提前触发重新协商。
发起方发送带有 EXT 头字段 rekey: true 的帧,接收方 MUST 完成当前帧交换后执行密钥派生,再发送下一帧。
若对端在超过 2^32 帧后仍未重新协商,接收方 MUST 发送 NCP-REKEY-REQUIRED 并 MUST 关闭连接。
max_concurrent_streams 协商HelloFrame 携带 max_concurrent_streams(uint16);服务端在 CapsFrame 中回显其上限;有效限制为 min(客户端上限, 服务端上限),双向生效。超出时返回 NCP-STREAM-LIMIT-EXCEEDED。
默认值:32。最小值:1。最大值:65535。
本节规范化原生模式 NCP 的传输安全层,并解决此前关于 ALPN 与 TLS 封装的开放问题(OQ-1、OQ-3)。
两种原生模式传输均通告套件级 ALPN token nps/1.0:
nps/1.0。nps/1.0(§3.1)。不识别 nps/1.0 的服务端 MUST 以 TLS alert no_application_protocol(120)终止握手,而非回落到默认协议。
原生模式 over TCP MUST 使用 TLS 封装传输:先建立 TLS 1.3,RFC-0001 前导(b"NPS/1.0\n")及所有 NCP 帧均在 TLS 会话内部传输。原生模式不允许 STARTTLS 式带内升级(会使前导与 HelloFrame 处于明文)。local-dev profile(NPS-4 §7.2)仅可在回环测试中无 TLS 运行。QUIC 内建 TLS 1.3,天然满足本要求。
当上层 profile 要求认证时,原生模式 MUST 使用双向 TLS:
trust_anchors,NWP v0.13 §4.1)并将证书 NID 绑定到 NCP 会话。IdentFrame 仍是能力、scope、保证等级的权威来源;mTLS 证书 NID 与 IdentFrame NID MUST 一致,否则服务端 MUST 以 NCP-NID-MISMATCH 关闭。mTLS 是 nps-ingress(L2)终结的传输层准入门;参见 NPS-Node Profile L2 要求。
为降低重复短连接的冷启动延迟,服务端 MAY 签发 TLS 1.3 会话恢复票据(NewSessionTicket)。恢复的会话:
NCP-NID-MISMATCH 拒绝。原生模式合规实现 MUST:
max_concurrent_streamslocal-dev profile 下使用带 ALPN nps/1.0 的 TLS 封装传输(§6.1–§6.2)IdentFrame NID 不一致时以 NCP-NID-MISMATCH 拒绝(§6.3)原生模式合规实现 SHOULD:
status="closing")生产环境中的原生模式连接 MUST 使用 TLS 1.3 或 QUIC 内置加密(local-dev 安全配置文件除外,参见 NPS-4 §7.2)。NCP 帧层的 E2E 加密(§7.4)是纵深防御机制,不能替代传输层 TLS。
| ID | 问题 | 状态 |
|---|---|---|
| OQ-1 | IANA 注册 ALPN nps/1.0 |
已解决(值已选定,§6.1);IANA 注册在 IETF Internet-Draft 后续 RFC 中跟踪 |
| OQ-2 | QUIC 版本:仅 QUIC v1 (RFC 9000),还是同时支持 v2? | 开放——第三阶段再定 |
| OQ-3 | STARTTLS 与 TLS 封装:是否强制其中之一? | 已解决(§6.2 —— 原生模式强制 TLS 封装;禁止 STARTTLS) |
| 版本 | 日期 | 变更 |
|---|---|---|
| 0.2 | 2026-06-12 | 草案 → 提议。新增 §6 TLS 绑定与双向认证:套件级 ALPN nps/1.0(取代临时值 ncp/1)、原生模式 over TCP 强制 TLS 封装(解决 OQ-3)、与 NIP 证书的 mTLS + session-NID 绑定(NCP-NID-MISMATCH)、TLS 1.3 会话恢复票据。§7 合规新增 TLS/mTLS MUST。OQ-1/OQ-3 已解决。§7–§10 重编号。 |
| 0.1 | 2026-05-28 | 初稿 |
归属:LabAcacia / INNO LOTUS PTY LTD · Apache 2.0