由于媒体推流客户端所在地域不同、所接入网络运营商不同、就近接入原则等因素,导致不同的视频推流客户端会推流至不同的流媒体服务器(本文主要针对目前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层负载 ...
随机推荐
-
Laravel 学习笔记 —— 神奇的服务容器 [转]
容器,字面上理解就是装东西的东西.常见的变量.对象属性等都可以算是容器.一个容器能够装什么,全部取决于你对该容器的定义.当然,有这样一种容器,它存放的不是文本.数值,而是对象.对象的描述(类.接口)或 ...
-
如何利用OCS缓存TomcatSession全局变量(转)
转: 首先非常感谢阿里云给我们提供了一个如此省事的平台. 我们公司是一家物流公司,主要提供运输和仓储的服务.我们现在正在把我们的系统往阿里云迁移.当然,还在迁移过程中,所以还有很多是没办法现在说得太清 ...
-
关于Web Api的HelpPage文档注释问题
之前使用Microsoft.AspNet.WebApi.HelpPage的时候,一直为返回对象的注释发愁,以为这是个BUG. 这个注释的解决办法其实要从其原理理解就明白了. 因为HelpPage是读取 ...
-
《深入理解Java虚拟机》学习笔记之类加载
之前在学习ASM时做了一篇笔记<Java字节码操纵框架ASM小试>,笔记里对类文件结构做了简介,这里我们来回顾一下. Class类文件结构 在Java发展之初设计者们发布规范文档时就刻意把 ...
-
Spring Boot Dubbo applications.properties 配置清单
摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 与其纠结,不如行动学习.Innovate ,And out execute ! 』 本文 ...
-
Swiper4.x使用方法
1.首先加载插件,需要用到的文件有swiper.min.js和swiper.min.css文件.可下载Swiper文件或使用CDN. <!DOCTYPE html> <html> ...
-
python之__call__()
__call__ 在Python中,函数其实是一个对象: >>> f = abs >>> f.__name__ 'abs' >>> f(-123) ...
-
selenium3.0 远程模式
准备工作: 1. 安装chrome浏览器 2. 下载selnium-server-standalone-3.0.1.jar 步骤: 1. java -jar selnium-server-standa ...
-
nw.js node-webkit系列(18)怎么对.js进行编译以防你的代码暴露出来
原文链接:http://blog.csdn.net/zeping891103/article/details/50819102 参考:https://segmentfault.com/a/119000 ...
-
PHP SQL查询结果在页面上是乱码
今天系统网页出现这样一个问题:下图左边类型栏数据是没显示出来 打印SQL查询的数据是有的 原因是:————> eval函数里'return '这一字符串一定要有空格哈,没有空格,这语句就是错的. ...