现有市场上的主流直播在传输方面,大部分使用TCP传输,也有部分使用UDP传输(类似上行使用rtc,然后在源站或者媒体服务器转换为rtmp协议再进行推流)。通常来说,udp效率更高一些,但由于自身无连接缺少确认机制,缺少丢包重传,所以通常开发者会增加冗余来对抗网络的不稳定性,这也造成了流量费用的增加;TCP自身做了重传,确保可靠和顺序性,所以在对实时性要求并不高的直播,使用TCP是个很好的选择。

网易云信直播sdk目前使用了TCP进行传输,而且基于此从编码动态适配,发送队列调整,协议优化,socket等做了全流程的优化,确保我们在限带宽,丢包,时延,抖动,无论单项,还是复杂网络,都有不输于竞品的体验。

优化的细节指标

在不牺牲卡顿率的情况下,提升带宽利用率8成以上,码流更平稳。

优化的理论基础

为了防止网络的拥塞现象,TCP提出了一系列的拥塞控制机制。最初由V. Jacobson在1988年的论文中提出的TCP的拥塞控制由“慢启动(Slow start)”和“拥塞避免(Congestion avoidance)”组成,后来TCP Reno版本中又针对性的加入了“快速重传(Fast retransmit)”、“快速恢复(Fast Recovery)”算法,再后来在TCP NewReno中又对“快速恢复”算法进行了改进,近些年又出现了选择性应答( selective acknowledgement,SACK)算法,还有其他方面的大大小小的改进,包括google优化后的BBR算法(目前移动端无法使用),成为大家研究的一个热点。

快速重传:

快速重传算法要求首先接收方收到一个失序的报文段后就立刻发出重复确认,而不要等待自己发送数据时才进行捎带确认。接收方成功的接受了发送方发送来的M1、M2并且分别给发送了ACK,现在接收方没有收到M3,而接收到了M4,显然接收方不能确认M4,因为M4是失序的报文段。如果根据可靠性传输原理接收方什么都不做,但是按照快速重传算法,在收到M4、M5等报文段的时候,不断重复的向发送方发送M2的ACK,如果接收方一连收到三个重复的ACK,那么发送方不必等待重传计时器到期,由于发送方尽早重传未被确认的报文段。

快速恢复:

当发送发连续接收到三个确认时,就执行乘法减小算法,把慢启动开始门限(ssthresh)减半,但是接下来并不执行慢开始算法。

此时不执行慢启动算法,而是把cwnd设置为ssthresh的一半, 然后执行拥塞避免算法,使拥塞窗口缓慢增大。

TCP的拥塞控制主要原理依赖于一个拥塞窗口(cwnd)来控制,TCP还有一个对端用的接收窗口(rwnd)用于流量控制。窗口值的大小就代表能够发送出去的但还没有收到ACK的最大数据报文段,显然窗口越大那么数据发送的速度也就越快,但是也有越可能使得网络出现拥塞,如果窗口值为1,那么就简化为一个停等协议,每发送一个数据,都要等到对方的确认才能发送第二个数据包,显然数据传输效率低下。TCP的拥塞控制算法就是要在这两者之间权衡,选取最好的cwnd值,从而使得网络吞吐量最大化且不产生拥塞。

由于需要考虑拥塞控制和流量控制两个方面的内容,因此TCP的真正的发送窗口=min(rwnd, cwnd)。但是rwnd是由对端确定的,网络环境对其没有影响,所以在考虑拥塞的时候我们一般不考虑rwnd的值,我们暂时只讨论如何确定cwnd值的大小。关于cwnd的单位,在TCP中是以字节来做单位的,我们假设TCP每次传输都是按照MSS大小来发送数据的,因此你可以认为cwnd按照数据包个数来做单位也可以理解,所以有时我们说cwnd增加1也就是相当于字节数增加1个MSS大小。

优化的具体内容

TCP的慢启动,拥塞避免,快速重传机制告诉我们,在应用层拥堵之前,会快速降低拥塞窗口大小,导致tcp通道可发送带宽会快速降低,这个时候如果不快速降低数据流量, 会大量丢包重传, 应用层会进入拥堵状态,导致恶化。

我们通过观测若干系统反馈的socket 健康指标,一旦发现该socket进入快速重传,我们会提前降低视频的编码参数;同时如果周期一直健康状况良好,我们测算的可发送带宽也大于实际发送大小,我们会缓慢提升视频的编码参数;整个调优会基于快降慢升,音频优先的原则来实施。

【推荐阅读】Android短视频中如何实现720P磨皮美颜录制

