neteaseim 2019-06-27
《聊聊 WebRTC 网关服务器》系列文章系由 WebRTCon2018 中网易云信音视频技术专家的分享内容《从零开始构建音视频网关服务器》整理而成,该系列文章将和大家分享网易 NRTC 在 WebRTC 网关项目的自研过程中遇到的一些问题,以及我们最终的解决方法。《聊聊 WebRTC 网关服务器》第一篇文章将和大家分享如何选择服务端的端口方案。
在讨论如何选择服务器端的端口方案前,我们先来看看标准 WebRTC 的连接建立流程,这为我们理解这篇文章后续内容提供最基础的知识。
这里描述的是 Trickle ICE 过程,并且省略了通话发起与接受的信令部分。流程如下:
在了解了标准 WebRTC 的建连流程以后,我们来看看 WebRTC 客户端如何与网关建连。
首先,我们网关的 Media Server 拥有公网 IP,因此 Server 就不需要通过 Stun Server 收集自身的公网 IP。WebRTC 客户端先与网关 Signal Server 协商 SDP,包括 ICE Candidate,Media Server 分配 IP 和端口作为网关的 ice candidate 发送给客户端。因为网关是公网 IP,所以客户端向这个 IP 发送 STUN Binding Request 会被服务器收到, 并回复 Response。接着客户端与网关媒体服务器进行 DTLS 握手与秘钥协商,在此基础上进一步进行 SRTP 的音视频通信。至此,WebRTC 客户端与网关服务器建连成功。
好的,现在我们已经具备了探讨服务器端端口选择的基础知识,接下来我们来看看具体有哪些方案。
最简的服务器端端口方案是我们可以为每个客户端分配一个端口,服务器上使用这个端口区分每个用户,就像图里描述的 A、B、C、D 四个人在 WebRTC 网关服务器上分别对应 UDP 端口 10001~1004。这种方案逻辑上很简单,很多开源的服务器都采用这个方案,如 janus。另外一个原因是使用了 libnice 库在服务器上来和客户端做 ice 建连,类似的做法都是采用多端口的架构。
那么多端口有什么不足呢?
为了解决这个问题,我们需要使用一些小技巧。首先,有几个基础知识点我们先了解一下。如下图:
有了上面的背景知识,聪明的你们肯定已经大致有一个方案了。我们来看看实现细节是怎么样的:
在分享完服务端端口选择的方案后,大家都知道 WebRTC 客户端使用 PeerConnection 来表示不同的媒体连接,这对于 WebRTC 来说是基础也是核心,在《聊聊 WebRTC 网关服务器》第二篇文章将继续为大家介绍如何选择 PeerConnection 的方案。
随着音频处理和压缩技术的不断发展,效果更好、适用范围更广、性能更高的算法和新的技术必将不断涌现,如果你有好的技术或者分享,欢迎关注网易 MC 官方博客以及微信公众号:**
关注更多技术干货内容:网易云信博客
欢迎关注网易云信 GitHub
欢迎关注网易云信官网官网微信公众号:
部署WebRTC 或 SIP p2p 方案时经常会遇到p2p 无法穿透的环境,这时就是TunServer 的用武之地了。添加完成后,就可以在webrtc 里面使用stun 和tun server 了。