聊聊网易云信的信令网络库实践

信令作为实时音视频技术架构中的重要一环,是对建立实时音视频通信起到关键桥梁性的作用。本文将从信令的概念着手,分享在网易云信新一代音视频技术架构下,信令的基本交互流程设计以及信令网络库的模块设计和重连优化等。

作者:丁永锋 网易云信资深客户端开发工程师

一、什么是信令

我们都知道,WebRTC 是通过 RTCPeerConnection 来做到端与端之间的实时音视频通信的,那他们是怎么知道对方网络位置(网络数据)?支持何种编解码器(媒体元数据)?何时打开或关闭通信(会话控制)的呢?这就需要建立一条通道来交换这些信息,而这协商的信息就是信令,这条通道也就是信令通道。我们这里所说的信令网络库的作用就是为端和信令服务器交换信令提供网络传输的通道。那信令的作用到底是什么?

在实时通信中,信令的主要作用体现在以下四个方面:

  • 媒体功能的协商和设置。
  • 标识和验证会话参与者的身份(交换 SDP 对象中的信息:媒体类型、编解码器、带宽等元数据)。
  • 控制媒体会话、指示进度、更改会话和终止会话。
  • 当会话双方同时尝试建立或更改会话时,实施双占用分解。

总之,信令就是协调音视频实时通信的过程,一旦信令服务建立好了,两个客户端之间建立了连接,理论上它们就可以进行点对点通讯了。而值得注意的是,WebRTC 标准本身没有规定信令交换的通讯方式,信令服务根据自身的情况实现。这也为我们自定义信令服务器提供了可能。

二、单 PeerConnection 方案

2020 年,在疫情的冲击下,音视频通信市场得到了爆发式的增长,在视频会议、在线教育、线上金融、云游戏等各个领域都得到了长足的发展。同时,客户也对各种应用场景下的音视频的高性能、低延时等方面提出了更高的要求。

在 2020 年 11 月,网易云信发布了新一代音视频技术架构(简称 NERTC),详细内容可查看文末介绍,为了提升产品性能,我们从高可用、高并发、高性能、高扩展等方向进行了全流程的技术升级,包括新一代音视频融合通信服务端系统、新一代音视频 SDK 以及新一代音视频引擎,其中就包括单 PeerConnection 的重构方案。

单 PeerConnection 方案涉及了信令服务器的重构。其基本设计原则是主要是:

  • iOS/Android/windows/Mac/Web 多端协议一致,均采用 Websocket 交互,节省服务器资源,简化服务器代码逻辑。
  • 端侧只创建 2 个 Peerconnection,一个只负责发送(sendonly),一个只负责接收(recvonly)。
  • 采用自定义信令协议进行交互。
  • 简化协商流程,减少首屏时间。

单 PeerConnection 方案基本的信令交互流程如下:

Generated

三、WebSocket 通信简介

前文可知,为了达到多端(Web)信令协议交互一致性,所以采用了 WebSocket 作为信令传输。那 WebSocket 有什么特点?

说到 WebSocket,就离不开 HTTP。HTTP 一般限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接,不过 HTTP 也有 Keep-Alive 功能保持连接,使得单次连接内可以发送多次请求。WebSocket 是基于 HTTP 协议的,而区别于 HTTP 的最大特点在于服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话;而 HTTP 只能从端侧发起请求。从下图可以清晰看出 HTTP 与 WebSocket 之前的区别。

Generated

(一)握手(Handshake)

WebSocket 是建立在 TCP 长连接基础之上的,为了实现 WebSocket 的通信,借用 HTTP 协议完成了一次握手过程。具体的握手过程是这样的:

a. 客户端发起握手请求

聊聊网易云信的信令网络库实践

b. 服务器返回应答

聊聊网易云信的信令网络库实践

这样表示握手成功。握手成功之后,客户端和服务器就建立了双向的数据通道,可以互发消息(数据),不需要客户端每次都发起请求。

(二)连接保持

常规做法大家都知道,那就是心跳机制,通过判断心跳是否有响应来判断链接是否可用。WebSocket 也不例外,其协议规定了 ping/pong 机制来保持连接。我们可以看下 ping/pong 在 RFC6455 具体是怎么规定的。

