BFCP在SIP双流中的应用
作者: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文档《rfc4583.Session
Description Protocol (SDP) Format for
Binary Floor Control Protocol (BFCP)
Streams》中明确了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双流中的应用相关推荐
- SIP交换中的SDP及RTP的工作过程
下面是一个典型的SIP会话 要传送媒体首先要建立一个媒体会话(Session).建立媒体会话实际上就是通过SDP offer/answer交换进行就会话的媒体参数进行协商的一个过程.但在SIP中没 ...
- 【SIP基础】SIP协议中网络角色定义
SIP协议定义了一些实体,来帮助创建SIP网络.在SIP网络内每个网络元件被标识SIP URI(统一资源标识符),它是像一个地址或标识.下面是网络元素: 用户代理 代理服务器 注册服务器 重定向服务器 ...
- SIP认证中Qop的字段使用注意
在sip协议中,摘要认证中,如果对方返回的401消息体中的Qop字段没有,则本方计算response时,输入参数的Qop应为空值,再次发送鉴权消息时也不要带有Qop字段,否则注册失败
- 在SIP对讲机中RTP/RTCP的实现
RTP/RTCP的定义及用途,还是请大家自己google.对于wifi手机来说呢,RTP协议用来传送编码后的语音,RTCP协议用来传送控制信息,公司的RTCP附带了一些语音统计信息和jitter bu ...
- sip 协议中:from to 的理解
from是电话发起方,to是电话接收方,而不是说,from是消息发起方,to是消息接收方!所以不管是发出的消息还是接收到的消息,from和to的内容都是一样的
- java sip 携带sdp_SIP中的SDP offer/answer交换初探
1.早期媒体 无论是在PSTN还是在VoIP网络中,一个呼叫的最终目的让两个用户进行交谈(conversation).这里我们将由用户之间的交谈所产生的媒体称为常规媒体("regular m ...
- SIP中的SDP offer/answer交换初探
1.引言 SDP的offer/answer模型本身独立与于使用它的高层协议.SIP是使用offer/answer模型的应用之一.RFC 3264 [3] 定义了offer/answer模型,但没有规定 ...
- SIP 中的Dialog,call,session 和 transaction .
如果你对Sip协议中Call, Dialog, Transaction和Message之间的关系感觉到迷惑,那么,那么我可以告诉你,你并不孤单,因为大多数初学者对于这些名词之间的关系都会感到疑惑. M ...
- RFC3261 SIP: Session Initiation Protocol 中文版 翻译中
SIP: Session Initiation Protocol SIP(会话发起协议) Abstract摘要 This document describes Session Initiation P ...
最新文章
- maven(3)------maven构建web项目详细步骤
- 前端开发VScode常用插件
- boost::sort模块使用最坏情况进行常规 MSD 基数排序的排序示例
- [转]鼠标移到图像上显示激活的例子
- java合并后求和_用分支/合并框架执行并行求和
- XStream使用总结
- 21天学通JAVA:类设计的技巧
- 【肌电信号】基于matlab带通滤波肌电信号处理【含Matlab源码 965期】
- 从eoeandroid换到CSDN-[回顾]
- 将keras的模型封装成可转换为tensorlow的.pb格式,并生成.pbtxt文件
- RGL: A Simple yet Effective Relation.. 文章详解
- 云服务器发现安全漏洞怎么解决?
- 心如赤子,不贪不骄不纵
- 2016.3.24 OneZero站立会议
- Redis技术架构演进
- 小学生5年级计算机书,小学五年级作文:眼镜、电脑、书
- B数和B+树、红黑树数据结构的特点
- APT之木马静态免杀
- 【目标规划】暑假计划
- 计算机应用基础高等数学试题,大专高等数学期末试卷(A卷)带答案.doc
热门文章
- Excel VBA 移动文件和文件夹
- matlab 0阶贝塞尔函数,零阶贝塞尔函数 分享助,第一类零阶贝塞尔
- 献给我所有结婚或即将结婚的亲人朋友们
- 网赚项目:表情包项目之流量变现的几种模式
- [微小说]根际大战——守护圣树
- Vue 项目运行失败 Module build failed: Error: Missing binding
- 【经验交流】最新棋牌游戏开发小组
- FME对CAD中组的处理
- Ableton Live 10 Suite for mac(音乐制作软件)支持15系统
- 揭秘LOL背后的IT基础架构丨微服务生态系统