| English Version | 中文版 |
Spec Number: NPS-4
Status: Draft
Version: 0.2
Date: 2026-04-12
Port: 17433(默认,共用)/ 17436(可选独立)
Authors: Ori Lynn / INNO LOTUS PTY LTD
Depends-On: NPS-1 (NCP v0.3), NPS-3 (NIP v0.2)
本文档中的关键字 “MUST”、”SHOULD”、”MAY” 按照 RFC 2119 解释。
NDP 是 AI 版 DNS。Agent 通过 NDP 解析 nwp:// 地址到物理端点,广播自身能力,订阅节点图谱变更,支持去中心化和中心化两种网络拓扑。
| 模式 | 适用场景 | 优先级 |
|---|---|---|
| 本地注册表(UDP Multicast) | 内网/局域网 | 最高 |
| DNS TXT 记录 | 公网,分布式 | 中 |
| NPS Cloud Registry | 全局,中心化 | 最低(兜底) |
节点或 Agent 广播自身存在与能力。
| 字段 | 类型 | 必填 | 描述 |
|---|---|---|---|
frame |
uint8 | 必填 | 固定值 0x30 |
nid |
string | 必填 | 发布者 NID |
node_type |
string | 条件必填 | 节点类型(node 实体必填) |
addresses |
array | 必填 | 物理地址列表,每项含 host/port/protocol |
capabilities |
array | 必填 | 能力列表(复用 NIP capabilities 定义) |
ttl |
uint32 | 必填 | 广播有效期(秒),0 = 下线通知 |
timestamp |
string | 必填 | 广播时间(ISO 8601 UTC) |
signature |
string | 必填 | IdentFrame 私钥签名,防止伪造 |
示例
{
"frame": "0x30",
"nid": "urn:nps:node:api.example.com:products",
"node_type": "memory",
"addresses": [
{ "host": "10.0.0.5", "port": 17434, "protocol": "nwp" }
],
"capabilities": ["nwp:query", "nwp:stream"],
"ttl": 300,
"timestamp": "2026-04-10T00:00:00Z",
"signature": "ed25519:..."
}
解析 nwp:// URL 到物理端点。
请求
| 字段 | 类型 | 必填 | 描述 |
|---|---|---|---|
frame |
uint8 | 必填 | 固定值 0x31 |
target |
string | 必填 | 待解析的 nwp:// URL |
requester_nid |
string | 可选 | 请求方 NID(用于授权检查) |
响应
{
"target": "nwp://api.example.com/products",
"resolved": {
"host": "10.0.0.5",
"port": 17434,
"cert_fingerprint": "sha256:a3f9...",
"ttl": 300
}
}
节点图谱同步与变更订阅。
| 字段 | 类型 | 必填 | 描述 |
|---|---|---|---|
frame |
uint8 | 必填 | 固定值 0x32 |
initial_sync |
bool | 必填 | true = 全量推送,false = 增量 patch |
nodes |
array | 条件必填 | 全量同步时的节点列表 |
patch |
array | 条件必填 | 增量同步时的 JSON Patch(RFC 6902) |
seq |
uint64 | 必填 | 图谱版本序号,单调递增 |
Agent 启动
│
├─ 1. NIP:加载 IdentFrame(从文件或 CA 自动获取)
│
├─ 2. NDP:发送 AnnounceFrame(广播 Agent 上线)
│
├─ 3. NDP:发送 GraphFrame 订阅请求(接收节点图谱)
│ ← GraphFrame(initial_sync=true) 全量图谱
│ ← GraphFrame(initial_sync=false) 增量更新(持续)
│
└─ 就绪:可发起 NWP 访问
节点可通过 DNS TXT 记录发布发现信息,无需中心化 Registry:
# 节点发现记录
_nps-node.api.example.com. IN TXT "v=nps1 type=memory port=17434 nid=urn:nps:node:api.example.com:products fp=sha256:a3f9..."
# CA 发现记录
_nps-ca.mycompany.com. IN TXT "v=nps1 ca=https://ca.mycompany.com/.well-known/nps-ca"
TXT 记录字段
| 键 | 必填 | 描述 |
|---|---|---|
v |
必填 | 版本,固定 nps1 |
type |
可选 | 节点类型:memory/action/complex |
port |
可选 | 端口(默认 17434) |
nid |
必填 | 节点 NID |
fp |
可选 | 节点证书指纹 |
ca |
条件必填 | CA 发现端点(CA 记录必填) |
| 错误码 | NPS 状态码 | 描述 |
|---|---|---|
NDP-RESOLVE-NOT-FOUND |
NPS-CLIENT-NOT-FOUND |
nwp:// 地址无法解析 |
NDP-RESOLVE-AMBIGUOUS |
NPS-CLIENT-CONFLICT |
解析结果存在冲突(多个不一致的注册) |
NDP-RESOLVE-TIMEOUT |
NPS-SERVER-TIMEOUT |
解析请求超时 |
NDP-ANNOUNCE-SIGNATURE-INVALID |
NPS-AUTH-UNAUTHENTICATED |
AnnounceFrame 签名验证失败 |
NDP-ANNOUNCE-NID-MISMATCH |
NPS-CLIENT-BAD-FRAME |
AnnounceFrame 中 NID 与签名证书不一致 |
NDP-GRAPH-SEQ-GAP |
NPS-STREAM-SEQ-GAP |
GraphFrame 序号不连续 |
NDP-REGISTRY-UNAVAILABLE |
NPS-SERVER-UNAVAILABLE |
NDP Registry 暂时不可用 |
HTTP 模式下的状态码映射见 status-codes.cn.md。
接收方 MUST 验证 AnnounceFrame 中的 signature,确认发布者持有对应 NID 的私钥,防止伪造节点广播。
中心化 Registry(NPS Cloud)MUST 要求注册方提供有效 IdentFrame,并通过 NIP CA 验证后才接受 AnnounceFrame 入库。
| 版本 | 日期 | 变更 |
|---|---|---|
| 0.2 | 2026-04-12 | 统一端口 17433;错误码改用 NPS 状态码映射;完善错误码列表 |
| 0.1 | 2026-04-10 | 初始骨架:AnnounceFrame/ResolveFrame/GraphFrame、DNS TXT 规范、初始化流程 |
归属:LabAcacia / INNO LOTUS PTY LTD · Apache 2.0