5.5.2. Ping

The Ping frame contains an opcode of 0x9.

A Ping frame MAY include “Application data”.

Upon receipt of a Ping frame, an endpoint MUST send a Pong frame in response, unless it already received a Close frame. It SHOULD respond with Pong frame as soon as is practical. Pong frames are discussed in Section 5.5.3.

An endpoint MAY send a Ping frame any time after the connection is established and before the connection is closed.

NOTE: A Ping frame may serve either as a keepalive or as a means to verify that the remote endpoint is still responsive.

5.5.3. Pong

The Pong frame contains an opcode of 0xA.

Section 5.5.2 details requirements that apply to both Ping and Pong frames.

A Pong frame sent in response to a Ping frame must have identical “Application data” as found in the message body of the Ping frame being replied to.

If an endpoint receives a Ping frame and has not yet sent Pong frame(s) in response to previous Ping frame(s), the endpoint MAY elect to send a Pong frame for only the most recently processed Ping frame.

A Pong frame MAY be sent unsolicited. This serves as a unidirectional heartbeat. A response to an unsolicited Pong frame is not expected.

由上可知,一端通过发送 ping 帧,对端收到 ping 帧后,响应一个 pong 帧,这样就完成了一次连接的检测,并且它是单向的。

(三)关闭连接

当关闭 WebSocket 通信的时候,发起端需要发送一个关闭帧,对方收到关闭帧,如果不曾发送过关闭帧,则需要发送一个关闭帧作为响应。关闭帧可以携带应用数据,用来说明关闭的原因。最后等到底层 TCP 连接关闭后,整个 WebSocket 通信就完全关闭了。

四、在 NERTC 中的应用

网易云信在新一代音视频技术架构中,是如何使用这些技术来实现信令的传输通道呢?下面我们先从模块设计方面和重连方面的设计做一些介绍。

一个基本原则:应用层不需要关心消息丢失、乱序、重发等问题。众所周知,TCP 提供可靠的传输服务,通过 TCP 连接传送的数据无差错、不丢失、不重复且按序到达。TCP 通过校验、重传控制、序号标识、滑动窗口、确认应答来实现可靠传输,如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。这样,我们只需要解决的就是重连和重发问题。

(一)网络库架构设计

下图是 NERTC 的网络库架构图设计:

Generated

我们简单介绍其中的几个模块:

  • API 部分定义的是网络库模块的对外接口,由应用层调用。
  • Transport 模块主要抽象了消息收发和连接管理的功能,ws/wss 以及未来的 quic 协议扩展等都基于其虚接口实现。
  • Message 模块管理 WebSocket 子协议的组包和解包。
  • SendBuffer 管理 Message 的缓存和重发。
  • Peer 作为核心模块,实现对 Transport、Message 等所有模块的控制。

接下去我们看下快连接快重试和重连设计优化。

(二)快速连接和重连设计

下面我们按不同的场景来介绍下网络库是如何运作以及做了哪些工作,部分场景可以结合下图来理解。

场景一:首次连接时的退避策略。当应用层(简称 SDK)首次尝试连接时,如果 WebSocket 连接成功,则返回 SDK,SDK 发起信令协商;如果连接失败,使用每隔 200/400/600ms 的快速重试多次连接的策略。如果最终都失败的话,则回调给应用层 onFail 事件。

场景二:连接成功后的断开重连策略。如果已经连接成功,因为网络原因或者服务器等原因导致连接断开,则触发此策略。触发方式分为两种,一种方式是,WebSocket 通知了 onClose 事件;另外一种是主动探测的方式,通过 ping/pong 机制来触发重连。后者通过发送 ping 帧三次,每次间隔 3s,超时 1.5s,如果三次均无法得到 pong 帧,则认为网络或者服务器异常,触发此场景的重连策略。具体的策略是,每隔 2/4/6s 触发一次连接尝试,如果最终还是失败的话,回调给应用层 onDisconnected 事件。

场景三:应用层收到 onDisconnected 事件,会切换新的 server 地址,重新通过网络库尝试连接,直到 server 用尽,退出当次通话。