网易云信直播sdk的整体传输优化相关推荐

  1. 网易云信直播聊天室:无上限人数系统不卡顿,是不是鱼与熊掌不能兼得?

    1.直播聊天室的形式和应用场景 在一般人的理解中,直播聊天室应该就是直播画面旁边配一个聊天窗口,众多观看者在 里面发表自己的评论(如图1).Oh, NO!这样的场景是不是太Low啦!随着互联网技术和消 ...

  2. 网易纯直播SDK使用 视频回调

    一 合成后视频回调 1 视频回调 Nlss_SetVideoSamplerCB,接受合成后的预览的每帧图像rgb32 buffer. void LsSession::SetVideoSamplerCB ...

  3. 网易纯直播 SDK 基本操作

    1 获取可用的音视频设备列表 Nlss_GetFreeDevicesNum获取当前摄像头/麦克风的个数. NLSS_RET Nlss_GetFreeDevicesNum(NLSS_OUT int *i ...

  4. 网易云信即时通讯推送保障及网络优化详解(三):如何在弱网环境下优化大数据传输

    对于移动 APP 来说,IM 功能正变得越来越重要,它能够创建起人与人之间的连接.社交类产品中,用户与用户之间的沟通可以产生出更好的用户粘性. 在复杂的 Android 生态环境下,多种因素都会造成消 ...

  5. 网易云信深度优化解决移动聊天室“痼疾”

    本文源于云信移动技术专家项望烽在开源中国源创会2016年终盛典的题为<聊天室场景下的移动网络优化>分享. (网易云信移动端技术 项望烽) 突破传统群组思维和架构,实现无人数上限的聊天室 步 ...

  6. 网易云信为你的互联网应用快速接入直播功能

    近年来,随着网络带宽的不断提升和智能硬件设备的高速发展,移动端视频应用如雨后春笋,包扩视频门户.视频社交.在线教育.娱乐直播.企业视频协作.新闻媒体.金融.监控以及医疗等各行业的互联网应用,均存在巨大 ...

  7. 网易云信 QUIC 应用优化实践

    导读:网易云信作为音视频服务提供商的领导者,一直致力于提供顶级的音视频通话服务体验,为用户在各种恶劣环境下提供可靠的音视频服务.如何在极端弱网条件下仍然能给用户提供可靠的音视频服务,是网易云信关注的重 ...

  8. 网易云信IM即时通讯聊天源码SDK 并发高轻松万人并发稳定不丢消息 后端PHP 前端 安卓Java

    优势:承载用户并发同时在线都在第三方网易云信高并发轻松承载万人并发. 开发语言:后端PHP 前端安卓Java 苹果 OC PC端C# 网易云信 IM UIKit是基于 NIM SDK(网易云信 IM ...

  9. 网易云信亮相 GIAC 全球互联网架构大会,解密新一代音视频架构在元宇宙场景的实践...

    7 月 22 日,2022 GIAC 全球互联网架构大会在深圳隆重召开.GIAC 是中国地区规模最大的技术会议之一,专门面向架构师.技术负责人及高端技术从业人员等人群. 作为互联网技术的年度盛会,大会 ...

最新文章

  1. 简单介绍python编程之文件读写
  2. 二叉树结点地址小错误
  3. 三层交换机实现不同vlan间的通信
  4. 在 MySQL 中查找含有目标字段的表
  5. 校宝在线携手神策数据 数据赋能产品服务体验双升级
  6. 我是这样写文字轮播的
  7. 转基因大豆提高大豆油脂产量80%
  8. java中treemap释放_在Java中从TreeMap删除键
  9. python刘卫国实验题_MATLAB 程序设计与应用(刘卫国版)习题答案3-4
  10. 【剑指offer】面试题56 - II:数组中数字出现的次数 II(Java)
  11. 小米首部5G手机正式发布 海外营收将很快超过国内
  12. 25岁该有多少存款?数据分析带你揭露打工人的工资真相
  13. 没了Macbook的英特尔还好吗?比你想象的好
  14. 解决:安装R包时,经常提示“package ‘readr’ is not available (for R version 3.5.1)”的问题
  15. 如何利用第三方数据进行大数据分析
  16. zktime 协议_zktime5.0考勤管理系统使用说明书(1.0版).pdf
  17. Moonstarter IDO 一步一步的操作
  18. 图片轮换-jQuery
  19. 腾飞计算机学校怎么样,合肥腾飞职业技术学校怎么样
  20. android陀螺仪方向,android – 如何使用罗盘读数和陀螺仪读数获取手机的方位角?...

热门文章

  1. js中对于字符串非空判断的总结
  2. BZOJ3738 : [Ontak2013]Kapitał
  3. 使用c#类库绘制柱状图
  4. [转载]Google用户体验设计准则
  5. DropDownList的常用属性和事件
  6. RRID和CAS是什么?
  7. 肿瘤动物模型中需要注意的伦理问题
  8. 转载:vscode快捷键
  9. 计算机网络实验四:利用UDP协议实现点对点聊天
  10. linux php环境搭建_PHP-小程序:(1)开发环境搭建