目录
[3. TURN服务器](#3. TURN服务器)
[1. 信令传输协议的选择](#1. 信令传输协议的选择)
[2. 信令服务器的实现方案](#2. 信令服务器的实现方案)
[3. 信令服务器的业务逻辑](#3. 信令服务器的业务逻辑)
信令服务器的作用主要有两个:一是实现业务层的管理,如用户创建房间,加入房间,退出房间等;二是让通信的双方彼此交换信息,其中最常见的是交换通信双方的外网IP地址和端口。
一、相关术语
1.NAT
Network Address Translation,网络地址转换。"NAT环境"通常指网络地址转换(Network Address Translation)环境。在计算机网络中,NAT是一种网络协议,用于将一个或多个内部网络的IP地址转换为另一个或多个外部网络的IP地址,以实现网络通信。NAT环境常用于家庭网络、企业网络和互联网服务提供商(ISP)等场景中,以提供更好的网络连接和资源共享。通过NAT,多个设备可以共享同一个公共IP地址,从而节省IP地址资源,并增强网络安全性。
2.STUN服务器
Session Traversal Utilities for NAT,NAT会话穿越实用工具协议。STUN服务器用于帮助设备发现自己在NAT后面的公共IP地址和端口。当设备处于NAT环境中时,它的私有IP地址无法直接被其他设备访问。STUN服务器充当一个中间人,设备可以向STUN服务器发送请求,以获取自己的公共IP地址和端口。设备可以使用这些信息来建立直接的点对点连接,从而避免通过中继服务器进行通信。
3. TURN服务器
Traversal Using Relay NAT,通过中继方式穿越NAT。TURN服务器用于在NAT环境下进行中继通信。当设备无法直接建立点对点连接时,它们可以通过TURN服务器进行通信。设备将数据发送到TURN服务器,然后由服务器转发给目标设备。TURN服务器在中继通信中起到一个中间人的作用,帮助设备进行数据的中转。TURN服务器通常会分配一个临时的公共IP地址和端口给设备,以便进行通信。中继通信会增加一些延迟和带宽消耗,因此在实时通信中,尽量避免使用中继,而是优先选择直接的点对点连接。
4.打洞
打洞通常是指在NAT环境下,通过一些技术手段实现内网设备与外网设备之间的直接通信。
NAT(网络地址转换)的类型中,打洞是指在内网和外网之间建立直接通信的一种技术。打洞可以是内网对外网访问时打洞,也可以是内网中的设备互相打洞。打洞通常用于解决NAT环境下的双向通信问题,而外网对内网的访问是单向的,只需要将请求转发到内网设备即可,不需要打洞操作。(即:在外网对内网进行访问时,并不涉及打洞的概念。)
二、WebRTC一对一架构
WebRTC由四部分组成,分别为两个WebRTC终端、一个信令服务器、一台中继服务器(STUN/TURN)和两个NAT,这是最经典的一对一通信架构。其中,信令服务器与中继服务器都在NAT外,也就是属于外网。而两个WebRTC终端在NAT内,属于内网。
两个WebRTC终端通信步骤:
- 首先两个终端在通信之前,都要先与信令服务器连接,即步骤1。与服务端建立好连接后,通信的双方就可以通过信令服务器彼此交换必要的信息了,比如告诉对方自己的外网IP地址和端口是多少等。
- 不过在交换信息之前,WebRTC终端还要与STUN/TURN服务器建立连接。这样做的目的是通过STUN/TURN服务器获得各自的外网IP地址和端口,即步骤2。
- WebRTC终端拿到自己的外网IP地址和端口后,再通过信令服务器交换给对方。当彼此获得对方地址后,它们就可以尝试NAT穿越,进行P2P连接了,即步骤3。
三、信令
要实现一对一通信,驱动系统运转的核心就是信令,如创建房间、退出房间等都会用到信令。信令控制着系统各模块之间的前后调用关系。比如当收到用户成功加入房间的信令后,系统需要立即将RTCPeerConnection对象创建好,以便向STUN/TURN服务器请求其外网的IP地址和端口;而当收到另一个用户加入房间的消息时,系统需要将自己的外网IP地址和端口交换给对方,从而建立起socket连接,等等。
1. 信令传输协议的选择
我们一般选择TCP或基于TCP的HTTP/HTTPS、WS/WSS等协议作为信令服务器的传输协议。这样做有两点好处:一是不用担心信令丢失,因为TCP是可靠的传输协议,能保证传输的数据可靠、有序到达;二是在TCP上传输的数据是流式的,因此不必担心传输的数据过大导致拆包传输的问题。
注意:WebRTC在信令控制方面采用了可靠的TCP,但是音视频数据传输上,使用了UDP作为传输层协议(传输快、低延时)。
2. 信令服务器的实现方案
方案一:使用C/C++、Java等语言从零开始开发一个信令服务器。这种方案的实现成本非常高,要写很多代码,还要对编写的代码进行大量的测试。使用这种方案,即使开发一个最简单的HTTPS服务器,至少也要花两周以上的时间。
方案二:利用现成的Web服务器做应用开发,如以Apache、Nginx、NodeJS为服务,在其上做应用开发是非常不错的选择。
建议采用第二种方案,它有以下几方面优势:
- 一般信令系统都需要使用HTTP/HTTPS、WS/WSS等传输协议,而Apache、Ng inx、NodeJS等服务器显然在这方面有天然的优势。
- 实时通信的信令服务器一般负载都不是特别高。举个例子,假设有10000个房间同时在线,我们可以评估出大部分房间只需要处理几个信令,那么总的消息量也不过是几万个,这个量级对于Nginx和NodeJS来说,单台服务器就可以应付了。
- 通过Nginx或NodeJS实现信令服务器特别简单,只要几行代码就可以实现。
- 稳定性高。像Apache、Nginx、NodeJS这类服务器都经过了长时间的验证,所以它们的稳定性是可以得到保障的。
在第二种方案中,尤其推荐使用Node.js来实现信令服务器。虽然NodeJS在性能上不如Nginx,但对于我们这种学习项目来说使用它已经足够了,而且它使用起来也特别简单,还有非常好的生态链,很多逻辑关系不需要我们自己写,大大减少了开发信令服务器的工作量。
3. 信令服务器的业务逻辑
当两个用户要进行通信时,他们首先要创建一个房间,成功加入房间之后,双方才能交换必要的信息,如Ofer/Answer、Candidate等。当通信的双方结束通话后,用户需要发送离开房间的消息给信令服务器,此时信令服务器需要将房间内的所有人清除;如果房间里已经没有人了,还需要将空房间销毁掉。