摘要

  • RFC 3327 允许选定的 SIP 代理在 REGISTER 中加入 Path URI;注册服务器把有序向量与某个公共地址和 Contact 绑定保存,归属代理随后可把它预装进未来请求的 Route 集合。
  • Path 是面向未来的路由约束,而不是完整历史:实际经过的代理可以不留下自己,代理可以写入另一个节点,注册服务器可以变换向量,后续请求也可叠加本地策略。

联系人是位置,不是交付计划

设想一个终端从访问网络登记自己的公共 SIP 身份。Contact 指向终端当下可用的联系位置,注册服务器接受绑定并返回成功。数据库已经能回答这个公共身份对应哪个 Contact。然而终端可能位于边缘代理、防火墙或访问网策略之后;未来请求若直接送往 Contact,可能绕开必经的策略节点,也可能因为地址只在那条代理链后面才有意义而根本无法送达。

矛盾之处在于,REGISTER 本身刚刚通过了所需的中间节点。网络已经观察到一条可行的抵达过程,却没有义务把过程转化为联系人绑定的一部分。事务完成后,注册服务器保留了“在哪里”,归属代理却失去了“怎样去”。

Path 头字段把后者变成独立状态。处理 REGISTER 的代理可以加入一个 URI,声明今后发往这个已注册终端的请求应经过哪里。多个代理留下的值形成有序向量。注册服务器把它同公共记录地址以及具体 Contact 一起保存,并在成功响应中反射所接受的 Path。未来归属代理选择该 Contact 时,会先把向量装入 Route,再继续转发。

绑定粒度决定了正确性。同一个公共身份可以同时登记手机、电脑和网关,每个 Contact 都可能位于不同接入链后面。手机的 Path 不能成为电脑的 Path;一次从新边缘发起的刷新可以替换旧向量;绑定过期时,相关 Path 也应随之退出。若把路径当成用户级静态属性,昨天的接入策略就可能错误地支配今天的设备。

RFC 3263 所解决的是另一层发现:客户端怎样借助 DNS 找到某个域的 SIP 服务器。那能说明服务从哪里开始,却不能说明归属网络怎样穿过临时接入拓扑抵达某一条具体注册。Path 保存的是发现完成之后、绑定特有的那一段知识。

名叫 Path,并不意味着它是轨迹

看到一串 URI,人们很容易把它画成 REGISTER 逐跳经过的路线。RFC 3327 没有给出这种保证。一个实际处理过 REGISTER 的代理可以选择不插入自己;一个拓扑感知代理可以放入另一个节点的 URI,让未来流量去那里;注册服务器保存前可以按本地政策变换向量;归属代理实际发送时还可以叠加已有 Route 或默认出口。

因此,Path 更接近处方,而不是病历。它说明未来请求应受哪些有序路由约束,不必说明过去的请求究竟走过哪些设备。抓包只能证明在某个观察点出现了哪些值,不能证明列表穷尽所有经过节点,也不能证明列表中的每个节点曾被经过,更不能证明未来流量确实按原样执行。

可靠的证据记录至少要拆成四份:观察到的 REGISTER 传输轨迹、消息中声明的 Path 向量、注册服务器实际接受或变换后的绑定状态,以及后来请求真正实现的 Route。四者之间的差异正是需要调查的信息,不能为了生成一条整齐时间线而被抹平。

邻近机制也不能互换。Via 为单次事务保留响应返回链;Record-Route 随建立对话的请求形成当前对话的路由集;Path 在注册阶段收集,为尚未产生的未来对话服务。RFC 3608 的 Service-Route 则从注册服务器告诉用户代理,未来向外发起服务请求时该怎么走;Path 是告诉归属侧,向内抵达 Contact 时该怎么走。方向、时点、控制者都不同。

反射提供可见性,却不提供背书

成功 REGISTER 响应会返回注册服务器保存的 Path。普通用户代理无需用它构造自身路由,也可以忽略它,但仍有机会检查。若响应里出现陌生代理,终端或运维者至少能够发现,有人试图把自己放进未来每一条发往该 Contact 的请求。

这种风险具有持续性。恶意代理一旦成功插入 URI,影响就不再局限于一次 REGISTER;只要绑定有效,后续请求都可能被引向它。删除一个值可能绕过必需的安全或服务节点,改变顺序可能改变谁先观察流量,未经记录的正规化则可能把错误配置包装成合法状态。

规范讨论了完整性保护与相互认证,但它们的证明范围有限。已验证的完整性可以表明受保护字节在已识别对等方之间没有被修改,却不能表明节点诚实、可用、有权代表另一个节点,也不能证明它曾被过去流量经过或会被未来流量经过。反射让接受结果可比较,不等于为结果签发真实性证书。

RFC 3327 还警告用户代理不要自行插入 Path。后续代理可能把这个值理解为来自代理的路由指令,并在未来要求终端扮演代理。字段语法正确,不代表发言角色正确。谁插入、在哪一跳插入、基于什么信任关系插入,都是语义的一部分。

后续规范扩展了环境,没有改写证据边界

RFC 3327 发布于 2002 年 12 月,后来由 RFC 5626 更新。SIP Outbound 更系统地处理位于网络边界后的终端所建立的流,以及边缘代理如何维持可用返回路径。它让注册、流标识与接入路由能够更紧密协作,但没有把 Path 变成完整的分组历史。

RFC 5627 定义 GRUU,用于标识可路由的用户代理实例;RFC 3680 定义注册事件通知,让获准订阅者了解注册状态变化;RFC 5922 规定 SIP 域证书,补充域身份认证语义。IANA SIP 参数登记表记录字段与选项标签的标准化名称。这些材料能证明协议分工和文档演进,不能证明某项机制已被广泛部署、当前可用或天然可信。

RFC 3327 留下的历史经验超出了电话系统:身份、当前位置、强制路径与观察历史是四种不同的知识。网络可以掌握前两种却仍然无法送达,也可以掌握面向未来的约束却对过去所知甚少。Path 的价值是把缺失状态显式化;理解它的前提,则是不把面向未来的声明洗成关于过去的证据。

来源