构建基于浏览器的Web P2P网络直播

简介: 在2021年的互联网时代,越来越多的网络直播节目相继涌现。浏览器是用户最易接触的渠道之一,聚集了大量观看直播的用户。当用户们同时观看直播内容时,服务器承受的负载随着用户量的增加而增大,会导致播放的卡顿,延迟等用户体验的下降;而且高昂的服务器带宽成本也不容忽视。那么是否存在一套解决方案,在保证用户体验与服务质量的前提下,又可以有效的降低服务器的负载与带宽呢?那就是接下来要介绍的Web P2P技术了。

一、Web P2P的前世今生

2010年,Adobe在Flash Player 10.0推出了实时流媒体RTMFP,使用RTMFP在Flash Player之间进行P2P成为可能。在随后的几年内,该协议在网络上如雨后春笋般的被广泛部署,但是从2020年末开始,各家的浏览器都已经彻底不支持Flash了。我们又应该如何在Web里面使用P2P呢?

诞生于2011年的WebRTC技术,在Google、Microsoft、Apple、Mozilla等大厂的支持下,成为了H5的标准,并且Chrome、Edge、Safari、Firefox等主流浏览器也都支持WebRTC。所以就可以通过WebRTC来实现P2P了。

下文把基于WebRTC实现的HTML5 P2P简称为H5 P2P。

二、WebRTC简介

WebRTC的总体架构如下图所示,如果是浏览器开发者,通常需要关注并实现WebRTC C++ API,而我们的目标是基于浏览器实现P2P,所以只需要关注Web API即可。

image.png

整体的H5 P2P都是基于RTCPeerConnection和RTCDataChannel来实现的,只是实现数据层面的P2P,不包含音视频通信的内容。

三、总体架构

image.png

1. H5 P2P客户端

主要包含通信模块、传输模块、节点管理、调度模块、存储模块和统计模块:

通信模块主要负责和服务端(上图中的Index、CPS、Tracker)进行信令的通信

传输模块:包含HTTPClient和基于RTCDataChannel实现的RTCClient(上传&下载)

节点管理:不同用户间P2P主被动连接、断开、淘汰、资源信息同步

调度模块:根据buffer水位、分片信息、节点质量和规模进行CDN/P2P调度

存储模块:负责媒体数据的存储、排序、以及淘汰

统计模块:包含系统运行的埋点的实现

2. H5 P2P服务端

主要包含Index、CPS、Tracker和Stun服务:

Index:索引服务,提供其他服务地址。

CPS:资源属性服务,将直播流的URL转换为RID。

Tracker:资源追踪服务,主要存储用户和资源之间的索引关系。

MQTT:信令服务,转发用户间建立P2P连接的offer/answer/candidate SDP协议。

Stun:采用coturn部署,主要用户节点之间建立对等连接的UDP穿透。

四、阶段流程

下图简略的展示了整体方案的各个阶段、流程:

image.png

Step 1:网页打开,首先向Index服务请求其他服务的地址,保存于内存中

Step 2:客户端收到直播请求,向CPS发送请求将URL转换为资源ID(RID),相同内容相同清晰度的直播流的资源ID(RID)是相同的,表明可以互相分享数据

Step 3:客户端首先会启动HTTPClient进行数据下载,优先保证秒播。同时做以下2件事

a. 客户端向Tracker服务发送Address协议,获取其他正在观看该直播的用户地址,待后续建立连接,分享数据

b. 客户端向Tracker服务发送Publish协议,将自己的信息告知Tracker,使得别人可以即使搜索到自己,进行数据分享

Step 4:向从Tracker获取的其他用户建立连接,彼此交换信息,数据分享

五、连接建立

假设在Peer1和Peer2之间传输数据,那么在传输之前,首先需要建立连接。在WebRTC中,浏览器间通过ICE框架建立对等连接,主要包含Stun、TURN,下面分别简单介绍一下:

1. ICE

ICE(Interactive Connectivity Establishment)提供的是一种P2P连接框架,统一各种NAT穿透技术(STUN,TURN)。基于offer/answer/candidate模式,通过多次地址交换,然后进行连通性测试,穿透用户网络间各类防火墙。ICE主要包含STUN、TURN等协议。

2. STUN

STUN(Simple Traversal of UDP Through NAT)允许位于NAT设备后的客户端找到自己的公网IP/Port地址,以及查询出自己的NAT设备类型,通过这些信息使得两个同时位于NAT后的2个设备之间建立UDP通信,具体的STUN流程可以参考RFC5389,不在此赘述。

3. TURN

通俗的说,TURN(Traversal Using Relays around NAT)就是中继/转发,并不是所有的设备之间都可以依靠STUN来建立连接的,那么当两个设备之间无法依靠STUN建立连接时,就会启用TURN来进行数据中转。

