今天我们来进行STUN和TURN服务的搭建,我们此前已经介绍了WebRTC信令服务器的搭建,以及介绍了端到端视频的传输,在信令服务器搭建的时候我们使用的是nodeJS+socket.io并且最终一个多人的文本聊天室来验证信令服务器的可用性,第二个通过端对端的传输我们是通过我们本机内部的一个网络传输,通过一端的PeerConnection传到另一端的PeerConnection,通过第二个PeerConnection将这个视频获取出来进行展示,下面我们在介绍完这个STUN和TURN服务之后在真实网络下不同的PC之间不同的网络设备之间可以进行一对一的直播系统。
STUN/TURN服务器选型
市面上有很多的STUN和TURN服务,一般情况下都是将这两种协议融合到一起形成一个服务器,也就是说在一个服务器里同时支持了STUN协议和TURN协议,比较知名的是rfc5766-turn-server,rfc5766-turn-server是由谷歌公司发起的,而且延续了很多年很多用户在使用,但是随着时间的推移我们发现rfc5766-turn-server还是有很多功能不全。
rfc5766-turn-server
有很多贡献者在它的基础上又做了很多修改,那就形成了现在的coTurn,coTurn就是rfc5766-turn-server的一个升级版本,它里面除了UDP的中转,还支持TCP的中继,除了IPV4之外还支持IPV6等等支持了很多的功能,现在是活跃度非常高的一个STUN和TURN服务器,那么在选型的时候也是按照两个标准 ,第一个就是它的活跃度比较高,第二个是用户量比较大,coTurn显然是我们选中的类型之一。
coTurn
ResTurn它是比较老的一直TURN服务,也有不少人在用,相对来说它与coTurn相比就会差一些。
ResTurn
所以我们最终还是选择了coTurn作为我们的STUN和TURN服务器。
coTurn服务器的搭建与部署
下载coTurn
1、首先要下载coTurn,https://github.com/coturn/coturn下载地址[https://github.com/coturn/coturn.git],
2、下载之后通过congigure生成MakeFile,
./configure --prefix=/usr/local/coturn
3、拿到MakeFile之后我们就可以编译并且安装了
编译 make && make install
这就是在Linux或Mac下通过源码进行编译安装的一个基本过程
我们看到这个时候Makefile已经生成了
我们看一下
ls -alt Makefile
我们输入命令进行编译
make -j 8
-j 表示你可以用多线程同时并行的编辑,根据你内核的多少,一般采取核数乘2的方式,比如双核就是2,四核就是8
编译完了之后我们需要输入make命令进行安装
sudo make install
如何安装好了之后,我们就可以看到 /usr/local/下面有个coturn
cd /usr/local/coturn/
我们在这里可以看到安装后的文件都在这里了,其中bin下面是一些可执行的程序
turnadmin 表示管理
turnserver 表示TURN服务
turnutils_stunclient 表示STUN的客户端
turnutils_peer 表示一些工具
turnutils_natdiscovery 表示NAT发现
turnutils_uclient 表示TURN的一个客户端
coturn的一些配置是放在coturn/etc下面
turnserver.conf 是一些配置文件
还有一些头文件在include里面
还有一些库文件
还有一些手册man
还有一些配置的例子
包括turnserver.conf和TURN的证书和key
还有一些文档,大家可以自己看
下面我们来看一下配置
对于TURN服务来说,它有很多的配置项,最关键的其实就这四项
1、默认的侦听端口都是3478,
2、如果在是云服务器上要指定外网的IP地址,
3、还有就是用户名和密码,以冒号隔开,还有第二种方式就是通过restful接口,这个我们以后再介绍,现在我们没那么复杂,用一个用户名和密码就就可以了,
4、最后一个是非常关键的,就是域名,这个一定要设置
它还有很多的配置项,包括不使用普通的用户名和密码格式,都是可以设置的。但是现在这个最简单的配置我们用肯定是没问题的。我们这里是实验种,但是如果要商业化使用的话,还要单独的考虑。
我们就设置这四项,其他的我们都不用设置
有了这四项之后我们就可以将这个服务起来了,服务起来我们就可以通过这个测试的页面,
上节我们讲到SDP里面也有IP地址和端口,但是那个IP地址和端口对WebRTC来说是忽略掉的,就是写不写都无所谓,最终用的IP地址就是candidate的IP地址和端口,也就是说ICE里面收集的IP地址和端口
下面我们就来看一下,那有了这个配置之后,我们就可以把这个TURN服务启动起来了,所以启动TURN服务也比较简单
我先在环境变量里面加一个路径
这里我是把它加到path里了,这样我就可以直接执行coturn,它就能在这个usr/local/coturn/bin这个路径下找到这个命令
turnserver -c ./etc/turnserver.conf
如果你没有加的话,你就不能直接写这个turnserver,你应该写./bin/turnserver -c,我们检测一些启动起来没有
grep --color=auto turn
我们这里看到这个TURN服务就启动起来了,TURN启动之后我们就来看一下
访问:https://webrtc.github.io/samples/
访问:
在这里我们实际已经加入了我的这个地址
下面我们点击一些Gather candidates按钮,这里可以选择的ICE类型有两种,all表示对所有的candidate都收集,relay表示只收集relay
如果是全部都收集
显然这是一个对称型的NAT,它的端口号已经变了是16215和16216,如果两个端口是一摸一样的显然就是非对称型,现在来看两个就是对称型的,虽然IP地址是相同的,但是端口已经变了,从这里我们可以看出relay的级别是最低的,host是最高的,就是9这个端口来说它的优先级比较低,
如果我们设置了筛选relay,那么之前的host都没有了
它的Time用时显然是第一个最少,用时0.076秒,显然第二个relay的时间就会很长,所以在选择的时候第一个优先级最高的,后面 是优先级低的。
通过上面的讲解我们就将STUN和TURN的搭建介绍完了。