摘要

  • mode-set-recv 与 recvmode 属于接收方向,只表达本端希望远端编码器采用什么模式;远端可以忽略。sendmode 属于发送方向,只声明发送方当前模式。
  • 参数出现不等于方向正确,方向正确也不等于执行已经发生。可靠记录必须把会话角色、SDP 版本、编码器变更与 RTP 帧放在同一时间线上。

一条 sendonly 流的 SDP 里出现了 mode-set-recv=0,4。自动审计看到熟悉字段,便判定远端已经接受模式限制。问题不在字段拼写,而在方向:这个端点不接收该流,所谓“接收偏好”没有可作用的媒体。

复制器创造了符号,仪表盘替它发明了权力。

方向决定谁能说什么

RFC 5188 为 EVRC-WB 定义 mode-set-recv,让接收端说明它偏好的远端编码模式集合;为 EVRC-B 定义 recvmode,表达单一偏好。两者都是 receive-only。

sendmode 恰好相反。它由发送方声明当前编码器模式,是 send-only。规范明确指出:sendonly 流不应使用 mode-set-recv,recvonly 流不应使用 sendmode。

因此,证据不能只保存参数名和值。还要保存是谁写的、针对哪个方向、绑定哪个 payload、属于哪一版 offer/answer。失去这些坐标后,数字 4 既可能是本端偏好,也可能是远端声明,还可能只是中间件复制的无效文本。

偏好没有接管远端编码器

接收端可以要求模式 0,远端仍可选择模式 4,并且保持合规。RFC 5188 说明远端发送方可以忽略 mode-set-recv 或 recvmode,接收方仍应正确解码。

这不是规范漏洞,而是权责设计。接收方掌握偏好,发送方掌握允许范围内的编码决策。会话系统应记录“请求已收到”“策略选择尊重或忽略”“当前模式已声明”“特定帧确实按该模式编码”四个不同状态。

若把偏好写成命令,被允许的选择会触发误报。若看到偏好字段就写成“已执行”,真正没有落实的请求又会得到假绿灯。正确状态应包括已尊重、明确未尊重、peer 版本未知、字段方向不适用、声明尚未被媒体证据确认。

SDP 可以落后于 RTP

sendmode 声明当前编码器模式,但 RFC 5188 特别提醒:RTP 媒体可能早于首次或更新后的 sendmode SDP 到达。

这意味着控制文本与媒体不是同一个时钟。如果编码器在 T1 切换到模式 4,媒体在 T2 到达,SDP 更新在 T3 才到,T1 到 T3 之间保存的“最后已知模式”已经过时。T3 的声明也不能自动给此前每个包补写时间戳。

审计必须保留 offer/answer 版本时间、编码器切换时间、RTP 发送与到达时间、解码器摄取时间。只有这些事件能说明声明覆盖哪一段媒体。SDP 晚到不等于媒体违规;媒体与声明长期矛盾也不能用“最终一致”掩盖。

Payload 名称不替编码器作证

audio/EVRCWB、audio/EVRCWB0 与 audio/EVRCWB1 分别绑定 interleaved/bundled、header-free 与 compact bundled 格式。它们回答的是 payload 应怎样解析,不是每一段使用模式 0、4 还是 7。

EVRC-WB 的模式 4 与 7可与 EVRC-B 互操作。offerer 还应同时公布 EVRC-B 支持,让只懂旧格式的 answerer 能选择 fallback。选中某种 codec 证明协商的解释规则,不证明声音路径、编码模式或质量结果。

16 kHz RTP clock 也容易被误读。规范要求 EVRC-WB 始终使用 16 kHz 时钟,即使编码器输入或解码器输出配置为 8 kHz。rtpmap 中的 16000 是时间尺度,不是麦克风、扬声器或声学带宽收据。

兼容性会留下“缺字段”

RFC 5188 给 RFC 4788 的 EVRC-B 注册新增 recvmode 和 sendmode。旧实现不会发送,也会忽略收到的新参数,从而保持互操作。

所以字段缺失不能直接解释为模式 0、拒绝或故障。它可能是 legacy peer、可选字段省略、中间件归一化或抓取不完整。没有版本证据时,最诚实的值是 unknown。

未知参数必须在 offer 中被忽略,并且不得复制到 answer。这个规则防止端点假装理解并达成协议。要求“原样回显”反而会奖励虚假的语义一致。

EVRCWB1 的固定模式需要会话边界

EVRCWB1 要求整个会话保持相同固定速率与模式。若同一会话身份中观察到中途切换,就不能仅凭一份更新 SDP 宣布合理。

需要证明旧配置何时结束、新会话或新 payload binding 是否建立、每个包属于哪段配置。两段各自合法的会话如果被错误合并,会看似违规;一次真实违规如果只保留最终文档,也会消失。

固定规则加强的是时间与身份校验,并没有把接收偏好升级为执行收据。

最小但完整的证据链

记录从不可变 session/change ID 开始,包括双方角色、媒体方向、offer/answer 版本、候选与选中 payload、media subtype、RTP clock,以及原始 rtpmap、fmtp、ptime、maxptime。

随后记录偏好由谁提出,发送方策略如何决定,是否尊重及原因;每次 sendmode 的值与到达时间;编码器配置切换;相关 RTP sequence、timestamp、到达时间与帧模式。legacy 能力、未知扩展处理和 EVRCWB1 固定模式也必须显式呈现。

最后才是解码器接受、输出状态与应用结果。能解码不证明偏好被尊重,偏好被尊重不证明声学质量,格式正确也不证明人听到了预期效果。每层只为本层事实负责。

领导决策

治理重点不应是“字段齐不齐”,而是“谁有权决定下一状态,声明何时生效,运行媒体如何证明”。

让偏好保持偏好,让声明保持声明,让编码器和帧拥有自己的收据。这样既不把互操作弹性误判为不服从,也不让一行 SDP 冒充远端执行事实。

来源

  1. RFC 5188 HTML
  2. RFC 5188 文本
  3. RFC 5188 信息页
  4. IETF Datatracker RFC 5188
  5. RFC 5188 历史
  6. RFC 5188 引用
  7. RFC 5188 Errata
  8. RFC 4788
  9. RFC 4788 信息页
  10. RFC 3558
  11. RFC 3558 信息页
  12. RFC 3264 Offer/Answer
  13. RFC 3264 信息页
  14. RFC 4566 SDP
  15. RFC 3550 RTP
  16. IANA audio/EVRCWB
  17. IANA RTP 参数
  18. Heng Lu—现实层与符号权力
  19. Heng Lu—最小初始规范
  20. Heng Lu—运行代码优先