WebRTC音视频开发:React+Flutter+Go实战
上QQ阅读APP看书,第一时间看更新

2.3 网络协商

通信双方彼此要了解对方的网络情况,这样才有可能找到一条通信链路。需要做以下两个处理。

·获取外网IP地址映射。

·通过信令服务器(signal server)交换“网络信息”。

理想的网络情况是每个浏览器所在的计算机IP都是公网IP,可以直接进行点对点连接,如图2-4所示。

图2-4 理想网络情况

实际情况是我们的计算机都是在某个局域网中并且有防火墙,需要进行网络地址转换(Network Address Translation,NAT),如图2-5所示。

图2-5 NAT防火墙图

在解决WebRTC使用过程中的上述问题时,我们需要用到NAT、STUN和TURN等概念,下面分别介绍。

1.NAT

简单来说,NAT是为了解决IPv4下的IP地址匮乏而出现的一种技术。

例如,通常我们处在一个路由器之下,而路由器分配给我们的地址通常为192.168.1.1、192.168.1.2,如果有n个设备,可能分配到192.168.1.n,而这个IP地址显然只是一个内网的IP地址,这样一个路由器的公网地址对应了n个内网的地址,这种使用少量的公有IP地址代表较多的私有IP地址的方式,将有助于减缓IP地址空间的枯竭,如图2-6所示。

图2-6 NAT示意图

NAT技术会保护内网地址的安全性,所以这就会引发一个问题,就是当我们采用P2P中的连接方式时,NAT会阻止外网地址的访问,这时我们就得采用NAT穿透技术了。

于是我们有了如下的思路:借助一个公网IP服务器,Peer-A与Peer-B都往公网IP/PORT发包,公网服务器就可以获知Peer-A与Peer-B的IP/PORT,又由于Peer-A与Peer-B主动给公网IP服务器发包,所以公网服务器可以穿透NAT-A与NAT-B并发送包给Peer-A与Peer-B。所以只要公网IP将Peer-B的IP/PORT发给Peer-A,将Peer-A的IP/PORT发给Peer-B,这样下次Peer-A与Peer-B互相发送消息时,就不会被NAT阻拦了。

WebRTC的防火墙穿透技术就是基于上述思路来实现的。在WebRTC中采用ICE框架来保证RTCPeerConnection能实现NAT穿透。

2.ICE

ICE(Interactive Connectivity Establishment,互动式连接建立)是一种框架,使各种NAT穿透技术(如STUN、TURN等)可以实现统一,该技术可以让客户端成功地穿透远程用户与网络之间可能存在的各类防火墙。

3.STUN

STUN是指简单UDP穿透NAT(Simple Traversal of UDP Through NAT),这项技术允许位于NAT(或多重NAT)后的客户端找出自己的公网IP地址,以及查出自己位于哪种类型的NAT及NAT所绑定的Internet端口。这些信息可用于将两个同时处于NAT路由器之后的主机之间建立UDP通信,如图2-7所示,STUN服务器能够知道Peer-A以及Peer-B的公网IP地址及端口。

图2-7 STUN服务器示意图

即使通过STUN服务器取得了公网IP位址,也不一定能建立连接。因为不同的NAT类型处理传入的UDP分组的方式是不同的,四种主要类型中有三种可以使用STUN穿透:完全圆锥型NAT、受限圆锥型NAT和端口受限圆锥型NAT。但大型公司网络中经常采用的对称型NAT(又称为双向NAT)则不能使用,这类路由器会透过NAT部署所谓的“Symmetric NAT限制”,也就是说,路由器只会接受你之前连线过的节点所建立的连线,这类网络就需要用到TURN技术。

4.TURN

TURN是指使用中继穿透NAT(Traversal Using Relays around NAT),是STUN的一个扩展(在RFC5389中定义),主要添加了中继功能。如果终端在进行NAT之后,在特定的情景下有可能使得终端无法和其他终端进行直接的通信,这时就需要将公网的服务器作为一个中继,对来往的数据进行转发。这个转发采用的协议就是TURN。

在STUN服务器的基础上,再架设几台TURN服务器。在STUN分配公网IP失败后,可以通过TURN服务器请求公网IP地址作为中继地址,将媒体数据由TURN服务器中转,如图2-8所示。

图2-8 TURN服务器示意图

当媒体数据进入TURN服务器中转,这种方式的带宽由服务器端承担。所以在架设中转服务器时要考虑硬件及带宽。

以上是WebRTC中经常用到的协议,STUN服务器和TURN服务器我们使用coturn开源项目来搭建,地址为https://github.com/coturn/coturn。也可以使用以Golang技术开发的服务器来搭建,地址为https://github.com/pion/turn

5.信令服务器

从前面的介绍中我们知道了两个客户端的协商媒体信息和网络信息,那怎么去交换?是不是需要一个中间商去做交换?所以我们需要一个信令服务器(signal server)转发彼此的媒体信息和网络信息。

我们在基于WebRTC API开发应用(App)时,可以将彼此的App连接到信令服务器,一般搭建在公网或者两端都可以访问到的局域网,借助信令服务器,就可以实现SDP(媒体信息)及Candidate(网络信息)交换。

信令服务器不只是交换SDP和Candidate,还有其他功能,比如房间管理、用户列表、用户进入、用户退出等IM功能。如图2-9所示为信令服务器工作原理示意图。

图2-9 信令服务器工作原理