1.引言

在传统的电话网环境中,第三方呼叫控制允许一个实体(这里称为控制器- controller) 建立并管理另外的两方或多方之间的通信关系,而其本身并不参与通信。

第三方呼叫控制经常用于运营商业务 (运营商常常会建立一个呼叫将两个用户连接起来)和会议。

同样地,许多SIP业务都可能通过3PCC实现。这包括从PSTN继承的传统的业务,也包括新的业务,例如点击拨号(click-to-dial)。点击拨号允许用户在他们想与客服代表通话时点击一个Web页面上的链接,之后web服务器便会创建一个用户与客服代表之间的呼叫。这个呼叫可以是Phone2Phone、PC2Phone、或者PC2PC的。

仅使用RFC 3261中的机制,便可以实现3PCC。实际上有多种不同的呼叫流程都是可行的,每种都能在遵从SIP的用户代理上正确的工作。当然,每种流程都有其优点和缺陷。

2.流程1

说明如下:

1. Controller向B发送INVITE,且不携带SDP,B收到INVITE发现其中未含SDP。

2. B向Controller回200响应,其中含有SDP,作为offer。

3. Controller向B发送INVITE,其中携带来自B前面所回的200响应中的SDP作为offer。

4. A分析offer产生answer,并在200响应中返回Controller

5. Controller将answer放在ACK中发送给B

6. Controller向A发送ACK。

这个流程非常简明,Controller 无需处理SDP,可以应用于在任何两端支持的媒体类型。

但是这个流程可能会存在严重的超时问题:如果A不能立即应答呼叫的话,Controller将不能马上向B发送ACK。这会导致B在一定时间内周期性重发200 OK响应(根据RFC 3261 的规定这个时间的时长为64*T1)。如果这段时间之后,ACK仍未到达B,那么这个呼叫就回被认为失败了。

这个流程适用于控制者知道A将会立即应答INVITE消息的场景。通常A为媒体服务器上提供的种自动服务。

3.流程2

针对流程1中的超时问题,流程2进行了改进。

流程2在在流程1的基础上增加消息1~3,用于解决B上的超时问题:C先与A建立了会话(媒体未激活),这保证了之后的(re)INVITE(6)的200(7)响应会立即返回C,使得ACK能够马上发给B,有效避免了超时问题。

流程2中,Controller需要对SDP进行处理。Answer1由Controller生成,是一个所谓黑洞(black hole)SDP,其连接地址为0.0.0.0。Offer2是由Controller基于offer2得来的,可能需要对其中的媒体行进行重组或裁剪。例如,如果offer1含有一个audio和一个video行,但是offer2只含有一个audio行,Controller需要在offer2中加一个video行(将其端口设为0),生成offer2‘。类似地,Controller会基于answer2‘生成answer2,发给B。

4.流程3

流程3是在流程2上变化而来,并降低了复杂性。实际的SIP消息流程完全一样,只是在SDP放置和处理上有所不同。

在消息1~3中,与流程2的不同在于:这里,Offer1中根本没有媒体,也就是说没有 m 行。这是合法的,这暗示了会话的媒体将会在之后通过re-INVITE建立。同样地,Answer1也没有媒体。

之后的流程与流程III的完全一样,但需要进行的处理,即offer2到offer2‘的转换,answer2’到answer2的转换,会简单得多。实际上,这里根本不需要媒体处理,要改变的仅仅是修改origin行,以便offer2‘ 中的origin行之与offer1中的值是合法的 (合法性要求version值增加1,其他参数保持不变)。

关于这个流程也有一些限制。首先,用户A在任何媒体都不建立的情况下被振铃,这意味着用户A将不能根据其媒体构成来接受或拒绝呼叫;其次,A和B都会最终在不知道是否有兼容的媒体之前就应答了呼叫 (例如产生200响应)。这样,如果实际上没有共同的媒体能力,呼叫将会在之后通过一个BYE结束。然而,用户已经被振铃了,造成骚扰,并且还可能产生计费事件。

5.总结

流程1是最简单有效的流程。如果controller确定通信双方中的一方实际上是一个将会立即应答呼叫的自动设备,比如,媒体服务器、会议服务器、消息服务器,等等,那么就应该使用这个流程。可以想象,大多数情况下,3PCC建立的通信中会有一方是自动设备,因此这个流程会很常用。

如果通信的双方都是真实的人,或者是未知类型的实体,推荐使用流程3;流程2也可以使用,但是不会提供更多的好处。

在大多数情况下,包括在推荐的流程中,在完成到B呼叫的呼叫的时候,A会听到一段时间的静默。这会显的不太理想。对于这个问题,可以考虑在完成到B的呼叫的时候,将A连接到一个music-on-hold资源上来解决。

