在IMS支撑的语音通话中,有时代理服务器会将单个SIP呼叫转发到多个SIP端点,这个过程被称为Forking(分叉)。因此一个呼叫可在多个端点同时振铃。
使用SIP forking,可以让桌面办公电话与软电话或手机上的SIP电话同时响铃,而您可以轻松地从任一设备上接听电话。
一般来说,在办公室假如老板自己无法接听电话或离开办公室时,SIP forking可允许秘书通过其分机代为接听电话。
如果IMS系统设置代理服务器支撑Forking(分叉),则应用该功能时需要实行和响应它收到的许多代理的指令,Forking完成实现过程。目前有两种类型的Forking(分叉),它们分别为:
并行分叉(Parallel Forking)
顺序分叉(Sequential Forking)
一、并行分叉(Parallel Forking)
在并行分叉应用中代理服务器将一次将呼叫邀请(INVITE)分到两个设备(UA2、UA3)。两个设备都会产生180振铃,接听电话的终端都会回送200 OK。首先到达发起方(UA1)的响应(假设为UA2)将与UA2建立会话。对于其他响应将触发CANCEL。
图1.并行分叉中的呼叫应答
如果发起方同时收到两个响应,则根据q值决定通话对象。
二、顺序分叉(Sequential Forking)
在这种情况下代理服务器将呼叫邀请(INVITE)分叉到一个设备(UA2)。如果此时UA2不可用或忙,则代理会将其分叉到另一台设备(UA3)。
图2.顺序分叉中的呼叫应答
三、BRACH ID和标识
呼叫分支ID(Branch IDs)帮助代理匹配对分叉(Fork)请求的响应。如果没有分支ID代理服务器将无法理解分叉的响应,分支ID将在Via标头中可用。
UAC使用标签来区分来自不同UAS的多个最终响应。UAS无法解析请求是否已分叉。因此它需要添加一个标签。
代理也可以在生成最终响应时添加标签,它们从不将标签插入到它们转发的请求或响应中。
单个请求也可能由多个代理服务器分叉。因此,将分叉的代理应将其自己的唯一ID添加到它创建的分支中。
四、呼叫段和呼叫ID
呼叫支路(call leg)是指两个用户代理之间的一对一信令关系。CALL ID是SIP消息中携带的唯一标识呼叫的ID;呼叫是呼叫支路(call legs)的集合。
UAC从发送INVITE开始,由于分叉(Fork)它可能会收到来自不同UA的多个200 OK,每个对应于同一呼叫中的不同呼叫段。
因此呼叫是一组呼呼叫支路(call legs)。呼叫段是指UA之间的端到端连接。
call leg在两个方向上Cseq空间是独立的。在单个方向内每个事务的序列号都会递增。
图3.分叉(Fork)通话中消息应答
五、语音信箱
语音邮件(Voicemail)现在对用户来说非常普遍。这也是一个电话应用程序。当被叫方不可及或无法接听电话时,PBX会通知主叫方留言。
如果被叫方的号码无法访问,用户代理将获得3xx响应或重定向到语音邮件服务器。但是,需要某种SIP扩展来向语音邮件系统指示要使用哪个邮箱,即播放哪个问候语以及将录制的消息存储在哪里。有两种方法可以实现这一点 -
通过使用SIP标头字段扩展;
通过使用Request-URI来发送此信息。
假设用户sip:Tom@tutorialspoint.com在sip:voicemail.tutorialspoint.com 有一个语音邮件系统,它提供语音邮件,当它被转发到语音邮件服务器时,INVITE的请求URI可能如下所示:
sip:voicemail.tutorialspoint.com;target = sip:Tom@tutorialspoint.com;cause = 486下图显示了Request-URI如何携带邮箱标识符和原因(此处为486)。
图4.IMS支撑的语音信箱