一种提高BFCP性能的方法与流程

文档序号:15357731发布日期:2018-09-05 00:12阅读:778来源:国知局

本发明涉及多媒体网络通信技术领域,具体涉及一种提高bfcp性能的方法。



背景技术:

随着网络通信技术和多媒体等技术的高速发展,基ip网络的视频会议系统提供了低成本高体验的多功能通讯方式,得到了大力的普及和越来越多领域的应用。目前由ietf组织提出的bfcp协议(binaryfloorcontrolprotocol,即二进制发言权控制协议)以其简单高效的特点成为主流的发言权控制协议。

然而目前该草案并没有得到足够的研究和实践检验。鉴于现有的视频会议系统部署在多种平台上,因此实现跨平台高效的bfcp服务器及客户端并应用到实际项目中,能够对草案起到实践检验的作用,并可能进一步促进现有的视频会议系统对bfcp新草案的支持。

虽然muduo网络提供了线程安全和异步多线程日志等功能,然而该库只支持linux平台、ipv4和tcp协议,并不能满足本发明对bfcp通信库的跨平台等需求。因此本发明通过结合其他跨平台的通信库来实现跨平台支持模块。



技术实现要素:

本发明的目的在于克服现有技术存在的问题,以libuv网络库结合boostc++库和zlib函式库为基础实现bfcp跨平台支持模块,提供一种提高bfcp性能的方法。

为实现上述技术目的,达到上述技术效果,本发明通过以下技术方案实现:

一种提高bfcp性能的方法,包括基础支持模块、日志模块、tcp通信模块、事件循环模块、udp通信模块和bfcp公共模块,其中,

所述事件循环模块的事件循环队列包括i/o处理、执行用户任务、管理定时器和轮询,接口的每个线程只包括有一个事件循环队列,所述事件循环模块适配于libuv网络库,用户通过回调处理函数可跨线程将需要执行的任务回调提交到事件循环队列中的用户任务回调队列,事件循环模块将在下一个循环中执行事件循环队列中所有的用户任务回调;

所述udp通信模块包括udpserver端、udpclient端和udpsocket端,所述udpsocket端封装有libuv网络库中的相应线程句柄及相应接口,并且udpsocket端包含有发送和接收的缓存,所述udpserver端和udpclient端用于提供控制和通知接口;

所述bfcp公共模块用于用户任务回调处理,所述bfcp公共模块包括bfcp编码模块、bfcp解码模块、bfcp消息模块和bfcp事务管理器,所述bfcp编码模块和bfcp解码模块分别用于对接收到的数据进行编码和解码,所述bfcp消息模块用于提供对bfcp消息参数、bfcp消息和bfcp属性的封装,并且所述bfcp消息还包含发送方的ip地址、端口信息和接收时间戳,所述bfcp事务管理器用于对bfcp消息的发送和接收进行处理。

进一步的,所述事件循环模块适配于libuv网络库的线程uv_loop_t,使事件循环队列具备线程安全并支持用户任务回调队列,所述事件循环模块通过libuv网络库的线程uv_async_t来通知线程uv_loop_t有新提交的用户任务回调,并在线程uv_async_t中注册有执行用户任务回调队列的用户任务回调。

进一步的,所述用户任务回调的回调处理函数包括相结合functor仿函数和boost::bind函数,用于适配不同的函数调用,减少虚函数的使用。

进一步的,所述udp通信模块中的udpsocket端采用地址过滤的方式提供connect模式。

进一步的,所述bfcp事务管理器对bfcp消息的发送处理流程包括以下步骤:

步骤1.1)bfcp消息模块将bfcp消息参数和回调处理函数提交到bfcp事务管理器;

步骤1.2)bfcp事务管理器根据bfcp消息参数进行bfcp编码构造bfcp消息,若编码后的bfcp消息大小超过所指定的限制时,则将对该bfcp消息进行分片;

步骤1.3)分配bfcp事务管理器的bfcp事务id并发送包括所有分片的bfcp消息,若该bfcp消息是bfcp请求消息则将其缓存到一个bfcp请求消息缓存中,并启动一重传定时器t1,否则,将其缓存到一个bfcp响应消息缓存中,并启动一重传定时器t2;

