文章目录
WebRTC源码研究(27)TURN协议
前面的章节中有讲到STUN
协议,P2P打洞原理,其实在P2P打洞这个章节中有讲解到TURN
协议,就是我们在NAT类型的四种类型中,对称性NAT我们是无法穿透的,在我们P2P 用常规的方式无法穿透时,我们才借助于STUN 转发,这样的代价是很大的。
由于STUN/RFC5389协议里能处理的也只有市面上大多数的Cone NAT(关于NAT类型可以参照P2P通信原理与实现),
对于对称性 NAT,传统的P2P打洞方法是不适用的。因此为了保证通信能够建立,我们可以在没办法的情况下用保证成功的中继方法(Relaying),虽然使用中继会对服务器负担加重,而且也算不上P2P,但是至少保证了最坏情况下信道的通畅,从而不至于受NAT类型的限制。TURN/RFC5766就是为此目的而进行的拓展。
本篇主要详细讲解TURN
协议,具体更多细节可以参考官方文档:TURN/RFC5766 下载相关pdf细细品阅。
关于TURN Server有很多现成的开源代码,你可以从这里下载一个研究研究:TURN Server
1. TURN协议简介
TURN
协议允许NAT
或者防火墙后面的对象可以通过TCP
或者UDP
接收到数据。这在使用了对称式的NAT(或者防火墙)
的网络中尤其具有实用价值 。
TURN
方式解决NAT
问题的思路与STUN
相似,是基于私网接入用户通过某种机制预先得到其私有地址对应在公网的地址(STUN方式得到的地址为出口NAT上的地址,TURN方式得到地址为TURNServer上的地址
),然后在报文负载中所描述的地址信息直接填写该公网地址的方式,实际应用原理也是一样的。
TURN
的全称为Traversal Using Relay NAT
,即通过Relay方式穿越NAT,TURN
应用模型通过分配TURNServer
的地址和端口作为客户端对外的接受地址和端口,即私网用户发出的报文都要经过TURNServer
进行Relay转发,这种方式应用模型除了具有STUN
方式的优点外,还解决了STUN
应用无法穿透对称NAT(SymmetricNAT)以及类似的Firewall设备的缺陷,即无论企业网/驻地网出口为哪种类型的NAT/FW,都可以实现NAT的穿透,同时TURN
支持基于TCP
的应用,如H323
协议。此外TURNServer
控制分配地址和端口,能分配RTP/RTCP
地址对(RTCP
端口号为RTP
端口号加1)作为本端客户的接受地址,避免了STUN
应用模型下出口NAT
对RTP/RTCP
地址端口号的任意分配,使得客户端无法收到对端发过来的RTCP
报文(对端发RTCP
报文时,目的端口号缺省按RTP
端口号加1发送)
TURN
的局限性在于所有报文都必须经过TURNServer
转发,增大了包的延迟和丢包的可能性。
2. TURN 客户端,服务器处理流程
我在前面的博客“[WebRTC源码研究(25)NAT打洞原理]” 中有讲解到TURN 相关的流程,这里再详细讲解一下,更多细节可以参考官方文档:TURN/RFC5766
在典型的情况下,TURN
客户端连接到内网中,并且通过一个或者多个NAT
到达公网,TURN服务器
架设在公网中,不同的客户端以TURN服务器
为中继和其他peer进行通信,如下图所示:
Peer A
Server-Reflexive +---------+
Transport Address | |
192.0.2.150:32102 | |
| /| |
TURN | / ^| Peer A |
Client’s Server | / || |
Host Transport Transport | // || |
Address Address | // |+---------+
10.1.1.2:49721 192.0.2.15:3478 |+-+ // Peer A
| | ||N| / Host Transport
| +-+ | ||A|/ Address
| | | | v|T| 192.168.100.2:49582
| | | | /+-+
+---------+| | | |+---------+ / +---------+
| || |N| || | // | |
| TURN |v | | v| TURN |/ | |
| Client |----|A|----------| Server |------------------| Peer B |
| | | |^ | |^ ^| |
| | |T|| | ||