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. 如何查看linux内核中驱动的初始化顺序?

    答:通过生成的System.map可以查看到,主要关注__initcall_<module_entry_function>_init<level>,如: __initcall_ ...

  2. Android-Handler消息机制实现原理)(转)

    Android-Handler消息机制实现原理   一.消息机制流程简介 在应用启动的时候,会执行程序的入口函数main(),main()里面会创建一个Looper对象,然后通过这个Looper对象开 ...

  3. 为什么使用 Web Services?

    最重要的事情是协同工作 由于所有主要的平台均可通过 Web 浏览器来访问 Web,不同的平台可以借此进行交互.为了让这些平台协同工作,Web 应用程序被开发了出来. Web 应用程序是运行在 Web ...

  4. VBA添加下拉菜单

    Sub createMenus() Dim cmdBar As CommandBar Dim cmdMenu As CommandBarPopup Dim cmdBtn As CommandBarBu ...

  5. failOnMissingWebXml

    使用maven创建项目时有时在pom.xml的war处出现failOnMissingWebXml的错误,根据错误提示的原因可以知道项目是web项目,打包时打成war包. 如果项目里没有web.xml, ...

  6. phpcms前台无法退出无法清除cookie

    phpcms前台无法退出无法清除cookie 如果caches\configs\system.php 中的cookie_path 设置为空..就会出现退不出的情况..设置为'cookie_path' ...

  7. CSS 自适应技巧

    DIV的内容垂直居中 不再MARGINT-TOP多少 来居中显示 display:table-cell; #block-1{ width:100%; height:80px; display:tabl ...

  8. WebsSocket

    本篇阅读目录 一.Websocket原理(握手.解密.加密) 二.基于Python实现简单示例 回到顶部 一.Websocket原理(握手.解密.加密) WebSocket协议是基于TCP的一种新的协 ...

  9. centos(linux)--vsftpd配置

    1.安装 执行 yum -y install vsftpd 注:(1)是否使用sudo权限根据个人的具体情况 (2)rpm -qa | grep vsftpd 可以通过这个检查是否已经安装vsftpd ...

  10. CJL.0.1.js

    /*! * Cloudgamer JavaScript Library v0.1 * Copyright (c) 2009 cloudgamer * Blog: http://cloudgamer.c ...