场景四:当网络切换或者恢复可用时,应用层会主动触发重连。

场景五:服务器主动关闭连接时,网络库清空消息缓存,并且不再尝试重连。

重连场景如下图所示:

Generated

(三)消息缓存和重发

其实上面的时序图已经包含了消息发送和重发的时机。消息分为两种:

• Request 类型消息,需要等待服务器的 Response,需要缓存。

• Notification 类型消息,不进入消息缓存,当然也有可能是服务器发送过来的通知。

我们这里只讲端侧的消息发送。消息的发送和重发都只在连接成功后触发。

每一条消息都会先进入发送缓存队列(即 SendBuffer),如果当前连接正常,则直接发送,如果连接断开则会暂停发送,等待连接或重连成功之后才会恢复发送。因为依赖于 TCP 的可靠传输,所以消息的重发均只发生在重连成功之后。当连接被服务器 kick off 或者应用层主动关闭时,peer 对象会清空所有缓存消息,不再做发送或重发的尝试。

(四)弱网下的表现

在弱网下,我们的测试数据发现,非常多能抗 50% 的丢包率。在实测场景中,高丢包率情况下,媒体流的 QoS 激进策略下会发送大量的冗余包和重传包,从而导致带宽资源几近耗尽。这会导致什么呢?

WebSocket 连接可能会失败,消息可能无法收发。我们都知道 TCP 是通过滑动窗口和拥塞窗口来做的流控。当已发字节数等于对方的接收窗口字节数时,就会导致发送窗口满(TCP Window FULL)了,从而无法再发送数据。有兴趣的同学可以了解 TCP 相关的概念。这种情况下基本只能通过触发断开重连的机制,关闭老的连接,新建连接进行消息的重发。

五、未来规划

为了增强弱网情况下的抗性,我们会考虑 UDP 作为优化的方向,比如说 QUIC(Quick UDP Internet Connection)协议等,目前也基本已经接近产品化阶段,这里就不再赘述,敬请期待 QUIC 版本的表现。

六、总结

本文从信令的基本概念以及作用入手,简要地讲述了网易云信新一代音视频技术架构中信令网络库基本交互流程、模块化设计思路以及网络库基本运作方式。另外,也对连接重试和重连的设计和优化做了一些论述。同时,也非常欢迎跟我们交流更多关于信令网络库的实现。

作者介绍

丁永锋,网易云信资深客户端开发工程师,一直致力于客户端跨平台开发,目前负责音视频客户端跨平台 SDK 开发,曾负责 Unity & Cocos2dx SDK 以及网易云信 IM SDK 的跨平台开发工作。

关于网易云信

网易云信:网易智企旗下融合通信云服务专家、通信与视频 PaaS 平台。集网易 24 年 IM 以及音视频技术打造的融合通信云服务专家,稳定易用的通信与视频 PaaS 平台。提供融合通信与视频的核心能力与组件,包含 IM 即时通讯、5G 消息平台、一键登录、信令、短信与号码隐私保护等通信服务,音视频通话、直播、点播、互动直播与互动白板等音视频服务,视频会议等组件服务,并联合网易易盾推出一站式安全通信方案「安全通」。目前,网易云信已经成功发送 1.6 万亿条消息,覆盖智能终端 SDK 数累计超过 186 亿,我们期待每个智能终端都有云信的融合通信能力。

文章标题:聊聊网易云信的信令网络库实践,发布者:网易智企,转载请注明出处:https://worktile.com/kb/p/5815

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
网易智企的头像网易智企认证作者
上一篇 2022年3月16日 下午10:38
下一篇 2022年3月16日 下午10:47

