复用TCP连接提升流媒体服务器之间流量转发效率
由于媒体推流客户端所在地域不同、所接入网络运营商不同、就近接入原则等因素,导致不同的视频推流客户端会推流至不同的流媒体服务器(本文主要针对目前WEB或手机的基于TCP的流媒体服务器),在某流媒体服务器收到媒体拉流客户端的拉流请求时,其本身可能由于不存在该流,导致该流媒体先通过流调度服务器定位到该请求流,然后向有该流的流媒体服务器发出拉流请求,在收到流数据后该流媒体服务器向媒体拉流客户端转发该媒体流,再给合流媒体的分级结构等其它因素,这种基于即时建立TCP的连接的媒体流在大量推流与拉流用户时往往会有很多路媒体流在不同的流媒体服务器之间传输,这样会存在如下缺点:
1 由于每路媒体流就一个TCP连接,而TCP连接的建立需要一定开销且会带来一定时延,在大量媒体流在流媒体服务器之间互相转发时,这个叠加开销会更大了
2 基于TCP连接只传输一路媒体流,不利于按消息的不同保证优先传送 3 在基于分块协议流传输时,音频小包(一个音频帧一个块基于是够了)的封装块与视频帧(特别是1KB至3KB大小的P、B帧)的太多尾块,都达不到MTU的大小,加之考虑到实时性,往往会关闭Nagle算法,这样导致网络传输效率低下、服务器软中断升高。
为克服上述问题,可以这样做: 流媒体服务器启动后通过流调度管理服务器拿到其它所有同级或其上级流媒体的相关网络地扯信息,然后预先建立5个TCP连接,这样互相发起建立连接后,每两台流媒体服务器之间预先建立10个连接(5个主动、5个被动),每个连接可以传输100路左右的媒体流,这样流媒体服务器集群内部的流媒体服务器之间像高速公路一样一个内部静态网络连接结构已经预先建立起来,随时静待汽车经过,同时启动一个单独的低优先级线程监控当前连接数与每个连接承载的媒体流数,若有断开连接或不能满足目前的媒体流数且低于一定阀值,由该线程负责在后台默默建立TCP连接(单TCP连接具体承载的媒体流数在TCP正在建立等特别时机允许超过100,只要不达到最大设定的阀值即可)。 在有媒体流拉流客户端向某流媒体服务器发起播放请求后,该流媒体通过流调度管理服务器拿到所请求媒体流所在的目标流媒体地扯信息后,通过预先建立的TCP连接中的一个TCP连接直接向该目标流媒体服务器发送播放流请求,目标流媒体服务器通过基于块协议的多路复用、合包技术将该媒体流与其它早期选定的媒体流合包后一起发送给该流媒体服务器,该流媒体解包解复用后再转后给相应的媒体流拉流客户端。从媒体流转发端或源端所在的流媒体服务器角度来看,转发过程是这样的:由于是基于单个TCP连接传送多路媒体流,这样相较于传统以输入流连接驱动模式变成了以输出流连接驱动模式了,媒体流处理线程扫描所有的输出流连接,针对其中某个连接查看所有由该连接传送的输入媒体流,首先看是否有控制指令要传输,若有放入发送缓冲区,若无,接着查看是否有音频帧要传送,若有放入发送缓冲区,最后再查看是否有视频帧要传输,若有放入发送缓冲区,且前述几步每当发送缓冲区有新数据时都判断一下是否达到了MTU上限,若达不到继续,若达到立即发送,然后判断下一个输出流连接的处理方式同前面一个一样,如此循环,这样就做到了控制指令消息的传送优先级大于音频传送优先级了,而音频传送优先级又高于视频传送优先级。
预期收益:有效提升流媒体服务器之间传输效率、流量降低10%(主要是头部数据)、提高实时性、保证重要数据优先处理
复用TCP连接提升流媒体服务器之间流量转发效率的更多相关文章
- 原来:HTTP可以复用TCP连接
问题 线上的一个项目会和微信服务器有API请求(目的是获取用户的微信信息),但会有偶发的报错: 'Connection aborted.', ConnectionResetError(104, 'Co ...
- 开源流媒体服务器EasyDarwin支持epoll网络模型,大大提升流媒体服务器网络并发性能
经过春节前后将近2个月的开发和稳定调试.测试,EasyDarwin开源流媒体服务器终于成功将底层select网络模型修改优化成epoll网络模型,将EasyDarwin流媒体服务器在网络处理的效率上提 ...
- EasyDarwin开源流媒体服务器进行RTSP转发过程中将sdp由文件存储改成内存索引
-本篇由团队成员Fantasy供稿! 原始版本 在Darwin Streaming Server版本中,推送端DoAnnounce的时候后服务器会根据easydarwin.xml中配置的movies_ ...
- HTTP的RST包与WinHttp延迟关闭TCP连接
一.RST包也常见于断开TCP连接 几个月前用wireshark抓HTTP包发现有的网络通信在结束的时候没有使用四次握手,而是直接使用RST包.如: 在TCP协议中RST表示复位,用来异常的关闭连接 ...
- 详解TCP连接的“三次握手”与“四次挥手”(上)
一.TCP connection 客户端与服务器之间数据的发送和返回的过程当中需要创建一个叫TCP connection的东西: 由于TCP不存在连接的概念,只存在请求和响应,请求和响应都是数据包,它 ...
- TCP/IP协议--TCP协议概括和TCP连接的建立和终止
TCP提供一种面向连接的.可靠的字节流服务.面向连接指,发送和接收方在交换数据前必须建立一个TCP连接.顺便说下,一个TCP连接只有两方,因此广播和多播是不能应用于TCP的.字节流指,两个应用程序通过 ...
- Java网络编程系列之TCP连接状态
1.TCP连接状态 LISTEN:Server端打开一个socket进行监听,状态置为LISTEN SYN_SENT:Client端发送SYN请求给Server端,状态由CLOSED变为SYN_SEN ...
- TCP连接复用
转自网络:看到一陌生名词,记录一下 TCP连接复用技术通过将前端多个客户的HTTP请求复用到后端与服务器建立的一个TCP连接上.这种技术能够大大减小服务器的性能负载,减少与服务器之间新建TCP连接所带 ...
- 服务器tcp连接timewait过多优化及详细分析
[背景说明] 在7层负载均衡上,查询网络状态发现timewait太多,于是开始准备优化事宜 整体的拓扑结构,前面是lvs做dr模式的4层负载均衡,后端使用(nginx.or haproxy)做7层负载 ...
随机推荐
- AC自动机(AC automation)
字典树+KMP 参考自: http://www.cppblog.com/mythit/archive/2009/04/21/80633.html ; //字典大小 //定义结点 struct node ...
- MultipartResolver 文件上传
SpringMVC 中文件上传 MultipartResolver 博客分类: SpringMVC - 基础篇 基于前面文章的基础上. 一.准备 需要的jar 二.配置 1. spmvc-se ...
- mysql 的事务
$conn = mysql_connect('localhost','root','root') or die ("数据连接错误!!!");mysql_select_db('tes ...
- 接口速度慢问题查找(TTFB时间长)
前些天自己写了一个网站,但是发现接口的速度按超级慢,业务逻辑并不复杂,原因究竟在哪呢? 首先说一下,我的数据库和项目均在同一台服务器上,按道理来说,接口访问本地的数据库应该会很快才对. 后来我发现线上 ...
- redis写shell与ssh免密码登陆
redis-cli参数:-h :指定要连接的主机IP或域名-p :指定连接的端口-a :指定密码-r :执行指定的命令-n :数据库名-x :将最后一个参数输出为value redis写shell- ...
- 搭建git代码服务器
在代码管理中,通常需要使用版本管理工具,git就是一个不错的选择,这里简单罗列一下git服务器的搭建过程. 1. 安装git工具包 2. 初始化git库:在代码服务器上,通常只需要创建一个不含有工作目 ...
- LeetCode 395. Longest Substring with At Least K Repeating Characters C#
Find the length of the longest substring T of a given string (consists of lowercase letters only) su ...
- win10 Qt 调试器未设置
安装win10后一直用vs调试,没有用qt调试,这次启动调试,发现提示调试器未设置. 解决办法: 需要重新安装wdk 10 https://developer.microsoft.com/zh-cn/ ...
- Learning from the CakePHP source code - Part I
最近开始痛定思痛,研究cakephp的源码. 成长的路上从来没有捷径,没有小聪明. 只有傻傻的努力,你才能听到到成长的声音. 下面这篇文章虽然过时了,但是还是可以看到作者的精神,仿佛与作者隔着时空的交 ...
- 小谈数据库Char、VarChar、NVarChar差异
1. char 固定长度,最长n个字符. 2. varchar 最大长度为n的可变字符串. (n为某一整数,不同数据库,最大长度n不同) char和varchar区别: ...