WebRTC | 入职第一周,差点把服务器搞崩!

入职第一周,就进行了一次产品大的版本迭代。上线当天,我在公司阿里云服务器尝试部署某个服务的时候,被运维通知内存飙升到了 80%,险些把服务器搞挂。

此事还是要从为了要解决一个技术问题说起。 当天,leader 给我手头分配了一个有关视频通信技术问题。视频通信用的是 WebRTC(网页即时通信)。考虑到有些读者未接触过的,就给大伙简单介绍一下~

1、什么是WebRTC?

WebRTC,英文名叫这个东东 Web Real-Time Communication。翻译过来叫「网页即时通信」。简单来讲就是一个支持浏览器进行实时视频对话的技术,视频编码/解码、数据传输、摄像头调用等功能内部已经帮你封装好了,它提供了一系列的 API 供开发者直接调用,从而在浏览器中完成音视频通信。

小鹿注:再说明白点,你想在浏览器中实现面对面的视频聊天,这个技术可以帮你实现。当然市面上还有其他的一些技术,比如HLS、RTMP,这三种技术各有使用场景,这里不多啰嗦。

WebRTC 其实使用起来很简单,只要让两个用户主机相互拿到对方的IP 地址建立 WebSocket 通信,就能实现了视频通信了。

图片

但是实际实现起来还是遇到了一些棘手的问题点。

问题一 两个 WebRTC 客户端是基于 P2P 建立连接传输数据的。那么在两者连接之前,是如何知道对方的 IP 的?

小鹿注: P2P 概念相信大伙儿并不陌生,当年很火的 BT(电驴) 下载就是基于 P2P 进行传输的,下载人数越多,下载速度越快。

P2P 有不同的分类,纯 P2P、杂P2P、混合 P2P。纯 P2P 连接就是可以让两个客户端直接建立通信,不需要中心服务器的转发。

杂 P2P 就是有一个中心服务器作为两个客户端的信息交换,但是不保存任何信息。其实就是一个传话的。

其实问题解决方案上方已经出来了,在网络中的两个客户端想要知道对方的 IP 地址建立通信,首先中间需要一个服务器来传话(交换双方的信息),我们也称它为「信令服务器」。

图片

问题二: 同一局域网的主机可以知道自己的 IP 地址,然后通过信令服务器进行交换。但是不同局域网的主机如何知道自己的在公网中 IP 地址呢,从而进行交换呢?

小鹿注: 当时小鹿遇到这个问题还是由于自己网络原理不扎实造成的,惭愧惭愧~ 解决了这个问题之后,才知道有 NAT 这个技术。

2、什么是 NAT?

NAT 叫网络地址转换,英文名字叫这个东东 Network Address Translation。这个东西用来干啥的,还要从 IPv4 的地址分配谈起。

IP 地址只有 32 位,最多能够分配 42.9 亿台主机,去掉一些特殊的地址,也就剩下大约 36 亿左右,如果全球的主机超过了 36 亿,我们该怎么办呢?

很简单,有 IPv6 呢,但是当下比较流行的还是 IPv4 我们如何解决地址少,主机多的问题?

那么 NAT 技术就派上用场了。首先,我们知道私网和公网的区别,私网就是我们所在的局域网给我们分配的 IP 地址,这个地址在公共的互联网上不能直接访问。公网 IP 呢,是我们在公共互联网上可以直接访问的地址,比如百度的 IP 地址。

有个私网之后,我们就不用给局域网内(私网)的主机分配一个公网 IP 了,这样可以节省很多宝贵的公网 IP。

但是两个不同局域网中的主机想要进行通信,是必须有一个公网 IP 的,但是一个局域网内只有一个公网 IP 哪该怎么办?

该图来源于网络

NAT 就是用来解决这个问题的。NAT 就是将私有的 IP 地址转换为外网的 IP 地址,然后再去访问公共互联网上的信息。NAT会维护一个私对公的映射表。当外部数据返回的时候,路由查看这个映射表,找到局域网中相对应的主机。

3、NAT 的分类?

NAT 分为静态 NAT、动态 NAT以及PAT。最常用的就是 PAT,叫做端口地址复用。顾名思义,它提供一个一对多的方式(也就是一个公网 IP 对应多个私网 IP 地址,是通过不同的端口号来区分的)

图片

我们了解的 NAT 之后,我们回到问题二上来。不同局域网的两台主机想要建立通信,必须知道双方在公网 IP 的地址是多少才能建立。

小鹿注: 首先,通信的两台主机需要知道自己在公网上的 IP 地址是多少,然后才能通过信令服务器交换各自 IP 地址才能建立通信。

那么有没有这样一种服务器专门返回在局域网中的主机的公网 IP 地址呢?

有,我们通常称它为「穿透服务器」(ICE Server),俗称打洞服务器。

图片

小鹿注: 我总结的简单一句话,就是突破局域网的限制,能够知道自己在公网中的 IP 地址是多少,从而能够与外界进行通信。

实现打洞有两种协议,分别为 STUN 协议和 TURN 协议。两种协议的原理基本差不多,都是通过修改应用层中的私网地址达到 NAT 穿透。

我自己是使用 TURN 方式,这个可以直接使用开源项目 coturn 部署到阿里云服务器。

4、WebRTC 实现原理。

我们将上方的信息整合一下,整个 WebRTC 的通信过程我画了一张图来描述如下。

图片

首先,两台远程的客户端主机首先去 TURN 服务器请求自己的在公网中的 IP 地址,然后通过信令服务器完成信息的交换,然后两个客户端通过 WebSocket  连接可以实现视频通话了。

5、彩蛋

回到文章开头的差点把服务器搞崩的事情,是因为我在阿里云部署 TURN 服务的时候,尝试运行各种命令启动起来,但是本地测试一直没有请求到,其实这时候服务已经启动了。

但是我一直以为服务没有启动,所以一直不断的使用命令尝试启动服务,导致重复启动了多次服务,内存飙升,直到最后成功测试连接成功,才停止了我一系列的启动操作,这才没有让服务器完全崩溃。

当天是上线,现在想想都后怕,就当给自己长个记性吧。

加油~ : )


我是小鹿,一个三本混出来的程序员,一直觉得能把复杂的东西讲明白是一件很牛逼的事情。

猜你喜欢

转载自juejin.im/post/7126410234993573924