SIP中第三方呼叫控制(3PCC)建立流程的更多相关文章

  1. STUN/TURN/ICE协议在P2P SIP中的应用(一)

    1           说明 本文详细描述了基于STUN系列协议实现的P2P SIP电话过程,其中涉及到了SIP信令的交互,P2P的原理,以及STUN.TURN.ICE的协议交互 本文所提到的各个服务 ...

  2. STUN/TURN/ICE协议在P2P SIP中的应用(二)

    1       说明 2       打洞和穿越的概念... 1 3       P2P中的打洞和穿越... 2 4       使用STUN系列 协议穿越的特点... 2 5       STUN/ ...

  3. SIP中的SDP offer/answer交换初探

    1.引言 SDP的offer/answer模型本身独立与于利用它的高层协议.SIP是使用offer/answer模型的应用之一.RFC 3264 定义了offer/answer模型,但没有规定使用哪个 ...

  4. 开发与测试整体过程中的Git分支merge流程

    开发与测试整体过程中的Git分支merge流程 Git分支merge之开发流程 首先在Gitlab上有个仓库存储着原始的项目代码,其中包含一个叫master的分支.然后可能按功能进行分配,由不同的开发 ...

  5. 【转】SIP 中的Dialog,call,session 和 transaction

    如果你对Sip协议中Call, Dialog, Transaction和Message之间的关系感觉到迷惑,那么,那么我可以告诉你,你并不孤单,因为大多数初学者对于这些名词之间的关系都会感到疑惑.   ...

  6. Sipdroid实现SIP(六): SIP中的请求超时和重传

    目录 一. Sipdroid的请求超时和重传 二. SIP中超时和重传的定义 三. RFC中超时和重传的定义 一. Sipdroid的请求超时和重传 Sipdroid实现SIP协议栈系列, 之前的文章 ...

  7. 转 关于Https协议中的ssl加密解密流程

    关于Https协议中的ssl加密解密流程 2016年09月28日 09:51:15 阅读数:14809 转载自:http://www.cnblogs.com/P_Chou/archive/2010/1 ...

  8. java项目建立流程

    spring mvc 书籍Spring in Action, 4th Edition java项目建立流程 1 使用maven来管理项目中的库.先用marven建立一个框架mvn archetype: ...

  9. 在Web应用中接入微信支付的流程之极简清晰版

    在Web应用中接入微信支付的流程之极简清晰版 背景: 在Web应用中接入微信支付,我以为只是调用几个API稍作调试即可. 没想到微信的API和官方文档里隐坑无数,致我抱着怀疑人生的心情悲愤踩遍了丫们布 ...

随机推荐

  1. Linux命令:hexdump

    hexdump是Linux下的一个二进制文件查看工具,它可以将二进制文件转换为ASCII.八进制.十进制.十六进制格式进行查看. 指令所在路径:/usr/bin/hexdump 命令语法: hexdu ...

  2. SQL-W3School-高级:SQL INNER JOIN 关键字

    ylbtech-SQL-W3School-高级:SQL INNER JOIN 关键字 1.返回顶部 1. SQL INNER JOIN 关键字 在表中存在至少一个匹配时,INNER JOIN 关键字返 ...

  3. Class.ForName()读取配置文件

    榨汁机(Juicer)榨汁的案例 分别有水果(Fruit)苹果(Apple)香蕉(Banana)桔子(Orange)榨汁(squeeze) public class Demo_Reflect { /* ...

  4. c++ throw异常(学习)

    #include <iostream>#include <stdio.h> using namespace std; void my_copy(const char* src_ ...

  5. .net framework 4.0 安装失败解决办法

    方法一 1.打开cmd命令窗口   运行net stop WuAuServ    停止更新服务 2.开始----运行------输入%windir% 3.找到SoftwareDistribution的 ...

  6. JAVA 基础编程练习题41 【程序 41 猴子分桃】

    41 [程序 41 猴子分桃] 题目:海滩上有一堆桃子,五只猴子来分.第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把 多的一个扔入海中,拿走了一份.第二只猴子把剩下的桃子又平均分成五份,又多了 ...

  7. iOS Xib布局某些控件显示或隐藏<约束的修改>

    对于这个问题使用Masonry是很好解决的. 注意:绿色的是label2,当indexpath.section % 2 == 0时,label2不存在. 关键代码如下: if (indexPath.s ...

  8. swift 第二课 基础知识-2

    setter 和getter 的使用--> 适合计算使用 struct Point { var x = 0.0, y=0.0 } struct Size { var width = 0.0, h ...

  9. 微信小程序 — 自定义picker选择器弹窗内容+textarea穿透bug

    微信小程序中定义好的几种picker选择器,不管是日期选择器还是地区选择器,或是其他的都只有定死的样式和内容. 但是大多数开发程序的情况下还是需要自己写样式的,或是内容的. 例如: 代码如下: < ...

  10. 计算1+2+...+n

    牛客上面一道题,闲来无事做做陶冶情操. 这一陶冶还真的陶冶出了骚操作 看一下题目吧: 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及 ...