前言
最近遇到了一个音频通话需求,因此需要学习下WebRTC。之前想过了解WebRTC,但因为遇到了很多不明白的专业术语,加上实际开发中没有使用到,所以又搁置了(这次不得不学了,哈哈哈😂)。
WebRTC全称是“Web Real-Time Communication”,是一种使 Web 应用程序和站点能够捕获和选择性地流式传输音频或视频媒体,以及在浏览器之间交换任意数据的而无需中间件的技术。WebRTC 的一系列标准使得在不需要用户安装插件或任何其他第三方软件的情况下,可以实现点对点(P2P)数据共享和电话会议。
P2P通信原理
传统的通信方式:
- 客户端A发送消息给服务器
- 服务器将消息转发给客户端B
P2P的通信方式:
- 通信双方通过信令服务器(Signaling Server)交互元数据
- 通信双方确定通讯链路、建立连接,然后开始实时通信
通信过程中的问题
通信的客户端可能处于不同的网络环境、使用不同的设备,因此需要解决以下3个问题:
- 如何发现对端?
- 不同的多媒体应用和系统使用的编解码器不同如何处理?
- 如何与对端建立连接?
如何发现对端
在P2P通信过程中,通信双方需要交换一下元数据比如媒体信息、网络数据等等,通常称这一过程叫做“信令(Signaling)”。
对应的服务器即“信令服务器(Signaling Server)”,也有人称之为“房间服务器”。因为它不仅可以交换彼此的媒体信息和网络信息,也可以管理房间信息。比如:
- 谁加入了房间
- 谁离开了房间
- 房间人数是否已满,是否可以加入房间
为了避免冗余,并最大限度地提高与现有技术的兼容性,WebRTC标准并没有规定信令方法和协议,通常会使用WebSocket来搭建一个信令服务器。
不同的多媒体应用和系统使用的编解码器不同如何处理
不同的多媒体应用和系统可能会使用各自的方式描述会话和媒体信息、使用不同的编解码器。因此需要一种方式/协议用于使通信双方达成多媒体会话共识,这就是#SDP(Session Description Protocol)。
从技术上讲,SDP并不是一个真正的协议,而是一种数据格式,用于描述多媒体连接内容(例如分辨率,格式,编码,加密算法等),使通信双方在数据传输时都能够理解彼此的数据。
通信双方想要了解对方支持的媒体格式,必须要交换SDP信息。而交换SDP的过程,通常称之为媒体协商。
如何与对端建立连接
理想的网络情况是每个客户端都有自己的私有公网IP,这样就可以直接进行点对点连接。实际上出于网络安全和其他原因的考虑,大多数客户端之间都是在某个局域网内,无法直连,因此有了#ICE(Interactive Connectivity Establishment)协议框架。
ICE允许你的浏览器与对端浏览器建立连接,它的工作原理如下:
- 首先通过#STUN(Session Traversal Utilities for NAT)协议找出位于#NAT(Network Address Translation)后的客户端的公网地址
- 接着通过信令服务器交换网络信息(在WebRTC中称为candidate)和SDP
- 通信双方使用候选地址进行连接测试,确定最佳的可用地址,建立连接。对于使用“对称型NAT”的路由器,还须使用#TURN)(Traversal Using Relays around NAT)服务来绕过“对称型NAT”
- 开始通信
这个过程也可以称为“网络协商”。基于ICE、STUN、TURN、NAT、SDP构建了WebRTC API。
(好多没听过的词,麻了🤯...)
MDN上有关于STUN和TURN如何工作的示意图,直接贴在这里了:
- STUN
- TURN
最后
本来想在这篇笔记中将WebRTC的用法一并整理的,哪知整理、理解这些概念就花了不少时间。但花时间理解这些概念是值得的,能便于我们记住API,能够减少开发过程中的疑问~😝