跳到主要内容

传输层要求

QUIC

项目要求
TLS 版本TLS 1.3
ALPNnovaxis-rcp/版本号
DATAGRAM启用
0-RTT禁用
端口7443/UDP

加密、完整性校验、拥塞控制与流控由 QUIC 实现提供

NRCP Frame 承载

NRCP 在 QUIC 上始终传输完整 Frame,不定义跨 QUIC Datagram 的应用层分片与重组

Frame 总长度由基础 Header 中的 Header Length 与 Payload Length 决定:

Lf=Lh+LpL_f = L_h + L_p

其中:

  • LfL_f 表示 NRCP Frame 总字节长度;
  • LhL_h 表示 Header Length;
  • LpL_p 表示 Payload Length;

QUIC Datagram

QUIC Datagram 用于承载 best_effort Flow Data,规则如下:

  • 一个 QUIC Datagram 必须恰好承载一个完整 NRCP Frame;
  • Datagram 字节长度必须等于 LfL_f
  • Datagram 不得拼接多个 NRCP Frame;
  • Datagram 不得承载半个 NRCP Frame;
  • 超过对端可接受 Datagram Payload 大小的 NRCP Frame 必须改用 QUIC Stream 或被拒绝;
  • 接收端收到长度不等于 LfL_f 的 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 StreamClientACK、Error、Operation、Flow 控制、Heartbeat、Recovery、协议层 Event
Reliable Flow StreamFlow 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_idflow_epoch

FLOW_CLOSE 仍然通过 Control Stream 发送。Reliable Flow Stream 异常关闭或被 Reset 时,接收端应将对应 Flow 标记为异常并通过 Flow Close、Flow Event 或 Error 收敛状态

承载选择由 Flow QoS Grant 中的 reliability 决定:

reliability默认承载
reliableReliable Flow Stream
best_effortQUIC 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 层仍然必须等待完整握手完成后才能发送业务消息;