作者:johney_zhou
链接:https://www.jianshu.com/p/a51bd7380894

关键词:

SIP BFCP交互流程NAT双流SDP

摘要:

我司三代高清SP4开始支持BFCP功能,下文为初探BFCP协议,如有出错欢迎大家多提意见。

案例描述

将BFCP应用于SIP双流中,主要是用BFCP消息来控制SIP双流的开启与关闭。针对SIP双流,在实现过程中我们用BFCP建立一个新的通道来记录双流。而通过将BFCP协议中所提到的层与双流通道进行关联,通过对层的请求与释放来达到间接控制双流的目的。----《BFCP协议简介及应用》

案例分析

1、BFCP在通信协议中如何体现?

2、BFCP在SIP对通中的流程分析?

3、BFCP是如何完成双流交互?

解决过程

概述

BFCP功能开发主要基于如下RFC文档:

RFC4582:该文档描述了BFCP协议通信模型,BFCP消息类型及编码方式,BFCP通信举例。是BFCP协议的主要参考文档。

RFC4583:该文档主要描述了BFCP协议和SIP协议的结合使用,在SDP中如何添加BFCP能力的m行。

以上是BFCP协议开发所参考的两个主要文档,此外还参考了其他RFC文档,如RFC4145(主要描述了BFCP协议所涉及的Setup及Connection属性等),RFC4574(主要描述了BFCP协议所涉及的Label属性等)。

BFCP在通信协议中的体现

以三代高清为例,如何通过抓包查看我们终端是否真的启用BFCP协议

BFCP是标准协议,他在RFC4583文档《r​f​c​4​5​8​3​.​S​e​s​s​i​o​n​

​D​e​s​c​r​i​p​t​i​o​n​ ​P​r​o​t​o​c​o​l​ ​(​S​D​P​)​ ​F​o​r​m​a​t​ ​f​o​r​

​B​i​n​a​r​y​ ​F​l​o​o​r​ ​C​o​n​t​r​o​l​ ​P​r​o​t​o​c​o​l​ ​(​B​F​C​P​)​

​S​t​r​e​a​m​s》中明确了BFCP协议可以封装在SDP协议中的。

加入BFCP后,对于SIP SDP能力的改变主要体现在两个方面:

(1)SDP能力里多了一个m行来标识BFCP,如下图所示:

M行

(2)SDP中对于视频通道能力多了一个content及label描述项,如下图所示:

label描述

标识视频通道的有两个m行。第一个m行下面有属性content为main,表示该通道为主流视频通道,其label值为1;而第二个m行的content属性值为slides,表示该通道为双流视频通道。除了上述两点外,支持BFCP对于视频通道要求是sendrecv属性(如图中m行所示)。

BFCP是如何完成双流交互

下图为我司现在SIP双流交互流程:

交互流程

上图中,用红色标识的是BFCP消息,蓝色是正常的SIP信令,图中的部分SIP信令及BFCP消息是可选的,这里说明如下(假设主被叫两端均支持BFCP):

SIP信令(1~8)及BFCP消息(A、B)这些流程是在呼叫开始后就会完成的,不管参与呼叫的两端是否有发双流的请求。因此要求主被叫两端在呼叫之前就事先确定好本地的双流收发能力(即开启BFCP后,协议栈内部自动完成两次INVITE交互)。其中在第二次INVITE交互的过程中参与呼叫的双方协商出本端的BFCP角色(Client/Server)。一旦一方确定了自己为BFCP Server,它即会在指定的端口开启监听。另一方确定自己为BFCP Client,它会与对端建立tcp连接,之后向对端发出BFCP消息Hello。至此BFCP初步交互完成。

接下来的双流发送根据终端是否改变双流能力分为两种情况:

(1)若双流发送方改变双流能力,则SIP信令(9~11)会执行,重新进行双流的协商;

(2)若双流发送方不改变双流能力,则SIP信令(9~11)跳过。

双流的发送与关闭也与发出请求的终端所处的BFCP角色有关。上图BFCP消息(C~F)对应的是BFCP Client发双流及关双流。其中BFCP消息C、D对应发双流,E、F对应关双流。其中BFCP server向BFCP Client回复的FloorRequestStatus消息中携带了对请求的floor状态的回复,只有该状态为Granted时才默认成功。

上图BFCP消息G、H对应的是BFCP Server发双流与关双流,其中BFCP消息G对应发双流,H对应关双流。与BFCP Client请求不同的是,BFCP Server发双流及关双流均不需要等待Client的回复,BFCP Server在发双流时会定时向BFCP Client发送状态为Granted的FloorStatus消息,直到关双流消息发出。

BFCP穿越NAT

问题1:过NAT环境,终端A(内网)和终端B(外网)都开启BFCP,建立点对点会议,且开启音频视频的防火墙端口映射;终端A(内网)终端发起双流,终端B没有建立通道。

疑问:BFCP是基于TCP连接的为何内网无法与外网进行交互呢?

环境:终端A:172.16.177.127;终端B:192.168.60.91;NAT服务器:192.168.60.11;

在终端A处抓包,搜索条件ip.addr==172.16.177.127&&ip.addr==192.168.60.91&&tcp.port==5555:

