3PCC全称Third Party Call Control,中文即第三方电话呼叫控制,指的是由第三方控制者在另外两者之间建立一个会话,由控制者负责会话双方的媒体协商。3PCC是一种非常灵活的会话控制方式。在PSTN网中,第三方呼叫控制通常用于会议、接线业务(接线员创建一个连接另外双方的呼叫)。同样,使用SIP协议也可以借助3PCC来完成PSTN网中的一些相关业务,例如点击拨号、通话过程中放音等等,而且实现起来非常方便。RFC3264中定义了一种提供/应答模式,使两个实体之间可以使用SDP的提供/应答(offer/answer)模式进行会话协商。

SIP消息可以携带SDP消息体。SDP(会话描述协议)是用来描述与媒体流相关的参数以及与会话相关的信息,其中包括对会话的描述以及媒体类型、数据发送到的端口、传输协议(例如RTP)以及媒体格式(例如RTP载荷格式)的描述。3PCC的实现关键就在于控制者如何在会话双方之间使用SDP消息协商即将建立的会话。

需要说明的是,下面的所有flow讲解都省略了中间的部分服务器应答,如Trying、Ringing等应答,因为这些应答不是3PCC流程所控制的关键点。且下面的说明都是依据带有标号顺序的SIP消息为核心。

根据SIP协议的整个协商处理机制,可以有下面四种方法实现3PCC(RFC 3725):

Flow 1:

(1)是Controller向A发送一个不带SDP的INVITE请求,不带SDP即前面所说的,没有Message Body部分;

(2)是A给Controller的200 OK应答,其中的offer指的是SDP消息,这其中描述与A有关媒体处理能力的相关数据,详见SDP协议;

(3)是Controller向B发送INVITE请求,这其中带有A的SDP相关描述;

(4)是B给Controller的200 OK应答,其中的answer指的是SDP消息,这其中描述与B有关的媒体处理能力的相关数据;

(5)是Controller对B的ACK应答,不含任何SDP信息,因为在前面的INVITE中已经有了

(6)是Controller对A的ACK应答,其中带有B的SDP相关信息,这其实就让媒体流在A和B之间传输了,而不用Controller去转发媒体流。

Flow1是最简单的一种3PCC控制方式,不需要Controller对SDP做控制,但是有个典型的缺点就是,当B不及时对Controller的INVITE请求做200 OK的应答,会导致A周期性的向Controller发送200 OK的消息,最终可能会导致A认为呼叫失败,而主动去挂断电话。

Flow 2:

(1)是Controller向A发送INVITE请求,该请求带一个bh SDP1。所谓的bh SDP1只是一个伪SDP描述,里面只有简单media、codec和connection信息,connection信息中的地址必须是0.0.0.0,port可以为不为0的任意数字,关于SDP的详细东西可以看RFC 4566;

(2)是A给Controller的200 OK应答,里面带有的SDP2是一个完整的SDP描述;

(3)是Controller向B发送的INVITE请求,和Flow 1中的(3)是完全一样的;

(4)是Controller对(2)的简单应答;

(5)是B给Controller的200 OK应答,里面带有与B相关的SDP描述;

(6)是Controller对(5)的简单应答;

(7)是Controller向A发起的re-invite请求,其中带有与B有关的SDP描述;

(8)是B针对(7)做的200 OK应答;

(9)是针对(8)做的简单应答。最终在A和B之间建立媒体流(当然这是理想状态,呵呵)

Flow 2的优点是所有的最终响应都可以被立即确认,不会因超时而导致呼叫失败。缺点也是显而易见的,Controller必须预先知道本次呼叫所要使用的媒体类型来创建初始的“黑洞”SDP描述,同时“黑洞”是一种扩展机制,不是所有的UA都支持,最后就是要假设(8)中带有的SDP2和(2)中的完全一致,才不至于产生无限循环的re-invite请求。因此,Flow 2只是在理论上可行,实际操作过程中强烈建议不要使用。

Flow 3:

(1)和(2)的说明可以参见Flow 1(1)和(2)中的说明;

(3)是Controller针对(2)的简单应答,这其中的SDP描述中关于connection部分全部被改为0.0.0.0,即所谓的“黑洞”SDP;

(4)和(5)的说明可以参见Flow 1中的(3)和(4)说明;

(6)是Controller向A发起的re-invite请求,其中的offer2是根据offer1和offer2之间所存在的共同的媒体处理能力由Controller生成的,但是其中connection与offer2中的一致,这样才能保证流媒体在A和B之间传输;

(7)是A对re-invite的200 OK应答,其中的answer2是根据offer2做的重新调整,他与offer1已然不同;

(8)是Controller针对(5)做的ACK应答,其中带有answer2所描述的SDP信息,这里只是为了区分A和B而写成answer2了;

(9)是Controller针对(8)做的简单ACK应答;

Flow 3的优点当然是,首先是所有的最终响应都能够被及时处理,不会产生超时和重传的问题;其次是Controller不需要预知本次会话的SDP媒体描述信息。

Flow 3相对来说要复杂一点,他需要Controller去处理两者的SDP描述信息,为他们找到交集,当然他们也有可能不存在交集而导致最终的呼叫失败。

Flow 4:

Flow 4是针对Flow 3做的一个变通,降低了复杂度,其实际的SIP消息处理过程与Flow 3完全一致。这里我只对几个关键点做一下说明。

在(1)中offer1 no media指的是SDP描述中不带m行,具体的含义参见SDP规范吧,:)

其余的过程与Flow 3中完全一致。

Flow 4相对于Flow 3的缺点是显而易见的,A中没有任何媒体描述,但是呼叫已经正常建立了。当从B得到的SDP描述时,发现A和B没有共同的媒体描述时,必须中断Controller与A和B之间的会话,但是这是A和B同Controller之间的会话已经正常建立了,A和B会因为听不到任何媒体流而感到奇怪。

综上所述,Flow 3是最为合适的控制流程。

SIP Delayed Media Inbound - 3PCC: http://www.dialogic.com/webhelp/bordernet2020/1.0

SIP 3pcc的更多相关文章

  1. SIP中第三方呼叫控制(3PCC)建立流程

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

  2. 《FreeSWITCH: VoIP实战》:SIP 模块 - mod_sofia

    SIP 模块是 FreeSWITCH 的主要模块,所以,值得拿出专门一章来讲解. 在前几章时里,你肯定见过几次 sofia 这个词,只是或许还不知道是什么意思.是这样的,Sofia-SIP 是由诺基亚 ...

  3. 转:SIP相关的RFC文档索引

    索引来源于http://www.packetizer.com/ipmc/sip/standards.html SIP Standards Core SIP Documents RFC Document ...

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

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

  5. freeswitch对接其它SIP设备

    这几天用到freeswitch对接其它设备方面的知识,这里整理下,也方便我以后查阅. 操作系统:debian8.5_x64 freeswitch 版本 : 1.6.8 一.freeswitch作为被叫 ...

  6. [转载]El Capitan 中 SIP 介绍

    这两天大家纷纷将 OS X 系统升级到了 El Capitan,然后发现,一些注入的工具无法使用了,某些系统目录无法使用了,第三方未签名的 kext 无法加载了,问题一堆堆的.这是因为,Mac OS ...

  7. SIP学习笔记(转)

    本文转发自:http://blog.chinaunix.net/uid-20655530-id-1589483.html 学习 SIP 协议最快捷的方法是通过范例来学习, 找到了一个完整的呼叫流程,l ...

  8. SIP模块版本错误问题:the sip module implements API v??? but XXX module requires API v???

    系统安装了python 2.7,继续安装PyQt4,于是依次下载sip.pyqt4源码进行安装.用以下代码测试: import PyQt4.QtGui 显示出错.错误信息:the sip module ...

  9. sip协议注册时response值的计算方法

    sip注册时有四个步骤, 1.客户端向服务端发送不带Authorization字段的注册请求 2.服务端回401,在回复消息头中带WWW_Authorization 3.客户端向服务端发送带Autho ...

随机推荐

  1. yum -y与 yum有什么区别

    在linux中,经常使用yum来进行软件的安装,更新与卸载,那我们会发现,在使用yum的时候,通常有下面两种指令模式: ①yum install  xxx ②yum -y install  xx 那这 ...

  2. 001-多线程-JUC集合-框架概述

    一.概述 1.1.java集合 java集合的架构,主体内容包括Collection集合和Map类:而Collection集合又可以划分为List(队列)和Set(集合). 1. List的实现类主要 ...

  3. sed例子

    以care.log这个log文件为例, care.log: 05:44:31,816 DEBUG RawAggregationWorker:70 - LTS is working on Raw Dat ...

  4. Python中bytes与字符串的相互转化

    代码: # bytes转字符串方式一 b=b'\xe9\x80\x86\xe7\x81\xab' string=str(b,'utf-8') print(string) # bytes转字符串方式二 ...

  5. ubuntu16.04 下通过rc.d(rc.local)实现开机启动(未登录)anydesk

    先编辑anydesk-X.X.X/init/anydesk文件,将"DAEMON=//usr/bin$NAME"改成"DAEMON=/XXX/anydesk-5.1.1/ ...

  6. Path环境变量的作用

    作用: 当我们要求系统运行一个程序(例如a.exe)而没有告诉它程序所在的完整路径时,系统会先在当前目录寻找是否存在a.exe,如果找到,直接运行:如果没有找到,会去path路径下面找.设置path, ...

  7. 读rfc HTTP 协议

    这是IETF ( 国际互联网工程任务组(The Internet Engineering Task Force,简称 IETF))制定的协议之一. 互联网工程任务组,成立于1985年底,是全球互联网最 ...

  8. Fabric 查看 blockfile_000000 区块文件

    进入peer docker exec -it peer bash cd /var/hyperledger/production/ledgersData/chains/chains

  9. 【FFMPEG】VS2013编译ffmpeg

    原文:http://blog.csdn.net/uselym/article/details/49885867 由于VS2013支持c99了,所以,可以直接用vs2013进行ffmpeg的编译调试,而 ...

  10. ffmpeg学习笔记-编译脚本

    之前已经用他人的编译脚本对ffmpeg进行了成功编译,那么在裁剪ffmpeg的时候需要指定文件,这时候应该怎么编写编译脚本呢?本文目的在于说明ffmpeg编译脚本的编写 首先在ffmpeg的目录下新建 ...