步骤1.4)当重传定时器t1超时并且未达到最大的超时次数时,发送相应的bfcp请求消息,并将重传定时器t1超时时间加倍,若重传定时器t1达到最大的超时次数,则从bfcp请求消息缓存中删除该bfcp请求消息,并执行bfcp消息模块所传入的回调执行函数,报告超时错误;

步骤1.5)当重传定时器t2超时,则从bfcp响应消息缓存中删除对应bfcp响应消息。

进一步的,所述bfcp事务管理器对bfcp消息的接收处理流程包括以下步骤:

步骤2.1)当bfcp事务管理器接收到bfcp消息时,对其进行bfcp报头解码,并判断该bfcp消息是否为bfcp消息分片,若是完整的bfcp消息,则执行步骤2.3),否则,在一bfcp分片缓存中查询该bfcp消息的其他分片是否都已接收,若尚未接收完毕,则将该bfcp消息分片缓存到bfcp分片缓存中,另外,当该bfcp消息分片为该bfcp消息第一个到达的分片时,启动一缓存定时器t3,若所有bfcp消息分片都已接收到,则将bfcp消息分片重组为完整的bfcp消息并停止缓存定时器t3;

步骤2.2)当缓存定时器t3超时,则从bfcp分片缓存中删除对应的所有bfcp消息分片;

步骤2.3)检查该bfcp消息的有效性,包括bfcp消息是否解析正确和bfcp消息的版本号是否有效,对于版本号无效或解析失败的情况,根据bfcp草案中规定发送错误报告或进行忽略;

步骤2.4)若该bfcp消息为bfcp请求消息,则在bfcp响应消息缓存中查找是否已经存在bfcp响应消息,若有则直接回复该bfcp响应消息,并结束处理;

步骤2.5)若该bfcp消息为bfcp响应消息,则在bfcp请求消息缓存中查找所对应的bfcp请求消息,若有,则通知bfcp消息模块,并从bfcp请求消息缓存中删除bfcp请求消息和停止对应的重传定时器t1,否则,忽略该bfcp响应消息,并结束处理;

步骤2.6)通知bfcp消息模块对新的bfcp请求消息进行处理。

进一步的,所述bfcp事务管理器将由本方发起的bfcp请求消息和远程的bfcp响应消息定义为客户端事务,将远程bfcp请求消息与本方的bfcp响应消息定义为服务器事务。

进一步的,所述bfcp事务管理器对于客户端事务管理方法为:当有新的bfcp消息发送请求时,bfcp事务管理器创建新的客户端事务,其中每个客户端事务包含了该客户端事务的标识和编码后的bfcp消息,并记录该客户端事务的回调处理函数,客户端事务的标识由会议id、用户id和事务id组成,客户端事务的重传定时器t1超时时间不相同,每个客户端事务各自维护其自身的重传定时器t1,客户端事务在超时的时候,通知bfcp事务管理器进行释放,bfcp事务管理器在接收到bfcp响应消息时也释放对应的客户端事务,并将客户端事务结果作为参数调用回调处理函数。

进一步的,所述bfcp事务管理器对于服务器事务管理方法为:每个服务器事务除了需要记录服务器事务标识和编码后的bfcp消息外,还需要记录服务器事务所响应的请求原语,增加对重复请求的识别度,减少因服务器事务id复用而产生的冲突。

进一步的,对于服务器事务的超时释放采用定时轮算法来管理:采用定长的循环队列,每个元素为一个槽,这个槽用于存放需要定时处理的服务器事务,其中tail指针以固定的时间间隔转动,在tail指针指向下一个槽时对应槽中的服务器事务将被释放,而新创建的服务器事务将添加到当前tail指针所指向的槽中,以减少重传定时器t2的数量。

本发明的有益效果是:

1.本发明采用事件驱动和用户任务回调队列的方式,实现线程安全和异步调用的特性。

2.本发明使用简单定时轮算法减少重传定时器的使用数量,并采用全局会议任务队列和线程池的方式来实现多个会议发言权控制的并发处理,兼顾公平性和实时性。

附图说明

图1为本发明的事件循环示意图;

