做者:廖俊,声网Agora 资深工程师。后端
本文主要为初步接触 WebRTC 的开发者介绍 WebRTC turnserver 的原理机制,以及 Agora 在此方面的部分经验。如遇到疑问,能够点击这里,与做者直接交流。服务器
TURN的全称为Traversal Using Relays around NAT,是STUN/RFC5389的一个拓展,主要添加了Relay功能。如图一所示,TURN协议是创建在UDP协议之上的一个应用层协议。若是一台主机处于NAT后面,那么在必定条件下(NAT穿透失败)两台主机没法之间进行通信。在这种条件下,那么使用中继服务提供通信是有必要的。TURN协议容许一台主机使用中继服务与对端进行报文传输。TURN协议也是ICE(交互式链接创建)协议的组成部分,也能够单独使用。若是TURN使用于ICE协议中,relay地址会做为一个候选,由ICE在多个候选中进行评估,选取最合适的通信地址。通常来讲中继的优先级都是最低的。代理
TURN和其余中继协议的不一样之处在于,它容许客户端使用同一个中继地址(relay address)与多个不一样的peer进行通讯。如图二所示。cdn
Turn协议的工做原理主要有三个阶段,也称三大机制。分配(Allocation),转发(Relay)和信道(Channel)。视频
客户端想要使用中继功能,须要在中继服务器上申请一个中继地址。客户端发送分配请求(Allocate request)到服务器,服务器为用户开启一个relay端口而后返回分配成功响应,并包含了分配的地址。server
a) 客户端A向STUN Port发送Allocate请求(图中绿色部分)。blog
b) STUN服务器接收到客户端A的Allocate请求,服务器一看是Allocate请求,则根据relay端口分配策略为A分配一个端口。ip
c) 服务器发送response成功响应。在该response中包含XOR-RELAYED-ADDRESS属性。该属性值就是A的relay端口。开发
d) 客户端接收到response后,就知道了本身的relay地址。该relay地址是个公网地址,能够看做是客户端A在公网上的一个代理,任何想要联系A的客户端,只要将数据发送到A的relay地址就能够了。部署
任何想要联系客户端A的人,只要知道客户端A的relay地址就能够了。
client和peer之间有两种方法经过中继服务器交换数据。第一种是使用relay,第二种使用channel。两种方法都经过某种方式告知服务器哪一个peer应该接收数据,以及服务器告知client数据来自哪一个peer。
Relay Mechanism使用了Send和Data指令(Indication)。其中Send指令用来把数据从client发送到server,而Data指令用来把数据从server发送到client。
如上图所示是B主动给A发消息:“Hello”,A回应“Hi”的过程。
a) 序号一、二、三、四、5为B的发送请求(蓝色箭头方向);
b) 序号六、七、八、九、10为A的回应,原路返回(绿色箭头方向)。
c) 一、2阶段时,发送的是裸的UDP数据。
d) 第3阶段是:从A的relay端口收到数据,添加STUN头后,最后从STUN Port 发出的过程。
e) 在四、5过程当中,是被STUN协议包装过的“Hello”,称之为Data indication。为了可以让客户端A知道这个包是哪一个客户端发来的,因此,STUN 协议对“Hello”进行了从新的包装,最主要的就是添加了一个XOR-PEER-ADDRESS属性。
f) 六、7阶段为被STUN协议包装过的“Hi”,称之为Send indication。为了可以让A的relay port知道最终发往哪一个客户端,所以也为“Hi”添加了STUN头,也是添加了XOR-PEER-ADDRESS属性。
g) 第8阶段是:从STUN Port 接收到带STUN 头的数据,去掉STUN头,最后从A的relay端口发出的过程。
h) 九、10是裸的UDP数据。
对于一些应用程序,好比VOIP,在Send/Data Indication中多加的36字节格式信息会加剧客户端和服务端之间的带宽压力。为改善这种状况,TURN提供了第二种方法来让client和peer交互数据.该方法使用另外一种数据包格式,即ChannelData message,信道数据报文。
ChannelData message不使用STUN头部,而使用一个4字节的头部,包含了一个称之为信道号的值(channel number),每个使用中的信道号都与一个特定的peer绑定,即做为对等端地址的一个记号。
要将一个信道与对等端绑定,客户端首先发送一个信道绑定请求(ChannelBind Request)到服务器,而且指定一个未绑定的信道号以及对等端的地址信息。
如图五所示,中继服务器将数据封装成channel message发送给peer。对比图四,其实就是讲4/5/6/7的indication换成channel message。
在音视频的传输应用中,使用信道机制会大大减小包头长度,节省带宽占用,提升传输效率。
部分政府、企业客户会部署有防火墙将办公环境与外网隔离开来,并且其防火墙一般会有很严格的ip和port限制,因此点对点传输基本没法进行。此时,Turn协议就是一个很好的选择。Turnserver具备固定的公网ip,固定的端口,只需在防火墙上开通其白名单,就能够搭建通讯信道。
Agora在Web端提供了很好的解决方案:WebProxy。
如图六所示,WebProxy包含信令和数据两个中继服务器,Turnserver主要负责音视频数据的传输。Turnserver为用户开放一个TCP和一个UDP的端口,用户经过这两个端口建立中继地址,后端服务经过中继地址和内网的用户进行数据传输。
TURN协议在实时音视频中是一个比较重要的协议,能很好的保证明时音视频传输中链接的可用性,稳定性和高效性。可是TURN协议对服务器有很高的依赖,服务器在带宽和集群上有很大的压力,因此TURN协议一般是看成ICE协议中的一部分来使用。