由于我们的目标是节约带宽,如果采用TURN转发的话,并不能减少服务器的带宽消耗,另外一个原因是,在整个建立连接的过程中,有别于传统的视频通话只能1对1,这里的传输模式是1对多传输,所以并不要求每个连接都可靠,因此在H5 P2P项目我们仅仅通过STUN来实现连接的建立。

六、数据下载

1. 资源编码

Web P2P网络直播方案也可以同时支持任意多路直播同时进行,必须保证各路直播流之间的独立性,因此,我们提供一种统一的资源编码方式,用来标识唯一的一路直播流。这里主要借用直播流中的StreamId,通过计算MD5,生成固定长度的资源ID(RID),不仅保证了内容相同,清晰度不同,RID也不同;也保证了相同的内容,由于断流切换源地址,导致URL变化,保证资源ID(RID)相同。

2. 下载调度

在整个直播过程中,由于可播放缓存的数据是非常小的,通常不超过10秒?因此如何实时的根据当前的网络状态、网络环境,作出使用CDN,又或是使用P2P的决策呢?这里,我们的最佳实践主要如下:

a. 为了保障用户的观看体验,当缓冲区的可播数据低于某个阈值(例如5秒),就切换CDN下载

b. 当发现某一片未来的数据,周围的人都没有的时候,即使可供播放的buffer还有很多,不满足a策略的描述,这个时候,为了尽快的分发数据,也应该及时切换至CDN,出现这种情况时,往往表示这个节点以及他连接的节点都处于整个直播数据分发的顶层,为了防止出现 “一人下载多人围观” 的场景,本着更快的下载导致更早的上传理念,不仅仅要求该节点自身尽快CDN下载,同时也保证周围用户某个比例(例如15%)也尽快采用CDN下载,从而使得整体数据的分发效率提升。

3. P2P任务分配

a. 任务编号

对于每一个数据块都有一个自然数编号(sn),对于这个数据块,我们按照固定长度(默认16KB)的大小进行切分,简称chunk_index,那么(Rid, sn, chunk_index)就可以唯一确定一个数据片了。

 

b.分配请求

分配过程类似于扑克中的发牌机制,唯一的要求是对方这个节点拥有这个数据块,并且质量越好的节点,越多越分配靠近播放点的、重要的数据。下图简明扼要的展示了3个相同质量节点分配2个数据块(9个数据片)的过程。

image.png

4. 内存控制

对于Web P2P来说,所有的媒体数据都缓存在内存中,但是,也并不是会缓存完整的数据。对于直播来说,所有用户的观看点都是非常接近的,因此,内存始终缓存播放点前后的固定大小的数据。因为只有这部分数据分享利用率才是最高的。

image.png

如上图所示,有颜色的数据块都是当前在内存缓存中的数据,其中红色数据块表示当前的播放点,黄色数据块表示过去已经播放过的内容,绿色数据块表示未来还未播放的内容,可以看到当播放点从100移动至101时,97号数据块就被淘汰了,同时103号数据块作为最新的数据被下载下来并缓存到内存中。

七、工程实践

1. Goggle FlatBuffers

不管是服务器通信还是点对点的P2P传输均采用了FlatBuffers。FlatBuffers具有跨平台、内存和效率速度高,扩展灵活等优势,被我们全平台统一采用,大幅降低了通信成本。

2. 多浏览器兼容

线上支持WebRTC的浏览器不仅种类繁多,而且同一个产品的不同版本之间也可能千差万别。为了解决这一痛点,最终采用了WebRTC adapter.js来解决这一挑战。

3. 内存池

尽管Node.js自带垃圾回收机制,以及内存管理策略,但是GC和内存分配也是需要成本的,况且Web端是单线程环境,任何性能的提升都会减少时间上的损耗,进而可以处理更大吞吐的网络层传输以及业务逻辑。所以在内存分配上我们采用了内存池策略,基本实现了100%的内存重复使用。

八、技术结果

下图展示某次大型直播的带宽分时统计,显示在19:25到21:00阶段内的真实数据,随着人数的涌入和离去,Web P2P全程带来可观的带宽收益。最终评估Web P2P,在不影响用户使用体验的前提下,不仅可以有效降低服务器的负载压力,并且能够降低可观比例的带宽成本。

image.png

九、思考总结

目前,该技术已经大规模应用在各网络直播中,良好的解决了服务质量与带宽成本的平衡。但是,我们也发现在超大规模的直播下,存在了一些提升的空间,主要如下:

(1) coturn与MQTT的服务性能不高,会制约直播的服务质量。

(2) 接入边缘网络,打造多元化网络,缓解CDN负载,并且可以进一步降低CDN的带宽成本。