图2为本发明的bfcp公共模块的框架示意图;

图3为本发明的bfcp事务管理器的发送处理流程示意图;

图4为本发明的bfcp事务管理器的接收处理流程示意图;

图5为本发明的bfcp事务管理器对于客户端事务管理示意图;

图6为本发明的bfcp事务管理器对于服务器事务管理示意图。

具体实施方式

下面将参考附图并结合实施例,来详细说明本发明。

一种提高bfcp性能的方法,包括基础支持模块、日志模块、tcp通信模块、事件循环模块、udp通信模块和bfcp公共模块,在本实施例中,由于基础支持模块、日志模块以及tcp通信模块实现细节简单,采用本领域常规方式即可,故省去介绍,其中,

如图1所示,所述事件循环模块的事件循环队列包括i/o处理、执行用户任务、管理定时器和轮询,为了确保模块接口的线程安全,接口的每个线程只包括有一个事件循环队列,所述事件循环模块适配于libuv网络库,用户通过回调处理函数可跨线程将需要执行的任务回调提交到事件循环队列中的用户任务回调队列,事件循环模块将在下一个循环中执行事件循环队列中所有的用户任务回调;

所述udp通信模块包括udpserver端、udpclient端和udpsocket端,所述udpsocket端封装有libuv网络库中的相应线程句柄及相应接口,并且udpsocket端包含有发送和接收的缓存,所述udpserver端和udpclient端用于提供控制和通知接口,在本实施例中,udpserver端和udpclient端则以udpsocket端为基础,分别提供用于服务器事务和客户端事务的控制和通知的接口;

如图2所示,所述bfcp公共模块用于用户任务回调处理,所述bfcp公共模块包括bfcp编码模块、bfcp解码模块、bfcp消息模块和bfcp事务管理器,所述bfcp编码模块和bfcp解码模块分别用于对接收到的数据进行编码和解码,所述bfcp消息模块用于提供对bfcp消息参数、bfcp消息和bfcp属性的封装,并且所述bfcp消息还包含发送方的ip地址、端口信息和接收时间戳,所述bfcp事务管理器用于对bfcp消息的发送和接收进行处理。

所述事件循环模块适配于libuv网络库的线程uv_loop_t,使事件循环队列具备线程安全并支持用户任务回调队列,所述事件循环模块通过libuv网络库的线程uv_async_t来通知线程uv_loop_t有新提交的用户任务回调,并在线程uv_async_t中注册有执行用户任务回调队列的用户任务回调。

libuv网络库中的eventloop类是事件循环的实现类,该类提供的主要接口有:

(1)loop:实现了eventloop的主循环;

(2)runinloop:使用户任务回调在eventloop线程中执行;

(3)queueinloop:在用户任务回调队列末尾添加用户任务;

(4)pollreturntime:提供轮询返回时间,可用于标记网络数据到达的时间;

(5)runat、runafter和runevery:用于创建定时器,其参数包括时间和回调函数

所述用户任务回调的回调处理函数包括相结合functor仿函数和boost::bind函数,functor仿函数是类似于函数能够被调用的类对象,boost::bind函数或std::bind函数提供了将参数绑定到函数的技术生成boost::functio类型对象,用于适配不同的函数调用,减少虚函数的使用。

所述udp通信模块中的udpsocket端采用地址过滤的方式提供connect模式。

如图3所示,所述bfcp事务管理器对bfcp消息的发送处理流程包括以下步骤:

步骤1.1)bfcp消息模块将bfcp消息参数和回调处理函数提交到bfcp事务管理器;

步骤1.2)bfcp事务管理器根据bfcp消息参数进行bfcp编码构造bfcp消息,若编码后的bfcp消息大小超过所指定的限制时(比如路径mtu大小),则将对该bfcp消息进行分片;

步骤1.3)分配bfcp事务管理器的bfcp事务id并发送包括所有分片的bfcp消息,若该bfcp消息是bfcp请求消息则将其缓存到一个bfcp请求消息缓存中,并启动一重传定时器t1,否则,将其缓存到一个bfcp响应消息缓存中,并启动一重传定时器t2;

