摘要

  • RFC 3388 让 SDP 的媒体行拥有可引用名称,并能形成会触发同步或复制行为的关系;但只要有一条媒体行缺少 mid,所有分组都不得执行。
  • 这条失败关闭规则不会销毁基础媒体描述,却能阻止应用凭局部线索把正确语义施加到错误媒体上。

一份会话描述列出四条 m= 行。前三条有唯一标签,第四条也有合法地址、端口和格式,却没有 mid。分组行只引用前两条。直觉会说:第四条显然与分组无关,照常执行前两条的关系即可。

RFC 3388 明确拒绝这种推断。只要描述中使用 group,每一条媒体行都必须有 mid,无论它是否出现在某个分组里。缺少一个标签,应用就不能执行任何媒体分组。基础媒体仍可按 SDP 规则处理;失效的是上面的关系层。

这份 Standards Track 文件发布于 2002 年 12 月。原始 SDP 能罗列音频、视频和其他媒体,却没有标准方式表达多条媒体描述如何相关。接收方看到多条线,只能依靠带外知识或应用私约决定哪些要同步,哪些其实属于同一个逻辑媒体实例。

RFC 3388 增加了两块最小语法。媒体级 a=mid 给每条 m= 行一个会话内唯一标记;会话级 a=group 用已登记语义把多个标记连接起来。最初两种语义是用于播放同步的 LS,以及用于流识别的 FID。

关系不是注释。LS 要求应用恢复各媒体的原始时间关系并同步播放。RTP 通常借助 RTCP 把不同时间戳映射到共同墙钟;非 RTP 媒体要另找机制。分组声明的是义务,不是时钟观测,也不能证明用户最终看到口型与声音对齐。

FID 的影响更直接。多条 m= 行和多个 RTP 会话可以共同表示一个媒体流。蜂窝终端可能为不同编解码器准备不同端口;DTMF 事件可能送往应用服务器,普通语音则送往用户设备。若当前编解码器在多个成员中都可用,发送端必须向多个会话发送副本。

因此,一项错误关联就可能改变目的地。RFC 3388 的安全章节警告:能篡改 FID 会话描述的攻击者,可以迫使参与方把媒体副本发往任意目的地。信令完整性不是文件装饰,而是所声明分组获得执行权的前提。

身份规则相应严格。mid 在一份描述中必须唯一;分组若引用不存在的标签,整条分组行必须被忽略;媒体行可以参加不同语义的多个组,但 2002 年版本不允许它在同一语义的多个组中重复。RFC 5888 后来根据实现经验取消了最后这项数量限制,却保留了身份与关系框架。

最有价值的设计是“完整覆盖”。即使某条媒体行没有进入任何组,只要描述里出现分组,它也必须被命名。因为“没被引用”与“标签在传输或生成过程中丢失”从局部看可能完全一样。规范不允许应用替缺失证据编写关系。

SIP 的提议/应答又加入一个陷阱。RFC 3264 仍按顺序对齐媒体:提议第一行对应应答第一行。mid 没有取代这条规则。如果应答保持行顺序,却把两个标签互换,应用必须忽略描述中的全部 mid 和 group。

它没有尝试用标签拯救“看起来显然”的对应。标签是对既有协商位置的稳定命名,不是静默重排媒体身份的第二套协议。身份叠加层与基础对齐冲突时,叠加层退出。

应答方若理解某种分组语义,可以返回原成员集合或其子集。被端口零拒绝的媒体必须从组中移除;实际使用的是应答里的集合。这样,请求关系与接受关系留下两张不同回执。

应答方不能在应答里突然发起新分组。两次 SDP 交换不会给它一张“提议方接受了新关系”的回执。它若需要分组,应在之后成为新的提议方。控制方向由谁能取得明确接受决定,而不是由谁先写下属性决定。

向后兼容也保留不确定性。RFC 3388 没定义 SIP Require。不认识属性的旧端可以直接忽略它们,把 FID 成员当成独立媒体、选择混音、拒绝会话,或迫使对方用更简单描述重试。SIP 返回成功不等于关系语义已执行。

用 Lu Heng 的运行代码优先原则看,这是一种克制的共同层。共同规则必须确定且可本地验证:所有媒体有唯一名字,名字在对应位置间稳定,应答明确选出成员。条件不满足时,关系失去权限;应用可以继续处理基础事实,却不能凭直觉制造控制权。

RFC 5888 后来取代 RFC 3388 并修订局部限制,但这条历史原则没有过时:有效记录的列表,不等于可以执行的关系集合。少一个标签时,留下媒体、撤回假设,才是更小的失败面。

来源