相关实践学习
Serverless极速搭建Hexo博客
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
相关文章
|
6天前
|
数据采集 存储 JavaScript
构建你的第一个Python网络爬虫
【9月更文挑战第34天】在数字信息泛滥的时代,快速有效地获取和处理数据成为一项重要技能。本文将引导读者通过Python编写一个简易的网络爬虫,实现自动化地从网页上抓取数据。我们将一步步走过代码的编写过程,并探讨如何避免常见陷阱。无论你是编程新手还是想扩展你的技术工具箱,这篇文章都将为你提供有价值的指导。
46 18
|
3天前
|
存储 安全 网络安全
云计算与网络安全:构建安全的数字基石## 一、
本文探讨了云计算与网络安全之间的紧密联系,强调在享受云服务带来的便利与效率的同时,必须重视并加强信息安全管理。通过分析云服务的基本概念、特点及面临的主要安全风险,提出了一系列增强网络安全的策略与措施,旨在为企业和个人用户提供一个更加安全、可靠的云计算环境。 ## 二、
|
2天前
|
Web App开发 JavaScript 前端开发
使用Node.js和Express框架构建Web服务器
使用Node.js和Express框架构建Web服务器
|
3天前
|
SQL 安全 算法
网络安全与信息安全:构建数字世界的防线在数字化浪潮席卷全球的今天,网络安全与信息安全已成为维系社会秩序、保障个人隐私与企业机密的重要基石。本文旨在深入探讨网络安全漏洞的本质、加密技术的前沿进展以及提升安全意识的有效策略,为读者揭示数字时代下信息保护的核心要义。
本文聚焦网络安全与信息安全领域,详细剖析了网络安全漏洞的形成机理、常见类型及其潜在危害,强调了及时检测与修复的重要性。同时,文章系统介绍了对称加密、非对称加密及哈希算法等主流加密技术的原理、应用场景及优缺点,展现了加密技术在保障数据安全中的核心地位。此外,针对社会普遍存在的安全意识薄弱问题,提出了一系列切实可行的提升措施,如定期安全培训、强化密码管理、警惕钓鱼攻击等,旨在引导公众树立全面的网络安全观,共同构筑数字世界的安全防线。
|
5天前
|
人工智能 安全 网络安全
云计算与网络安全:构建安全的数字生态系统
随着云计算技术的广泛应用,网络安全问题日益凸显。本文从云服务、网络安全和信息安全等技术领域出发,探讨了云计算与网络安全的关系及其挑战,并提出了相应的解决方案。通过深入分析云服务的安全架构、网络安全的防护策略以及信息安全的管理措施,揭示了构建安全数字生态系统的重要性。同时,强调了技术创新、人才培养和政策法规在保障云计算与网络安全方面的重要作用,为相关领域的研究和实践提供了有益的参考。
|
2天前
|
缓存 安全 JavaScript
掌握JAMstack:构建更快、更安全的Web应用
JAMstack 是一种现代 Web 开发架构,结合 JavaScript、APIs 和 Markup,创建更快、更安全的 Web 应用。其核心优势包括高性能、安全性、可扩展性和易维护性。JAMstack 通过预构建静态页面和 API 实现高效渲染,利用静态站点生成器如 Gatsby 和 Next.js,并借助 CDN 和缓存策略提升全球访问速度。尽管面临复杂交互、SEO 和数据更新等挑战,但通过 Serverless Functions、预渲染和实时 API 更新等方案,这些挑战正逐步得到解决。
|
2天前
|
存储 安全 网络安全
网络安全与信息安全:构建安全防线的关键技术与策略
本文旨在探讨网络安全和信息安全的重要性,通过分析网络安全漏洞、加密技术以及安全意识等关键领域,揭示构建稳固网络防线的必要技术和策略。我们将从技术角度出发,深入浅出地介绍如何识别和防范潜在的网络威胁,以及如何通过教育和培训提高个人和组织的安全意识。
|
4天前
|
运维 物联网 5G
5G网络的多接入技术融合:构建无缝通信未来
5G网络的多接入技术融合:构建无缝通信未来
28 4
|
3天前
|
前端开发 JavaScript 微服务
拥抱微前端架构:构建未来Web应用的新思路
随着互联网技术的发展,Web应用日益复杂,传统单体架构已难以满足需求。微前端架构将大型应用拆分为独立模块,便于管理和迭代。其核心优势包括技术栈无关性、独立部署、团队协作及易于扩展。实施时需定义边界、选用框架(如Single-spa)、管理状态通信,并解决样式隔离和安全性等问题。尽管存在挑战,微前端架构凭借灵活性和高效性,有望成为未来Web开发的主流趋势。
|
4天前
|
存储 安全 网络安全
云计算与网络安全的交织:构建安全的数字基石##
在当今信息化时代,云计算已成为推动技术进步和创新的重要驱动力。然而,随着云服务的普及,网络安全问题也日益凸显,成为制约云计算发展的关键因素。本文将深入探讨云计算与网络安全的内在联系,分析当前面临的主要挑战,并提出相应的解决策略。通过技术创新、法规完善、用户教育等多方面的努力,我们可以共同构建一个既高效又安全的云计算环境。 ##