SIP - 分叉
有时,代理服务器会将单个 SIP 呼叫转发到多个 SIP 端点。 这个过程称为分叉。 这里一个呼叫可以同时振铃多个端点。
通过 SIP 分叉,您可以让桌面电话与您的软件电话或手机上的 SIP 电话同时响铃,从而使您可以轻松地从任一设备接听电话。
一般来说,在办公室,假设老板无法接听电话或离开,SIP 分叉允许秘书接听他的分机的电话。
如果有可用的有状态代理,则可以进行分叉,因为它需要执行并响应收到的代理。
我们有两种类型的分叉 −
- 并行分叉
- 顺序分叉
并行分叉
在这种情况下,代理服务器将一次将 INVITE 分叉到两个设备(UA2、UA3)。 两台设备都会生成 180 Ringing,无论谁接到呼叫,都会生成 200 OK。 首先到达发起者的响应(假设 UA2)将与 UA2 建立会话。 对于其他响应,将触发取消。
![并行分叉](/session_initiation_protocol/images/parallel_forking.jpg)
如果发起者同时收到两个响应,则根据 q 值,它将转发响应。
顺序分叉
在这种情况下,代理服务器会将 INVITE 分叉到一台设备 (UA2)。 如果 UA2 当时不可用或繁忙,则代理会将其分叉到另一台设备 (UA3)。
![顺序分叉](/session_initiation_protocol/images/sequential_forking.jpg)
分支 - ID 和标签
分支 ID 帮助代理将响应与分叉请求进行匹配。 如果没有分支 ID,代理服务器将无法理解分叉响应。 Branch-id 将在 Via 标头中提供。
UAC 使用标签来区分来自不同 UAS 的多个最终响应。 UAS 无法判断请求是否已分叉。 因此,需要添加一个标签。
代理还可以在生成最终响应时添加标签,它们从不将标签插入到它们转发的请求或响应中。
单个请求也可能被多个代理服务器分叉。 因此,要分叉的代理应将自己的唯一 ID 添加到它创建的分支中。
呼叫支路和呼叫 ID
呼叫支路是指两个用户代理之间一对一的信令关系。 呼叫ID是SIP消息中携带的表示呼叫的唯一标识符。 调用是调用分支的集合。
UAC 通过发送 INVITE 开始。 由于分叉,它可能会收到来自不同UA的多个200 OK。 每个对应于同一呼叫中的不同呼叫支路。
因此,一个呼叫是一组呼叫线路。 呼叫支路是指UA之间端到端的连接。
呼叫支路两个方向上的CSeq空间是独立的。 在单个方向内,每次交易的序列号都会递增。
![呼叫支路 ID](/session_initiation_protocol/images/call_leg_id.jpg)
语音邮件
语音邮件如今对于企业用户来说非常常见。 这是一个电话应用程序。 如图所示,当被叫方无法接听电话或无法接听电话时,PBX 会提示主叫方留言。
如果被叫方的号码无法接通,用户代理将收到 3xx 响应或重定向到语音邮件服务器。 然而,需要某种 SIP 扩展来向语音邮件系统指示要使用哪个邮箱,即播放哪个问候语以及在哪里存储录制的消息。 有两种方法可以实现这一目标 −
通过使用 SIP 标头字段扩展
通过使用 Request-URI 来表示此信息
假设用户sip:Tom@tutorialspoint.com在 sip:voicemail.tutorialspoint.com 有一个提供语音邮件的语音邮件系统,当 INVITE 转发到语音邮件服务器时,它的 Request-URI 可能如下所示 −
sip:voicemail.tutorialspoint.com;target = sip:Tom@tutorialspoint.com;cause = 486
下图展示了Request-URI如何携带邮箱标识符和原因(这里是486)。
![SIP 语音邮件](/session_initiation_protocol/images/sip_voicemail.jpg)