传输层要求
QUIC
| 项目 | 要求 |
|---|---|
| TLS 版本 | TLS 1.3 |
| ALPN | novaxis-rcp/版本号 |
| DATAGRAM | 启用 |
| 0-RTT | 禁用 |
| 端口 | 7443/UDP |
加密、完整性校验、拥塞控制与流控由 QUIC 实现提供
NRCP Frame 承载
NRCP 在 QUIC 上始终传输完整 Frame,不定义跨 QUIC Datagram 的应用层分片与重组
Frame 总长度由基础 Header 中的 Header Length 与 Payload Length 决定:
其中:
- 表示 NRCP Frame 总字节长度;
- 表示 Header Length;
- 表示 Payload Length;
QUIC Datagram
QUIC Datagram 用于承载 best_effort Flow Data,规则如下:
- 一个 QUIC Datagram 必须恰好承载一个完整 NRCP Frame;
- Datagram 字节长度必须等于 ;
- Datagram 不得拼接多个 NRCP Frame;
- Datagram 不得承载半个 NRCP Frame;
- 超过对端可接受 Datagram Payload 大小的 NRCP Frame 必须改用 QUIC Stream 或被拒绝;
- 接收端收到长度不等于 的 Datagram 时,必须丢弃该 Datagram 或返回协议错误;
QUIC Stream
QUIC Stream 用于承载 reliable 消息,规则如下:
- Stream 上承载连续 NRCP Frame 字节流;
- 接收端根据基础 Header 中的 Header Length 与 Payload Length 组装完整 Frame;
- 一个 NRCP Frame 允许跨多次 QUIC Stream 读取返回;
- 多个 NRCP Frame 允许连续写入同一个 QUIC Stream;
- Stream 上不需要额外长度前缀;
- 接收端在获得完整 Frame 前不得将部分字节交给协议语义层处理;
Stream 角色
当前版本定义以下 Stream 角色:
| Stream 角色 | 创建方 | 是否必需 | 承载内容 |
|---|---|---|---|
| Control Stream | Client | 是 | ACK、Error、Operation、Flow 控制、Heartbeat、Recovery、协议层 Event |
| Reliable Flow Stream | Flow Pub 方 | 按需 | reliable Flow 的 FLOW_DATA |
Control Stream 是 QUIC 握手完成后由 Client 打开的长期双向 Stream。除 FLOW_DATA 外,所有可靠协议控制消息默认通过 Control Stream 承载
Reliable Flow Stream 是 Pub 方在 Flow 进入 Active 后打开的单向 Stream。每个 Reliable Flow Stream 只承载一个 Flow 的 FLOW_DATA,其中所有 Frame 必须使用同一个 channel_id 与 flow_epoch
FLOW_CLOSE 仍然通过 Control Stream 发送。Reliable Flow Stream 异常关闭或被 Reset 时,接收端应将对应 Flow 标记为异常并通过 Flow Close、Flow Event 或 Error 收敛状态
承载选择由 Flow QoS Grant 中的 reliability 决定:
reliability | 默认承载 |
|---|---|
reliable | Reliable Flow Stream |
best_effort | QUIC Datagram |
Heartbeat 若用于会话保活与时钟同步基线,必须通过 Control Stream 发送。若实现需要额外的高频延迟采样,允许通过 QUIC Datagram 发送额外 Heartbeat,但 Datagram Heartbeat 不得作为维持 Session Active 的唯一依据
0-RTT
- APP 不得在 0-RTT 数据中发送 NRCP 业务消息;
- 网关收到 0-RTT NRCP 业务消息必须丢弃;
- 即使 QUIC 库启用了 0-RTT,NRCP 层仍然必须等待完整握手完成;
- 当前不定义认证绑定流程,NRCP 层仍然必须等待完整握手完成后才能发送业务消息;