步骤1.4)当重传定时器t1超时并且未达到最大的超时次数时,发送相应的bfcp请求消息,并将重传定时器t1超时时间加倍,若重传定时器t1达到最大的超时次数,则从bfcp请求消息缓存中删除该bfcp请求消息,并执行bfcp消息模块所传入的回调执行函数,报告超时错误;

步骤1.5)当重传定时器t2超时,则从bfcp响应消息缓存中删除对应bfcp响应消息。

如图4所示,所述bfcp事务管理器对bfcp消息的接收处理流程包括以下步骤:

步骤2.1)当bfcp事务管理器接收到bfcp消息时,对其进行bfcp报头解码,并判断该bfcp消息是否为bfcp消息分片,若是完整的bfcp消息,则执行步骤2.3),否则,在一bfcp分片缓存中查询该bfcp消息的其他分片是否都已接收,若尚未接收完毕,则将该bfcp消息分片缓存到bfcp分片缓存中,另外,当该bfcp消息分片为该bfcp消息第一个到达的分片时,启动一缓存定时器t3(该缓存定时器t3与重传定时器t2工作方式相同),若所有bfcp消息分片都已接收到(可根据各bfcp消息分片偏移和bfcp消息分片长度,以及整个bfcp消息长度来判断),则将bfcp消息分片重组为完整的bfcp消息并停止缓存定时器t3;

步骤2.2)当缓存定时器t3超时,则从bfcp分片缓存中删除对应的所有bfcp消息分片;

步骤2.3)检查该bfcp消息的有效性,包括bfcp消息是否解析正确和bfcp消息的版本号是否有效,对于版本号无效或解析失败的情况,根据bfcp草案中规定发送错误报告或进行忽略;

步骤2.4)若该bfcp消息为bfcp请求消息,则在bfcp响应消息缓存中查找是否已经存在bfcp响应消息,若有则直接回复该bfcp响应消息,并结束处理;

步骤2.5)若该bfcp消息为bfcp响应消息,则在bfcp请求消息缓存中查找所对应的bfcp请求消息,若有,则通知bfcp消息模块,并从bfcp请求消息缓存中删除bfcp请求消息和停止对应的重传定时器t1,否则,忽略该bfcp响应消息,并结束处理;

步骤2.6)通知bfcp消息模块对新的bfcp请求消息进行处理。

所述bfcp事务管理器将由本方发起的bfcp请求消息和远程的bfcp响应消息定义为客户端事务,将远程bfcp请求消息与本方的bfcp响应消息定义为服务器事务。

如图5所示,所述bfcp事务管理器对于客户端事务管理方法为:当有新的bfcp消息发送请求时,bfcp事务管理器创建新的客户端事务,其中每个客户端事务包含了该客户端事务的标识和编码后的bfcp消息,并记录该客户端事务的回调处理函数,客户端事务的标识由会议id、用户id和事务id组成,客户端事务的重传定时器t1超时时间不相同,每个客户端事务各自维护其自身的重传定时器t1,客户端事务在超时的时候,通知bfcp事务管理器进行释放,bfcp事务管理器在接收到bfcp响应消息时也释放对应的客户端事务,并将客户端事务结果(返回的响应消息或超时错误)作为参数调用回调处理函数。

如图6所示,所述bfcp事务管理器对于服务器事务管理方法为:每个服务器事务除了需要记录服务器事务标识和编码后的bfcp消息外,还需要记录服务器事务所响应的请求原语,增加对重复请求的识别度,减少因服务器事务id复用而产生的冲突。

对于服务器事务的超时释放采用定时轮算法来管理:采用定长的循环队列,每个元素为一个槽,这个槽用于存放需要定时处理的服务器事务,其中tail指针以固定的时间间隔转动,在tail指针指向下一个槽时对应槽中的服务器事务将被释放,而新创建的服务器事务将添加到当前tail指针所指向的槽中,以减少重传定时器t2的数量。

虽然本实施例中定时轮算法将重传定时器t2的数量减少到1个,然而该算法要求这些定时器的超时时间一样,这牺牲了一定的灵活性,另外,该算法还带来1个时间间隔的误差,具体到应用中,可以混合使用这两种方式。

以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1