1、简介
本文定义了一个名为TURN的协议,它允许两个处于NAT环境的主机利用中继进行通讯。client能够在TURN Server上分配资源,与peer(对端)进行通讯,也能够决定何时应该停止通讯。client需要关联一个TURN Server的地址作为中继,称为relayed server address。当client发送报文给TURN Server,TURN Server使用relayed server address作为源地址向其他peer进行中继转发报文。
使用的TURN的client必须使用一些方法来获取对端peer的relayed-transport-address地址及每个peer的本机IP及端口。该方法并不在这里讨论。
虽然TURN稀有一适用于两个主机都位于NAT之后的情况,但是TURN协议的TURN Server的要求很高,server必须要有很大带宽。所以使用TURN协议的最佳情景是-----当两个主机没有直接通信路径时。当TURN与ICE一起使用时,ICE会优先去查找有无直接通信路径,如果实在找不到才会启用TURN协议。
TURN支持每个relayed-transport-address同时与多个peer(对端)通信。
2、功能一览
一般情况TURN 客户端在内网中,TURN Server在公网。TURN客户端使用TURN Server作为中继来和位于其它网络的对端通信。
上图的几个地址概念:
Server-Reflexive Address: 客户端向turn server发送消息,该消息经过NAT再发送出去,所以turn server接收到消息 后实际获得的IP地址,即是NAT的地址(一般是公网地址)。这个地址就叫做客户端的Server-Relexive地址。turn serve向客户端发送消息时,目的地址就是server-reflexive地址,当该消息达到NAT后,NAT会再将该地址转发给客户端。
Relayed_Transport_Address: 客户端使用TURN协议来创建和管理ALLOCATION。allocation是turn server端的数据结构,而Relayed_Transport_Address是该数据结构中重要的组成部分。该地址是turn server本身地址,用于客户端和对端进行消息交互。称为中转地址,客户端和对端通信消息都要拿这个地址(turn server)做中转。
当peers(对端)位于NAT之后,客户端必须使用peer的Server-Reflexive IP来做标记而不是使用peer的本地IP。拿上图例子来说。客户端给peer A发送应用数据时,客户端必须使用192.0.2.150:32102而不是192.168.100.2:49582 。
4、传输
TURN在TURN server与peers之间总是使用UDP进行数据传输,但是客户端和turn server之间可以使用UDP,TCP和TLS over tcp 三种方式.
5、Allocation
客户端使用Allocation事务来在turn server创建一个allocation结构。客户端发送一个Allocate request到服务器,然后服务器通过Allocate success响应回复客户端,在该响应中带有客户度的中继IP地址(relayed transport address)。
客户端可以在Allocate request中携带一些属性如lifetime。
如果需要安全认证则因为server中转数据包需要占用很大带宽,故server一般会要求客户端使用long-term认证。
一旦中继地址分配成功,客户端必须定期发送Refresh request来保活该地址。这个定期时间由lifetime属性规定(单位为秒),默认是600s,可修改。
流程:
抓包:
6、Permissions
TURN提供了一种绕过企业防火墙的机制,该机制就称为permissions。
一个Allocation可以有0或多个permission,每个permission由一个IP地址和lifetime组成。当turn server接收到一个来自于中继地址(relayed transport address)的UDP数据报文时,它首先会检查permission列表,如果该UDP报文的源地址IP和某个permission匹配,这个UDP报文就会被转发给客户端,否则丢弃该UDP报文。
一个permission如果不refresh,则会在5分钟后过期。
客户端可以使用CreatePermission 请求或ChannelBind 请求来安装或刷新一个permission。
一个CreatePermission请求可以用来安装或刷新多个permission,这个属性对于ICE来说非常重要。出于安全考虑,permission只能有经过安全认证的事务(transaction)来安装及刷新。
Send indications及ChannelData Message并不能安装或刷新permission。
permission保存在一个allocation结构中,因此在一个allocation中添加一个新的permission或一个permission过期并不会影响其他的allocation。
7、发送机制
在客户端和对端使用turn server进行应用数据交互时有两种发送机制可用。
第一种是send and Data方式,第二种是使用channel。这两种方式都能仅用一个中继地址(relayed transport address)使客户端和多个对端进行通信。
第一种方式:
Send indications被用于客户端向server发送应用数据,而Data indication被用于服务器向客户端发送数据。
流程:
在上图中发送的 CreatePermission请求中需要添加XOR-PEER-ADDRESS属性, 该属性的值为对端A的反射地址(server reflexive address),如果没有该地址则server不会给客户端及对端A转发数据。
数据交互:
第二种方式;
在一些使用场景如Voip(视频电话),为了节约带宽可以使用ChannelData message。该方法不使用STUN头而是使用特有的4字节的头部来包含channel number(通道号)等信息。每个在使用的通道号都已经和一个特定的对端绑定了,因此turn server就作为对端的本地地址(host transport address)的速记。
为了将通道和对端绑定,客户端需要向server发送ChannelBind 请求,请求中需要包括未绑定的通道号及对端的地址。
一旦一个通道被绑定了,客户端就可以向server发送一个ChannelData 消息,server进而将该消息发送给对端。类似的server会将来自对端的消息通过ChannelData消息发送给客户端。
通道绑定的默认有效期是10分钟,到期之前可以通过另外一个ChannelBind 请求来重新绑定。
抓包:
8、RTP 支持
TURN包含一些特定的的对RTP的支持。
旧版本的RTP协议(RFC3550)要求一个奇数的rtp端口和一个rtcp端口(rtp端口号+1)。为了客户端和对端能用就版本的RTP协议交互,TURN支持客户端向server请求一个带有一个奇数端口及一个(奇数端口+1)的端口的中继地址(relayed transport address),并且可以要求server在接下来的allocation请求中不使用此次(奇数端口+1)的端口(也可以不要求)。
具体怎么请求文档没说。