实现1V1音视频实时互动直播系统 十二、第一节 STUN_TURN服务器搭建

时间:2024-04-04 21:15:11

今天我们来进行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下通过源码进行编译安装的一个基本过程

实现1V1音视频实时互动直播系统 十二、第一节 STUN_TURN服务器搭建

实现1V1音视频实时互动直播系统 十二、第一节 STUN_TURN服务器搭建

我们看到这个时候Makefile已经生成了

我们看一下

ls -alt Makefile

实现1V1音视频实时互动直播系统 十二、第一节 STUN_TURN服务器搭建

我们输入命令进行编译

make -j 8 

-j 表示你可以用多线程同时并行的编辑,根据你内核的多少,一般采取核数乘2的方式,比如双核就是2,四核就是8

编译完了之后我们需要输入make命令进行安装

sudo make install

如何安装好了之后,我们就可以看到 /usr/local/下面有个coturn

cd /usr/local/coturn/

实现1V1音视频实时互动直播系统 十二、第一节 STUN_TURN服务器搭建

我们在这里可以看到安装后的文件都在这里了,其中bin下面是一些可执行的程序

实现1V1音视频实时互动直播系统 十二、第一节 STUN_TURN服务器搭建

turnadmin 表示管理

turnserver 表示TURN服务

turnutils_stunclient 表示STUN的客户端

turnutils_peer 表示一些工具

turnutils_natdiscovery 表示NAT发现

turnutils_uclient 表示TURN的一个客户端 

coturn的一些配置是放在coturn/etc下面

实现1V1音视频实时互动直播系统 十二、第一节 STUN_TURN服务器搭建

turnserver.conf 是一些配置文件

还有一些头文件在include里面

实现1V1音视频实时互动直播系统 十二、第一节 STUN_TURN服务器搭建

还有一些库文件

实现1V1音视频实时互动直播系统 十二、第一节 STUN_TURN服务器搭建

还有一些手册man

实现1V1音视频实时互动直播系统 十二、第一节 STUN_TURN服务器搭建

还有一些配置的例子

实现1V1音视频实时互动直播系统 十二、第一节 STUN_TURN服务器搭建

实现1V1音视频实时互动直播系统 十二、第一节 STUN_TURN服务器搭建

包括turnserver.conf和TURN的证书和key

还有一些文档,大家可以自己看

实现1V1音视频实时互动直播系统 十二、第一节 STUN_TURN服务器搭建

下面我们来看一下配置

对于TURN服务来说,它有很多的配置项,最关键的其实就这四项

实现1V1音视频实时互动直播系统 十二、第一节 STUN_TURN服务器搭建

1、默认的侦听端口都是3478,

2、如果在是云服务器上要指定外网的IP地址,

3、还有就是用户名和密码,以冒号隔开,还有第二种方式就是通过restful接口,这个我们以后再介绍,现在我们没那么复杂,用一个用户名和密码就就可以了,

4、最后一个是非常关键的,就是域名,这个一定要设置

它还有很多的配置项,包括不使用普通的用户名和密码格式,都是可以设置的。但是现在这个最简单的配置我们用肯定是没问题的。我们这里是实验种,但是如果要商业化使用的话,还要单独的考虑。

实现1V1音视频实时互动直播系统 十二、第一节 STUN_TURN服务器搭建

实现1V1音视频实时互动直播系统 十二、第一节 STUN_TURN服务器搭建

 

实现1V1音视频实时互动直播系统 十二、第一节 STUN_TURN服务器搭建

实现1V1音视频实时互动直播系统 十二、第一节 STUN_TURN服务器搭建

实现1V1音视频实时互动直播系统 十二、第一节 STUN_TURN服务器搭建

实现1V1音视频实时互动直播系统 十二、第一节 STUN_TURN服务器搭建

实现1V1音视频实时互动直播系统 十二、第一节 STUN_TURN服务器搭建

我们就设置这四项,其他的我们都不用设置

实现1V1音视频实时互动直播系统 十二、第一节 STUN_TURN服务器搭建

有了这四项之后我们就可以将这个服务起来了,服务起来我们就可以通过这个测试的页面,

实现1V1音视频实时互动直播系统 十二、第一节 STUN_TURN服务器搭建

上节我们讲到SDP里面也有IP地址和端口,但是那个IP地址和端口对WebRTC来说是忽略掉的,就是写不写都无所谓,最终用的IP地址就是candidate的IP地址和端口,也就是说ICE里面收集的IP地址和端口

下面我们就来看一下,那有了这个配置之后,我们就可以把这个TURN服务启动起来了,所以启动TURN服务也比较简单

我先在环境变量里面加一个路径

实现1V1音视频实时互动直播系统 十二、第一节 STUN_TURN服务器搭建

这里我是把它加到path里了,这样我就可以直接执行coturn,它就能在这个usr/local/coturn/bin这个路径下找到这个命令

实现1V1音视频实时互动直播系统 十二、第一节 STUN_TURN服务器搭建turnserver -c ./etc/turnserver.conf

实现1V1音视频实时互动直播系统 十二、第一节 STUN_TURN服务器搭建

如果你没有加的话,你就不能直接写这个turnserver,你应该写./bin/turnserver -c,我们检测一些启动起来没有

grep --color=auto  turn

实现1V1音视频实时互动直播系统 十二、第一节 STUN_TURN服务器搭建

我们这里看到这个TURN服务就启动起来了,TURN启动之后我们就来看一下

访问:https://webrtc.github.io/samples/

访问:

实现1V1音视频实时互动直播系统 十二、第一节 STUN_TURN服务器搭建

在这里我们实际已经加入了我的这个地址

实现1V1音视频实时互动直播系统 十二、第一节 STUN_TURN服务器搭建

下面我们点击一些Gather candidates按钮,这里可以选择的ICE类型有两种,all表示对所有的candidate都收集,relay表示只收集relay

实现1V1音视频实时互动直播系统 十二、第一节 STUN_TURN服务器搭建

如果是全部都收集

实现1V1音视频实时互动直播系统 十二、第一节 STUN_TURN服务器搭建

显然这是一个对称型的NAT,它的端口号已经变了是16215和16216,如果两个端口是一摸一样的显然就是非对称型,现在来看两个就是对称型的,虽然IP地址是相同的,但是端口已经变了,从这里我们可以看出relay的级别是最低的,host是最高的,就是9这个端口来说它的优先级比较低,

如果我们设置了筛选relay,那么之前的host都没有了

实现1V1音视频实时互动直播系统 十二、第一节 STUN_TURN服务器搭建

它的Time用时显然是第一个最少,用时0.076秒,显然第二个relay的时间就会很长,所以在选择的时候第一个优先级最高的,后面 是优先级低的。

通过上面的讲解我们就将STUN和TURN的搭建介绍完了。