摘要

  • RFC 3261 中的 180 Ringing 属于临时响应:它表示接收方用户代理正尝试提醒用户,也可能触发主叫侧本地生成回铃音。
  • 180 不证明远端设备实际发声、早期媒体已经送达、真人已经注意,或邀请已被最终接受。RFC 3262 的 PRACK 只让临时响应的接收更可靠,不会把临时状态变成接听回执。
  • 有用的运营记录应保留信号来自哪条分支、何时抵达、后来被什么事件替代,并把提醒、媒体、最终响应和真人行为分开。

一段声音,两处可能的现场

传统电话经验把回铃音与远端铃声绑在一起:听见“嘟——嘟——”,仿佛就能确信另一端正在响。SIP 把这条直觉链拆开了。RFC 3261 明确允许用户代理客户端收到 180 后启动本地回铃。主叫人耳边的声音,可能只是自己设备对一条信令消息的呈现,而不是从被叫环境传来的音频。

180 本身说得很精确:收到 INVITE 的用户代理正在“尝试提醒”用户。尝试有很多形态。手机可能只亮屏不响铃,桌面客户端可能弹出通知,系统可能开启勿扰模式,也可能根本无人守在设备旁。分叉路由时,一台设备开始提醒,另一条分支后来接通,先前分支随即被取消。信令可以证明某个 SIP 节点报告了提醒尝试,却看不到人的感官与动作。

临时响应的类别也在提醒读者不要越界。1xx 说明处理仍在继续,结果尚未确定。对 INVITE 的最终 2xx 才表示接受,其他最终响应则给出不同结局。如果监控系统一收到 180 就把通话标成“已接听”,它不是在简化显示,而是在删掉状态机中最重要的那段不确定性。

RFC 3261 共有八位署名作者:Jonathan Rosenberg、Henning Schulzrinne、Gonzalo Camarillo、Alan Johnston、Jon Peterson、Robert Sparks、Mark Handley 和 Eve Schooler。因此,这也不是把一项集体标准包装成个人发明的故事。Schulzrinne 的位置在于参与塑造了一个能把信令、媒体和用户体验分别描述、再彼此协调的体系。

早期媒体不会服从一个状态码

Gonzalo Camarillo 与 Schulzrinne 撰写的 RFC 3960 专门讨论早期媒体和回铃音生成。会话接受之前,网关或远端终端可能发送音频,例如拥塞说明、排队提示或特殊业务音;主叫终端也可能不等媒体,而根据 180 自己播放回铃。两种机制都能让人“听见东西”,但证据来源完全不同。

本地回铃若持续播放,可能遮住网关发来的带内说明;终端若一味等待早期媒体,而媒体路径没有建立,用户又可能只听见沉默。分叉进一步增加歧义:一条早期对话返回 180,另一条开始发送媒体,最终获胜的却可能是第三条。RFC 3960 因而讨论的是策略选择及其代价,并没有给出“180 必然对应远端铃声”的通用公式。

最少应把四只时钟分开。信令时钟记录临时响应何时到达;媒体时钟记录第一份可用媒体来自哪里、何时抵达;本地呈现时钟记录终端何时播放或显示提醒;最终状态时钟记录邀请何时被接受或失败。如果问题是“真人何时注意”,还需要第五类证据。简单通话里几只时钟常常接近,故障、分叉和争议里它们才显出差别。

这种边界不是协议缺陷。抓包能很有力地证明某个节点在某时收到某条消息,却无法测量另一台设备的音量、操作系统是否抑制通知、房间里有没有人。把缺失事实从别的控制面补齐,才比从一个状态码里推测更可靠。

PRACK 确认收到“临时”,而不是确认接通

有些临时响应承担会话协商等重要信息,不能任由不可靠传输丢失。Jonathan Rosenberg 与 Schulzrinne 合著的 RFC 3262 为这类 1xx 引入可靠传送:响应携带序列信息,接收方使用 PRACK 确认。

这套机制能够证明相应的临时响应被按序收到,但被确认的内容仍然只是临时状态。PRACK 不是对最终 2xx 的 ACK,不表示音频已抵达,也不是用户按下接听键的网络化身。RFC 3262 甚至允许最终响应在 PRACK 抵达之前发出。

序列号、重传和确认很容易让一条事件看上去“正式生效”。实际上,可靠性回答的是“对端是否收到了这条陈述”,最终性回答的是“邀请以什么结果结束”。一条临时消息可以被可靠送达,而通话依然没有答案。保持两者分离,正是 PRACK 提供精确价值的前提。

分叉以后,“正在振铃”不再是单数

一份 INVITE 可以同时送到多个联系人。第一条分支返回 180,第二条播放早期媒体,第三条拒绝,第四条最终接受。如果只保留通话级别的“振铃”标签,就丢掉了谁发出信号、那条分支是否仍有效等关键信息。

RFC 6228 后来加入 199 响应,让代理告诉上游:某一条早期对话已经终止。它不会终止其他早期对话,也不能替代原始邀请最终仍需收到的最终响应。它的作用是有选择地结束一条不会成为最终对话的分支,使接收方能够清理对应状态与媒体。

RFC 6228 的作者是 Christer Holmberg,并非 Schulzrinne。把它纳入分析,是为了观察 SIP 架构后来的延伸,而不是扩大个人署名。它也把运营原则说得更清楚:临时状态必须带来源。“发生过 180”是不完整记录,还要知道哪条早期对话发出它、哪项后续事件使它失效。

这并不意味着 180 毫无价值。以分支为单位记录“提醒开始”,可以发现路由推进到了哪里、哪些端点长期没有进入最终状态,并测量从邀请到结局的时间。只要保留来源、时间和替代关系,它就是诚实的运营信号;把它升级成“真人已接听”,才会制造虚假确定性。

人物身份与文档署名也要保留范围

Columbia 当前页面将 Schulzrinne 列为 Julian Clarence Levi Professor of Mathematical Methods and Computer Science,同时担任电子工程教授。IETF Datatracker 的当前快照列出他参与的 90 份 RFC。这说明其标准工作覆盖面很广,却不能把集体协作压缩成个人传奇。

准确说法应当是:RFC 3261 有八位作者;RFC 3262 由 Rosenberg 与 Schulzrinne 合著;RFC 3960 是 Camarillo 与 Schulzrinne 撰写的 Informational RFC,不是 Internet Standard;RFC 6228 则由 Holmberg 撰写。来源署名与信令证据遵循同一种纪律——先保留谁在什么范围内说了什么,再决定能够推出多大的结论。

来源