P2P--为直播而生

把自己对p2p的一些理解和看法整理下,一来是帮助自己回顾下,二来希望能为之后用到的同学起到一个指引的作用。

什么是P2P?

此处要跟大家介绍的P2P不是常听到的金融P2P,它是Peer-to-Peer的简写,即对等网络技术,但我更愿意称之为媒体数据分发技术,通过p2p可以传输音视频数据、文件、图片等对象 。p2p的最大特点就是去中心化,每个p2p节点既是客户端同时又扮演服务器的角色,资源的所有权和控制权被分散到p2p网络的每一个节点上。

P2P与传统CDN的区别?

CDN即内容分发网络,它是一种树状多层级网络结构,这种方式的优势是内容的传输更快捷、稳定,但客户端与服务器之间采用CS模式进行数据的交互,并发处理能力受限于CDN边缘节点规模及带宽上限。而p2p是基于网状拓扑结构的对等网络,不再单一从某一个服务器获取数据,p2p网内各节点均可为其他节点供流,充分挖掘了Internet上的空闲资源 ,这样可极大减轻服务器压力。

P2P的应用场景

其实p2p技术早就出现在我们经常使用的软件产品中了,比如早些年流行的下载软件比特精灵、电驴以及现在仍然如日中天的迅雷等,还要提供在线视频服务的pplive、PPStream和快播等,这些产品给人的一个共同感受就是在线人数越多下载速度或者缓冲速度就越快,下载或者播放就越流畅,这就是因为p2p网内节点多了可供获取数据的源头就多了,这样我需要的数据就能很快的得到。现在直播领域也用上了P2P来节省服务器带宽成本。

P2P的技术原理

不同P2P技术方案商他们的实现原理大致上是一样的,基本都包含了内容处理系统、资源调度及管理系统、节点管理系统以及数据处理系统(终端),不同的是具体的策略和算法。
P2P节点请求播放url后,服务器会根据该节点信息(地域、运营商等)为其分配最合适(就近、同一运营商原则)的超级节点,连上超级节点后直接拉取视频数据开始播放,同时超级节点会根据一定的策略将其加入到已有的分组中并通知该节点,该节点获取到分组信息后尝试与组内其他节点建立连接(穿透),连接成功了开始将其已经下载到的视频数据分享给其他节点同时也会收到来自其他节点的数据包,这样其本身从超级节点拉取的数据就会减少,节点间以及节点与服务器之间仍会周期性发送心跳包以保持长连接;当组内有节点退出时,服务器在指定时段内未接受心跳包会将该节点踢出分组,同时广播方式更新分组信息到该组其他成员,在此期间其他成员会接收不到本应由该节点分享的数据,在等待超时后他们会直接从超级节点请求那部分数据,新的分组信息更新到全员后,需分享的视频数据重新由当前组内成员承担。当节点拿到分片数据后会按照数据自带索引将它们拼装、还原成原始视频流交由播放器解码、上屏出画面。
每个节点负责从超级节点获取不同的码片,然后分享给组内其他节点,这样避免不同节点分享重复的数据,一旦其中某个节点掉队了导致其他节点无法及时得到由他负责的那部分数据,那么数据分发策略会保证其他节点马上改变路由转向去找超级节点要数据(每个超级节点拥有一份完整的数据)。
先通过下图对比CDN的数据流走向来看下P2P的数据分发模式:
CDN数据流走向图:  P2P数据分发模式: P2P的这种数据分发模式可减少客户端向服务器请求数据的次数,依靠节点间的互相分享最终仍能拿到一份完整的视频数据,从而保证其播放效果跟从访问CDN一样。
P2P数据流走向图:  

内容处理系统:

  • 1.负责接收原始流媒体数据,通过私有协议对其进行切片(P2P网络中传输的最小数据单位),打上索引号;
  • 2.对原始码流进行转码处理(按需求而定,非必选流程)
  • 3.推送分片数据到各p2p超级节点,供终端节点在需要时直接访问。

资源调度及管理系统:

  • 1.监听各p2p服务器(包括超级节点)的负载状况,如硬件资源占用、系统负荷、带宽消耗等;
  • 2.动态调整各p2p服务器上任务的执行,保证整个系统内部的负载均衡;

节点管理系统:

  • 1.收集节点信息,如地域、网络运营商、上下行速率、丢包率等;
  • 2.管理节点行为,如节点注册,节点分组,节点穿透,与节点保持长连接,探测节点心跳成功率,节点上下线等;
  • 3.节点间数据分享策略,如节点心跳减弱即可减少需要其分享的分片数据;

