摘要

  • RFC 3119 要求 SDP 使用 mp3,但已注册的媒体子类型和旁边的 rtpmap 示例都写作 mpa-robust;RFC 5219 把编码名称改为一致的 mpa-robust。
  • 后继 RFC 保留了基于 ADU 的 RTP 载荷设计,并把伪代码修订称为非规范性、幅度较小的修正。标准记录并未证明任何在网实现采用过矛盾名称,也没有证明某次会话因此失败。

同一节里出现了两个名称

这个矛盾很容易被略过。2001 年发布的 RFC 3119 将 mpa-robust 注册为其 MP3 RTP 格式的媒体子类型,但在 SDP 用法一节中,它又要求编码名称必须写成 mp3。紧接着的例子分配了动态载荷类型 121,却写出 a=rtpmap:121 mpa-robust/90000。

这两行在不同层面描述同一种格式。RTP 数据包携带载荷类型编号;对于动态编号,SDP 的 rtpmap 属性会告诉对端该编号对应哪种编码和时钟频率。RFC 4566 定义了这种映射。因此,RFC 3119 在会话描述界面给出了两个互相不一致的名称,尽管媒体子类型和实际映射示例彼此吻合。

这不只是拼写问题。动态载荷编号本身不能说明包里装的是什么。发送端和接收端需要共享一个映射,让 RTP 包中的编号对应到接收端预期的编码格式。载荷布局可以自洽,但描述它的协商边界仍可能不一致。规范文本证明这里有一处规格缺陷,却没有告诉我们真实设备会如何处理。

为什么要另设 RTP 格式

原始设计针对 MP3 Layer III 的一个具体特征:一帧可以向前回指到较早帧中的编码数据,因此它不一定是可独立解码的单位。RFC 3119 指出,如果 RTP 包边界与帧边界重合,丢失一个包可能让其他已经收到的帧中的部分数据也失去用途。

替代格式把流重新排布为应用数据单元(ADU)。每个 ADU 前面带有描述符,指明它的长度,以及数据是否从另一包继续。发送方还可以选择交织 ADU,使连续的数据单元分散在非连续的包中。这不仅是增加冗余,而是改变包边界与解码器实际处理的数据单位之间的关系,同时保留编码内容。

2008 年 2 月发布的 RFC 5219 延续了这一基本设计。它重新解释了回指、ADU、描述符和可选交织。摘要称,它取代 RFC 3119 是为了修正 SDP 一节和伪代码附录中的排字错误。附录 C 说得更明确:主要改动是修正 SDP 编码名称;附录 A、B 则对非规范性伪代码作了细微修复和澄清。

修正内容很直接:RFC 5219 要求使用 mpa-robust,与已注册的媒体子类型相符;示例仍把动态载荷类型 121 映射到 mpa-robust/90000。RFC Editor 已验证的 RFC 3119 勘误还记录了原先的不一致,以及几处示例代码修订:backpointer 是“值”而非“大小”;一个变量应是 prevADU,不是 curADU;B.2 的两个反交织数组边界都从 32 改为 256。这些改动是在修整文字中的实现说明,不能证明 2008 年在网传输的载荷随之改变。

RFC 编号不是故障报告

RFC 5219 展示了标准可以在多个层面被修订。SDP 名称属于规范性的会话描述规则,告诉参与方应如何称呼这种编码。附录修改的则是 RFC 5219 明确标为非规范性的伪代码。单凭这两个事实,都无法测量实际运行问题的规模。

文档没有提供实现数量、数据包抓取、失败会话记录、厂商版本说明或前后对照测试。它没有说某个设备真的通告过 mp3,另一端因此拒绝连接,也没有说修正拼写后实测互通率提高。RFC Editor 接受勘误能证明标准文本曾有错误,不能说明软件复制了错误的频率。

应当守住的历史边界就在这里。RFC 5219 取代旧文档,是因为会话描述指令需要修正,部分实现说明需要澄清;它保留了 ADU 载荷模型。标准记录说明作者改了什么。至于这些改动是否影响真实系统,还需要来自实现和会话的独立证据。

来源

  1. https://www.rfc-editor.org/rfc/rfc3119.html
  2. https://www.rfc-editor.org/info/rfc3119/
  3. https://www.rfc-editor.org/rfc/rfc5219.html
  4. https://www.rfc-editor.org/info/rfc5219/
  5. https://datatracker.ietf.org/doc/rfc5219/
  6. https://www.rfc-editor.org/errata/eid331
  7. https://www.rfc-editor.org/rfc/rfc4566.html
  8. https://www.rfc-editor.org/rfc/rfc2250.html
  9. https://www.rfc-editor.org/rfc/rfc3550.html
  10. https://www.rfc-editor.org/rfc/rfc3551.html
  11. https://www.rfc-editor.org/rfc/rfc2736.html