ip.addr==172.16.177.127&&ip.addr==192.168.60.91&&tcp.port==5555

终端B抓的包中TCP与NAT防火墙进行交互时都建立连接失败了!

结论:由于BFCP建立连接机制,终端A发起双流最为客户端向终端B发起请求,由终端A主动发起BFCP双流能力交换,而此时却被防火墙给阻止了(原因是终端B找不到终端A)。

解决方法:在NAT上添加TCP5555端口映射到终端A上。

问题2:过NAT环境且NAT上添加TCP5555端口映射,终端A(内网)和终端B(外网)都开启BFCP,建立点对点会议,且开启音频视频的防火墙端口映射;终端A(内网)终端发起双流成功后,挂断会议,重新开启会议发送双流,发送超时。

经排除发现是由于端口释放问题导致:

端口

但由于端口释放需要一定时间所以我们解决问题的思路如下:

让BFCP做如下策略:

1、只要发现端口被占用,终端侧监听端口往上加一,如5555端口被占有,则开启5556;

2、每次检测端口是否被占有从5555开始往上叠加;

3、NAT处开启10个TCP端口映射(5555~5564)来保证发起双流成功;

BFCP在SIP双流中的应用相关推荐

  1. SIP交换中的SDP及RTP的工作过程

      下面是一个典型的SIP会话 要传送媒体首先要建立一个媒体会话(Session).建立媒体会话实际上就是通过SDP offer/answer交换进行就会话的媒体参数进行协商的一个过程.但在SIP中没 ...

  2. 【SIP基础】SIP协议中网络角色定义

    SIP协议定义了一些实体,来帮助创建SIP网络.在SIP网络内每个网络元件被标识SIP URI(统一资源标识符),它是像一个地址或标识.下面是网络元素: 用户代理 代理服务器 注册服务器 重定向服务器 ...

  3. SIP认证中Qop的字段使用注意

    在sip协议中,摘要认证中,如果对方返回的401消息体中的Qop字段没有,则本方计算response时,输入参数的Qop应为空值,再次发送鉴权消息时也不要带有Qop字段,否则注册失败

  4. 在SIP对讲机中RTP/RTCP的实现

    RTP/RTCP的定义及用途,还是请大家自己google.对于wifi手机来说呢,RTP协议用来传送编码后的语音,RTCP协议用来传送控制信息,公司的RTCP附带了一些语音统计信息和jitter bu ...

  5. sip 协议中:from to 的理解

     from是电话发起方,to是电话接收方,而不是说,from是消息发起方,to是消息接收方!所以不管是发出的消息还是接收到的消息,from和to的内容都是一样的

  6. java sip 携带sdp_SIP中的SDP offer/answer交换初探

    1.早期媒体 无论是在PSTN还是在VoIP网络中,一个呼叫的最终目的让两个用户进行交谈(conversation).这里我们将由用户之间的交谈所产生的媒体称为常规媒体("regular m ...

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

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

  8. SIP 中的Dialog,call,session 和 transaction .

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

  9. RFC3261 SIP: Session Initiation Protocol 中文版 翻译中

    SIP: Session Initiation Protocol SIP(会话发起协议) Abstract摘要 This document describes Session Initiation P ...

最新文章

  1. maven(3)------maven构建web项目详细步骤
  2. 前端开发VScode常用插件
  3. boost::sort模块使用最坏情况进行常规 MSD 基数排序的排序示例
  4. [转]鼠标移到图像上显示激活的例子
  5. java合并后求和_用分支/合并框架执行并行求和
  6. XStream使用总结
  7. 21天学通JAVA:类设计的技巧
  8. 【肌电信号】基于matlab带通滤波肌电信号处理【含Matlab源码 965期】
  9. 从eoeandroid换到CSDN-[回顾]
  10. 将keras的模型封装成可转换为tensorlow的.pb格式,并生成.pbtxt文件
  11. RGL: A Simple yet Effective Relation.. 文章详解
  12. 云服务器发现安全漏洞怎么解决?
  13. 心如赤子,不贪不骄不纵
  14. 2016.3.24 OneZero站立会议
  15. Redis技术架构演进
  16. 小学生5年级计算机书,小学五年级作文:眼镜、电脑、书
  17. B数和B+树、红黑树数据结构的特点
  18. APT之木马静态免杀
  19. 【目标规划】暑假计划
  20. 计算机应用基础高等数学试题,大专高等数学期末试卷(A卷)带答案.doc

热门文章

  1. Excel VBA 移动文件和文件夹
  2. matlab 0阶贝塞尔函数,零阶贝塞尔函数 分享助,第一类零阶贝塞尔
  3. 献给我所有结婚或即将结婚的亲人朋友们
  4. 网赚项目:表情包项目之流量变现的几种模式
  5. [微小说]根际大战——守护圣树
  6. Vue 项目运行失败 Module build failed: Error: Missing binding
  7. 【经验交流】最新棋牌游戏开发小组
  8. FME对CAD中组的处理
  9. Ableton Live 10 Suite for mac(音乐制作软件)支持15系统
  10. 揭秘LOL背后的IT基础架构丨微服务生态系统