内容来源:2017年6月24日,梨享计算前端工程师谢庭在“腾讯Web前端大会 TFC 2017”进行《基于WebRTC的P2P-CND流媒体加速》演讲分享。IT大咖说做为独家视频合做方,经主办方和讲者审阅受权发布。
阅读字数: 4311 用时: 6分钟
嘉宾演讲视频地址:t.cn/RCIMlWnjavascript
PPT地址:t.cn/Rp9hZ7R前端
在讲WebRTC以前,咱们先回顾一下Web通讯的演化历史。在AJAX出现以前,也就是05年以前,若是须要更新内容,必须重载整个网页页面。AJAX出现以后,经过在后台与服务器进行少许数据交换,AJAX 可使网页实现异步更新。但AJAX不能与服务器进行双工通讯,所以服务器没法主动推消息给浏览器,只能经过浏览器进行轮询。Websocket的出现使这个局面获得改观,浏览器与服务器能进行全双工通讯。无论是AJAX仍是Websocket,都须要将数据发送给服务端。为了在两个用户间传送数据,开发者须要购买服务器网络,这方面的成本是很是庞大的。由谷歌支持的一项新技术——WebRTC完全改变了这个局面。WebRTC是Web Real-Time Communication的缩写,实现了浏览器之间直接的实时通信,而再也不须要服务器中转,谷歌致力于让其成为HTML5的标准之一,目前大部分浏览器也已经支持。java
12年谷歌的chrome浏览器正式原生支持WebRTC,web开发者只须要几行javascript代码就能够开发出丰富的实时多媒体应用,而用户也无需安装插件,直接打开浏览器就能够与对方实时聊天。这时候有些嗅觉敏锐的开发者开始利用WebRTC的数据通道技术作P2P流媒体,例如国外一家公司叫作peer5。咱们公司的创始人Alan在腾讯工做的时候也投入到这方面的研究,但失望的发现用WebRTC作P2P流媒体还有一些问题难以解决,好比用户在线的时间并不稳定,当用户关闭页面,WebRTC的数据通道也就关闭了。随后在13年和14年,Firefox和Opera也相继宣布支持WebRTC。这时Alan提出一个大胆的设想,既然浏览器作种不稳定,那么把相同的协议实如今路由器和NAS中呢?咱们都知道路由器是24小时开启的,但大部分时间是处于闲置状态,若是能把这些计算能力和网络带宽利用起来,这样至关于千家万户都是节点,你的邻居甚至你本身也许就在为你看视频提供加速,想一想都是很酷的事情!所以咱们提出了众包CDN的概念,而且申请了专利。15年,腾讯的X5浏览器内核和微信也提供了支持,同年,咱们梨享计算也正式宣布成立。git
可能你们会有疑问,WebRTC未来真的会成为一种主流技术吗?咱们用事实说话,看看各大浏览器的支持状况就知道了。从图中能够看出,大部分浏览器都已支持WebRTC,包括chrome、firefox和opera,微软的edge浏览器部分支持WebRTC。另外,苹果也在近期的WWDC大会上宣布safari11支持WebRTC。将来基于WebRTC的应用将愈来愈多,这是能够确定的。github
咱们假设如今有两个浏览器A和B要创建WebRTC对等链接,对等链接就是两个Web浏览器之间的直接媒体链接,若是A要主动联系B,须要先经过HTTP向信令服务器发送一个SDP,SDP能够理解为一个电脑名片,全称是Session Description Protocol,会话描述协议,用于描述对等链接的媒体特征。那么信令服务器又是什么呢?它就像一个红娘,帮两个互相不认识的人牵线。浏览器A发过来的SDP叫作offer,信令服务器将其传给浏览器B,后者收到后回应一个SDP对象,叫作answer,也经过信令服务器中转给A。交换完SDP后,两个对等端就开始尝试ICE打洞,打洞成功后开始协商密钥,以后就能够开始安全的媒体或数据会话了。web
因为IPv4提供的IP资源有限,IPv6尚未推广开来,大部分网络设备还处于内网中,须要经过NAT设备来与外部internet链接。NAT全称Network Address Translation,网络地址转换,装有NAT软件的路由器叫作NAT路由器,它至少有一个有效的外部全球IP地址。这样,全部使用本地地址的主机在和外界通讯时,都要在NAT路由器上将其本地地址转换成全球IP地址,才能和因特网链接。当两个对等端处于不一样的局域网中时,须要先知道对方的公网IP和端口。这时候能够先向STUN服务器发送测试数据包,后者作出响应,指示其在测试数据包中监测到的IP地址,此地址将成为潜在的候选地址返回。拿到候选地址的浏览器将其经过信令服务器发送给对等端,对等端也进行一样的操做,以后双方用全部获得的候选地址尝试链接,若是都没有成功的状况下,会用TURN服务器来做为中转服务器,TURN服务器是在全部替代方案都无效的状况下才有采起的,由于成本比较高昂。为了加速通话创建时间,有一个叫trickle ice的方案,其思想是客户端一边收集candidate一边发送给对方,好比local candidate 不须要经过stun获取直接就能够发起,这下降了了连通性检测完成的时间。算法
接下来介绍一个比较重要的概念——WebRTC data channel。咱们基于WebRTC来作P2P流媒体,实际上就是用的data channel能力。那么data channel究竟是什么呢?虽然有关WebRTC的宣传主要侧重于它对于实时音视频通信的支持,但设计师一直都但愿它也支持实时数据传输。相比Websocket和HTTP,数据通道支持流量大、延迟低的链接,具备稳定可靠等优势。并且data channel的接口和websocket同样,也是经过send来发送数据,经过ommessage来接收数据。那么如何对data channel数据传输的可靠性进行控制呢?经过刚才所讲的dataChannelOptions这个javascript对象,可让data channel在UDP或者TCP的优点之间进行切换,好比让数据传输得更加稳定可靠,或者传输得更快。其中有几个比较重要的字段:ordered:设置数据的接受是否须要按照发送时的顺序,maxRetransmitTime:设置数据发送失败时,多久从新发送,maxRetransmits:设置数据发送失败时,最多重发次数。主要是配置ordered,当设置为true时数据通道表现更像TCP,false时表现更像UDP。chrome
此外,咱们公司一直对WebRTC标准化保持着关注并贡献力量。在去年,咱们在研发过程当中发现有一个第三方的webrtc协议栈能与chrome浏览器进行通信,但没法与firefox通信,经过对比SDP发现firefox有一处实现与标准规范不一致。因而咱们与firefox开发团队取得联系,提交了咱们的修改建议,最初他们认为没有问题,但最终仍是采纳了咱们的建议,对sdp进行了修改。这也算是咱们对推动webrtc标准化作出的一点点贡献。另外,咱们也一直与腾讯浏览器内核团队保持着联系,争取WebRTC技术以及本次分享的上层的P2P-CDN加速协议获得全面的支持。浏览器
把WebRTC的data channel搞清楚后,咱们就能够用用它来作P2P流媒体了。这方面已经有国外大神开发的知名开源项目:WebTorrent,在github上有1万多颗星。WebTorrent是一个开源的基于WebRTC 和BT协议的js框架,彻底用javascript编写,能够同时运行于 Node.js 和浏览器,因为基于WebRTC,所以WebTorrent不须要安装任何插件,就能够跑在浏览器上。同时支持Chrome, Firefox 和 Opera浏览器。可是因为是基于BT协议,因此是一种pull-based的算法,这种算法是一种随机抓取的策略,随机抓取其它节点的buffer,但这样会存在一个问题:抓取的buffer不必定是目前须要的,也不必定是其余节点须要的,并且还会浪费下行带宽和其它节点的上行带宽,所以同时形成了“带宽饥饿”和“内容饥饿”问题。下面介绍一种改进版的pull-based算法——FirstAid算法。FirstAid是基于窗口滑动的,每隔一段时间触发一次窗口滑动,每一个窗口又能够分红三段:urgent、normal和prefetch,urgent顾名思义,是离播放时间最近的buffer,因此优先级别最高,normal和prefetch优先级递减。当父节点为子节点传输buffer时,会优先知足urgent级别的要求,而暂停normal级别的,因此最紧迫的需求会优先获得知足,当子节点的urgent需求获得知足后,须要回过头来弥补他的竞争对手的需求,以达到一种互惠互利的状态。和刚才pull-based算法思想截然相反的是push-based算法,其中比较有表明性的是FashMesh算法,由港科大的学者提出来的一种P2P算法。FashMesh是基于一种叫Streaming Mesh的算法,将源节点的数据流分红多个子流,经过多棵生成树构成mesh来源源不断的传输给子节点,这种算法的优点是延迟低,带宽利用率高。Fast Mesh还能够根据每一个子节点的上行带宽来动态的调整网络拓扑结构,让上行带宽大的节点更加接近源节点,从而充分利用网络的现有能力。根据一项对比试验,FastMesh多是目前众多P2P算法中效果最好的。但这个算法也有缺点,当节点进入或离开网络时,都须要从新调整拓扑结构,所以不适合节点变化较大的状况。安全
咱们自行研发的算法——Push-Pull算法则综合了push-based和pull-based两种算法的优点,用pull的方式从父节点获取优先级最高的buffer,由父节点以push的方式为其提供后续的buffer。另外,咱们的算法混合HTTP、HTTPS、WebRTC、Websocket等多种协议,在优先保证用户体验的前提下最大化P2P率。通过测试,Push-Pull算法具有低延迟、高带宽利用率、高P2P率、对网络拓扑结构变化鲁棒性强等优点。
PearPlayer(梨享播放器,github地址:https://github.com/PearInc/PearPlayer.js) 是彻底用JavaScript写的开源HTML5流媒体播放框架,实现了融合HTTP(包含HTTPS、HTTP2)、WebRTC的多协议、多源、低延迟、高带宽利用率的无插件Web端流媒体加速能力。基于H5的MSE技术(Media Source Extension)未来自多个源节点的Buffer分块喂给播放器,再加上精心设计的算法来达到最优的调度策略及对各类异常状况的处理,Pear Player能在保证用户流畅视频体验的前提下最大化P2P率。
集成咱们的PearPlayer.js也很是简单,只须要短短几行代码,把咱们的js文件引入到script标签中,并把video的id还有token做为参数传给咱们提供的函数中便可。Demo演示地址:qq.webrtc.win/watch,如下是demo截图。
除了播放器外,咱们还开发了支持多协议、多源、混合P2P-CDN的下载器PearDownloader,可用于高清图、压缩包、软件发布或升级包、音乐、文档等大文件下载或在线服务的场景(github地址:github.com/PearInc/Pea…),Demo演示地址:qq.webrtc.win/download。
最后,讲一下雾计算有关的内容。雾计算与云计算有什么区别呢?云在天空飘浮,高高在上,高不可攀;数据中心距离终端用户较远,用户消息须要通过若干跳才可以到达。而雾是贴近地面的云,是现实可及,就在你我身边。雾计算并不是由性能强大的服务器组成,而是由性能较弱、更为分散但离用户更近的各种计算设备组成,例如智能路由器、网络存储设备等。雾可以弥补云的不足,并和云相互配合,协同工做。咱们Pear公司一直在践行雾计算的理念,经过与国内知名的路由器、NAS厂商合做,咱们拥有海量可持续稳定提供服务的节点。大部分带宽、存储、计算资源经过众包方式收集自终端用户稳定在线的边缘设备,服务能力覆盖所有地域、全部运营商、每处网络边缘。咱们自研的调度系统能够动态、实时的感知和调度,让数据传输距离尽量接近“零跳”。
相对于传统的模式,咱们能够说是站在共享经济的风口上。咱们知道传统的CDN厂商会先以批发价从ISP买进带宽,而后再以零售价卖给CP,CP买入带宽后进行内容分发,为终端用户提供CDN服务。咱们与硬件厂商合做,在其设备中植入咱们的软件,从而在千家万户拥有了分布普遍的节点。CP厂商和传统CDN厂商从咱们这里买入带宽,咱们将其内容分发到各个节点中,持有设备的用户在提升其计算资源和带宽资源的同时,也会获得咱们的返利,BGP机房、ISP骨干网的压力也得以缓解,从而实现多赢局面。
推荐文章
近期活动