跳到主要内容

5.4. 外观代理

本规范中定义的外观代理 (Appearance Agent) MUST 为向 AOR 注册的 UA 实现一个对话包状态代理. 外观代理 MUST 支持 Section 5.2 中定义的外观对话包扩展, 并使用 'shared' Event 头字段参数. 外观代理 MUST 支持此事件包的发布和订阅.

外观代理 MUST 具备发现与该 AOR 关联的所有对话状态的方法. 如果无法从呼叫有状态代理 (call stateful proxy) 或背靠背用户代理 (Back-to-Back User Agent, B2BUA) 获取此信息, 外观代理可以使用注册事件包 [RFC3680] 来获知与该 AOR 关联的 UA, 并订阅它们的对话事件状态. 外观代理还可以订阅某个 UA 的对话事件状态, 以便重建状态. 因此, 注册服务器 MUST 支持注册事件包.

RFC 4235 建议对话包通知 "only contain information on the dialogs whose state or participation information has changed". 本规范按如下方式扩展 RFC 4235. 每当 AOR 组中的 UA 发生以下事件时, 外观代理 SHOULD 发送对话事件状态通知:

  1. 接收, 发起, 应答或终止呼叫.

  2. 呼叫被置于保持或解除保持.

  3. 呼叫被加入或替换.

  4. 外观编号被预留或释放.

外观代理 MUST 为所有传入呼叫分配外观编号, 并立即向订阅共享组 AOR 的 UA 发送通知. 除非某个呼叫替换另一个呼叫, 否则会分配新的外观编号; 在替换呼叫的情况下, 使用被替换呼叫的外观编号.

外观代理 MUST 在请求被发布时, 或在未预先发布而发送 INVITE 时, 为出站呼叫分配外观编号. 当 UA 发布为出站呼叫占用外观的尝试, 或者 UA 发布咨询呼叫 (即发布中不包含外观编号) 时, 外观代理为该 UA 预留外观编号. 如果预留的外观编号在一段时间内未被使用 (建议值: 30 秒), 外观代理会释放该外观编号, 使其可以分配给另一个 UA.

如果某个传入呼叫到达一个组, 且没有可用的外观编号, 该传入呼叫仍会分叉到所有已订阅的 UA, 但通知中不会包含外观编号. 此外, 当该呼叫到达 UA 时, 其 Alert-Info 头字段中不会带有 appearance 参数. 如果组中所有已订阅的 UA 都拒绝该传入呼叫, 则执行正常的呼叫处理 (很可能转发到语音信箱或另一个 AOR).

外观编号的分配由外观代理管理; UA 不能直接观察到这一过程. 但是, 订阅共享组 AOR 的 UA 会在外观代理分配或释放外观编号时收到通知.

外观代理负责为 UA 创建的新对话分配外观编号, 并负责解决外观编号争用. 当两个 UA 同时尝试占用同一个外观编号时, 可能发生争用. 外观代理通过在短时间内接收到来自 UA 且带有相同外观编号的发布来检测争用. 检测到争用时, 外观代理 MUST 只选择其中一个 UA 分配该外观编号. 其他 UA 将收到其发布的错误响应. 选择哪个 UA 赢得争用的标准是外观代理的策略决策. 一种方法是选择最先到达的发布. 外观代理可以通过查看 Via 头字段中的 SIP 时间戳, 或基于其他本地处理时间戳, 来确定哪个发布最先到达.