相关推荐

  • 知识库在企业和组织中的应用有哪些

    摘要:知识库在企业和组织中的运用通常围绕提高效率、促进共享、支持决策、维持知识连续性这四个核心指标展开。这些指标通过2、减少对个体经验和专长的依赖,3、优化培训和教育过程,4、加强客户支持和服务质量四个方面对企业产生深远影响。知识库可以作为一个汇聚文档、指导、FAQs、案例研究和最佳实践的平台,以支…

    2023年11月15日
    27700
  • 为什么Celery有用

    为什么Celery有用:1、celery可以实现异步任务来提高项目的并发量,完成延迟任务、定时任务;2、celery是一个简单、灵活、可靠的分布式系统,用于处理大量消息,同时为操作提供维护此类系统所需的工具。 一、celery作用 1、celery可以实现异步任务来提高项目的并发量,完成延迟任务、定…

    2023年6月3日
    29200
  • 好用的知识库管理系统有哪些

    这里整理了国内外较好用的10款知识库管理系统,适用对象从团队到个人,他们分别是:1、PingCode Wiki;2、Baklib;3、有道云笔记;4、印象笔记;5、RemNote;6、石墨文档;7、Notion;8、语雀;9、幕布;10、Obsidian。具体功能我们将在文章中介绍。 一、团队知识库…

    2022年3月18日
    2.0K00
  • 企业怎样建设项目

    企业建设项目的步骤是:一、立项审批;二、规划设计;三、 招投标;四、建设工程报建;五、施工许可;六、建设工程竣工验收备案。按照国家规定,所有建设项目必须经过立项审批才能启动,包括项目的可行性研究、环境影响评价等。 一、立项审批 按照国家规定,所有建设项目必须经过立项审批才能启动,包括项目的可行性研究…

    2023年4月16日
    35600
  • 编译型jsp和解释型asp有什么区别呢

    区别是:JSP名列前茅次被请求/发生变动的的时候,会被系统自动生成一个Java代码,然后被编译成Class文件并被当作一个servlet来使用以便提高运行速度。ASP原理与JSP不同,不进行类似的转换,根据代码解释运行。ASP.net类似JSP, 会被.Netframework框架编译后运行的。 J…

    2023年2月14日
    34100
  • 大家对PHP的误解有哪些

    大家对PHP的误解有:1、PHP是一门面向对象语言,但不是基于OOPS;2、PHP无法实现特定的功能;3、PHP不安全;4、不适合做大型应用程序等。尤其是Java程序员,他们认为PHP不是基于OOPS;但他们会发现许多面向对象的特征,比如,接口、方法、抽象对象等。 一、PHP是一门面向对象语言,但不…

    2023年5月12日
    21700
  • 项目管理是基于团队管理的什么制度?

    项目管理中的团队管理是基于目标指向性、清晰的角色分配、沟通合作、和适应性。在这些方面中,沟通合作尤其关键,因为良好的沟通机制是项目成功的关键因素之一。 项目团队的有效沟通保证了信息的顺畅流动和团队成员间的紧密协作。这不仅包括日常的会议和报告,还包括对冲突的管理、团队建设活动以及技能提升培训。通过设置…

    2024年1月8日
    19400
  • 如何衡量研发投资的回报

    衡量研发投资回报涉及考量几个关键性指标:1、净现值(NPV)、2、内部收益率(IRR)、3、回报率(ROI)、4、研发弹性、5、专利和知识产权的质量与数量。净现值(NPV)通过预测项目未来现金流的净值量化投资效益。内部收益率(IRR)评估投资获得的平均年回报率。回报率(ROI)用于计算每投入一单位货…

    2023年11月30日
    1.1K00
  • 如何进行项目周期安全管理

    进行项目周期安全管理的关键在于理解项目各阶段的安全需求、制定全面的安全管理计划、实施针对性的安全措施,以及持续监控和改进安全性能。首先,项目安全管理需要从项目启动阶段就开始介入,通过风险评估来确定潜在的安全风险,并在项目规划阶段制定出相应的安全管理计划。这个计划不仅应涵盖技术安全措施,还应包括员工安…

    2024年4月10日
    4400
  • 为什么云数据库这么贵

    云数据库这么贵的原因有:1、硬件和基础设施成本;2、数据备份和容灾;3、数据安全和隐私保护;4、服务质量和性能保障。云数据库提供商需要投入大量资金来建设和维护庞大的数据中心,以支持数以百万计的用户和海量的数据存储。 一、硬件和基础设施成本 云数据库提供商需要投入大量资金来建设和维护庞大的数据中心,以…

    2023年7月31日
    70300

发表回复

登录后才能评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部