数据处理系统(终端):

  • 1.接收和缓存从其他节点(包括超级节点和普通节点)获取的分片数据,并按照索引值拼装成连续完整的码片序列;
  • 2.将已获取到的数据分享给组内其他节点。
  • 3.对拼装后的码片序列按照私有协议进行还原得到原始视频数据,本地可选择是否需要更换视频封装格式已提高解码兼容性;

直播场景特别是游戏、秀场等互动性强的场景下P2P效果的几个度量指标

  • 1.播放延迟
  • 2.播放出画面速度
  • 3.播放流畅度
  • 4.分享率
  • 5.服务器并发能力

保证P2P效果的几个关键点

  • 1.准确评估节点上行能力,动态调整其分享数据大小
  • 2.组内节点变化频繁时的处理策略(容错机制);
  • 3.对称型网络(NAT)的穿透;

展望:CDN+P2P

新一代融合CDN在传统CDN基础上加入了P2P,二者之间可以互补,P2P播放受阻或失败的时候可以自动切换CDN继续播放保证体验不受影响 ,CDN的边缘节点可以担任P2P超级节点的角色,而P2P的接入又可以减少对CDN的流量消耗。

结尾

如有理解上的误区恳请各位指正,也欢迎大家一起交流。


附: 移动端p2p测试指导

移动端p2p接入现状:

  1. Android:星云p2p、腾讯云p2p、网宿p2p
  2. iOS: 腾讯云p2p、网宿p2p

拉流接口中p2p标志字段:

    1. 接口:/lapi/live/appGetPlayer/stream/房间id

    2. p2p字段:Android(1代表星云p2p,2代表腾讯云p2p,3代表网宿p2p,0代表未开启p2p), iOS(1代表腾讯云p2p,2代表网宿p2p,0代表未开启p2p)

    3. 样例:

判断p2p播放成功与否:

    1. Android:adb shell logcat |grep -iE “p2pconfig|qcloud|setDataSource|venus” 或者用Android Studio来过滤日志,检查sdk加载是否成功,传给播放器的url是否是”http://127.0.0.1:****.flv”的格式,如下图:

    2. iOS:Mac上通过控制台过滤关键字“qcloud”(腾讯云p2p)或者“DYP2PSDK”(网宿p2p),同样通过日志检查sdk加载是否成功,如下图:

网宿p2p:

几家p2p的区别:

  1. 星云p2p:不支持对称型网络,故公司内网无法成功走进p2p播放(F4栋楼下三作咖啡wifi支持),支持局域网内数据分享,不支持移动数据网(2/3/4G)
  2. 腾讯云p2p:支持对称型网络,支持局域网内数据分享,不支持移动数据网(2/3/4G)
  3. 网宿p2p:支持对称型网络,支持局域网内数据分享,不支持移动数据网(2/3/4G)

遇到过的坑:

    1. Android客户端,腾讯云p2p播放过程中切换到音频播放,p2p sdk未停止仍然继续收发数据

            注释:通过UI层难发现该问题,需结合日志判断sdk的加载和释放是否成功,故p2p测试过程中尽可能让开发打印详细过程日志

    2. Android客户端,观看开启星云P2P直播间时,安卓客户端出现crash

            注释:播放器心跳数据采集时上层应用请求sdk接口获取相关数据,由于第三方sdk没有提供该方法,从而触发第三方库崩溃。同时因为斗鱼办公室环境网络nat类型是对称型的,进入sdk后会回退到cdn,而未触发P2P,所以当时内网测试未出现crash

    3. iOS客户端,腾讯云p2p播放过程存在内存泄漏

            注释:通过xcode的instrument工具(需源码)分析发现腾讯p2p sdk运行时有内存泄漏风险,功能测试时可通过查看进程内存消耗变化来判断此类问题

    4. 播放p2p直播间时按HOME键压后台再立即切回,画面一直显示加载中,看日志显示p2p一直在正常收发数据,但播放无法自动恢复

            注释:正常情况p2p后台播放恢复到前台播放时无需重新给播放器设置流地址,此问题非p2p sdk导致,属于上层应用处理不当导致

    5.ipad版本腾讯云p2p播放过程中切换到硬解码播放一段时间后画面冻屏,声音输出正常

            注释:由于各家p2p在媒体数据上均做了处理,将从cdn和p2p节点获取到的码片在客户端本地做了拼接及封装,且最终输出的格式可以是flv也可能是m3u8,因此对视频流的解码兼容性上需覆盖不同型号的芯片(软解码覆盖不同cpu型号,硬解码覆盖不同GPU型号)和不同的系统版本(特别是定制化的系统如华为EMUI、魅族的Flyme、小米的MIUI)等。

猜你喜欢

转载自blog.csdn.net/weixin_42279304/article/details/80916381
P2P
今日推荐