NNRP/1 快速上手
从宿主接入视角看,一条最小工作路径是:
- 建立可靠字节流连接,并完成
CLIENT_HELLO / SERVER_HELLO_ACK。 - 通过
SESSION_OPEN / SESSION_OPEN_ACK建立某个 profile、schema 和默认预算窗口。 - 发送
FRAME_SUBMIT或其他提交类消息,把 operation 放进该 session。 - 并行维护结果泵,持续接收
RESULT_PUSH / RESULT_DROP / RESULT_HINT / FLOW_UPDATE。 - 根据
FLOW_UPDATE和结果状态,决定继续提交、降速、恢复或取消。
最容易踩错的点有三类:
- 把 NNRP 当成同步接口:正确的接入方式是三条通路并行——一个循环持续发送任务,一个循环持续读取结果,一条通路处理
FLOW_UPDATE等控制消息。 - 把 session 和 operation 混用:session 是持续的上下文容器(类似"会话"),operation 是其中的单次任务。session 建立一次,operation 可以反复提交。
- 跳过 profile/schema 直接解读 payload:payload 的字段含义由 profile 和 schema 定义,不同实现的字段布局不一定相同,直接硬猜偏移是不可靠的。
最小宿主实现至少要做到:
- 独立维护一个发送循环和一个结果读取循环,两者不相互阻塞。
- 为每个 session 记录
profile_id / schema_id / schema_version,以备 schema mismatch 时快速定位。 - 正确区分结果类型:
partial(中间帧,可以展示)、terminal(最终帧)、drop(被丢弃)、degraded(降级输出)。 - 收到
FLOW_UPDATE时,按其 scope(连接级或会话级)更新发送速率,而不是只盯着连接总开关。