跳到主要内容

概述

max_udp_payload_sizeidle_timeout 等这类属性属于 QUIC 语义,不属于 NRCP QoS

NRCP QoS 描述的是某个业务 Flow 在应用层的传输约束。它不替代 QUIC 的拥塞控制、连接保活、Stream 顺序可靠传输或 Datagram 能力,而是在 channel_idflow_epoch 和服务端授权的 Flow 上下文之上,约束消息应该如何发送、接收、丢弃和判定失活

QoS 以 Flow 为粒度生效。接收端不能信任单个消息自报的 QoS 参数,而应通过 channel_id + message_type + flow_epoch 查询本地保存的上下文,再执行对应策略

范围

NRCP 狭义 QoS 包含以下属性:

  • 可靠性:描述消息是否允许丢失、是否需要可靠到达;
  • 时效性:描述单条消息的有效期;
  • 活性:描述请求响应超时,或持续数据流在多久没有新消息后被判定为失活;
  • 频率限制:描述该 Flow 允许的最大消息频率、突发数量和字节速率;

顺序、去重、心跳、ACK、优先级属于协议层语义或调度语义,不归纳进狭义 QoS 属性。它们只作为 QoS 实现和诊断的辅助机制,不属于 QoS 授权内容本身

可靠性

可靠性描述消息是否必须可靠到达

模式语义承载
reliable消息需要可靠送达,不应被传输层主动丢弃QUIC Stream
best_effort消息允许丢失,接收端以最新可用数据为准QUIC Datagram

典型使用:

  • RPC 请求、响应、订阅确认、错误消息应使用 reliable
  • 高频状态、传感器快照、可被下一帧覆盖的数据可使用 best_effort
  • 安全相关控制消息即使使用低延迟通道,也必须结合时效性、Sequence 和连接状态校验;

reliable 只表示传输可靠,不表示业务一定成功。业务成功与否仍由响应消息或错误消息表达

时效性

时效性描述消息从产生到被接收处理之间允许存在的最长时间。超过有效期的消息应被接收端丢弃或标记为 stale,不应继续驱动业务状态

时效性判断依赖帧头中的 source_mono_timestamp 和 Flow QoS 中授权的 TTL。由于 APP 与本体的系统时间默认不同步,接收端不能直接用两端系统时钟相减判断过期,而应基于单调时钟同步或等价的时钟转换机制估算消息年龄

接收端使用服务端授权的 Flow TTL 判断是否过期

TTL 不放在通用帧头中,因为 TTL 属于服务端授权的 Flow QoS,发送端不得逐包自报 TTL

活性

活性描述一个请求或持续 Flow 在多久没有进展后被判定为失活

对于 Request/Response 型消息,活性表现为请求超时:

  • 请求发出后,若在授权或默认超时时间内没有收到响应,则请求方应判定请求失败;
  • 响应晚到时,应通过 message_idrelated_id 和请求状态判断是否仍可接受;

对于持续数据流,活性表现为消息间隔超时:

  • 若订阅 Flow 在授权时间内没有收到新消息,接收端可将该 Flow 标记为 inactive;
  • inactive 不一定表示 QUIC 连接断开,只表示该业务 Flow 没有按预期产生数据;
  • 应用层按本地策略据此触发告警、重订阅、降级显示或安全停机;

活性检测允许借助心跳或统计信息实现,但心跳本身属于协议层会话健康机制,不属于狭义 QoS 属性

频率限制

频率限制描述该 Flow 在单位时间内允许发送或接收的消息数量与字节量

频率限制至少应覆盖:

  • 最大消息频率;
  • 最大突发数量;
  • 最大字节速率;
  • 超限后的处理策略;

接收端应在 Flow 上下文中维护 Rate Limiter。超限消息处置方式必须由该 Flow 的业务类型和授权结果决定,取值包括丢弃、延迟处理、触发降级或关闭 Flow

频率限制主要用于:

  • 防止高频状态或日志数据挤占控制消息;
  • 限制异常客户端或异常模块产生过量数据;
  • 约束动态订阅的资源消耗;
  • 为调试、告警和限流统计提供依据;

与帧头字段的关系

QoS 的执行依赖通用帧头中的若干字段,但这些字段本身不是 QoS 属性:

字段与 QoS 的关系
channel_id查询 Flow 上下文
message_type校验消息类型是否符合该 Flow 授权
flow_epoch校验 Flow QoS 版本,隔离旧授权下的迟到消息
source_mono_timestamp用于消息时效性判断
sequence辅助乱序、旧包、重复包识别和丢包统计
message_id / related_id辅助请求超时、ACK、错误和日志追踪

其中 flow_epoch 是动态 Flow 的 QoS 版本标识。当服务端更新 QoS、重建订阅或复用 channel_id 时,应递增 flow_epoch。旧 Epoch 的消息晚到时,接收端应丢弃或按兼容窗口处理