Featured image of post turn协议要点纪要

turn协议要点纪要

turn协议介绍

当主机ip在NAT后面,某些情况下,它不可能直接和其他的主机通信,此时就需要一个中继服务来连接两个节点。

turn协议提供了这样的功能,虽然可以单独使用,但是它常常作为ICE的一部分。

最新的协议地址:RFC 8656, 过时的协议:RFC 6156

turn协议要点

传输协议

TURN client to TURN server TURN server to peer
UDP UDP
TCP UDP
TLS-over-TCP UDP
DTLS-over-UDP UDP

因为turn server和其他的peer使用udp通信,所以推荐turn clientturn server也用udp方式, 除非有其他原因,比如:防火墙拦截udp等。

Allocations

客户端发送请求到服务端获取到中继地址之后,客户端要保持此地址活跃,默认的生命周期是10分钟, 客户端要在此时间内刷新请求,如果不想使用了,就发送生命周期为0的请求。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
TURN                                 TURN          Peer         Peer
client                               server         A            B
  |-- Allocate request --------------->|            |            |
  |   (invalid or missing credentials) |            |            |
  |                                    |            |            |
  |<--------------- Allocate failure --|            |            |
  |              (401 Unauthenticated) |            |            |
  |                                    |            |            |
  |-- Allocate request --------------->|            |            |
  |               (valid credentials)  |            |            |
  |                                    |            |            |
  |<---------- Allocate success resp --|            |            |
  |            (192.0.2.15:50000)      |            |            |
  //                                   //           //           //
  |                                    |            |            |
  |-- Refresh request ---------------->|            |            |
  |                                    |            |            |
  |<----------- Refresh success resp --|            |            |
  |                                    |            |            |

URI Scheme

  1. turns必须是TLS-over-TCPorDTLS-over-UDP,端口默认: 5349
  2. turn必须是UDPorTCP,hostturn serverip。 端口默认:3478

turnstun的扩展,所有的turn消息除了ChannelData之外,都是stun格式的消息。

权限

turn server存在权限列表,包括ip和分配的过期时间, 如果有权限,所有的peer可以使用该ip来发送数据到client

客户端可以通过CreatePermissionorCHannelBind请求来申请或者刷新给定ip的服务端权限。 权限的生命周期为:5分钟。当udp数据到达turn server时,会检查数据的src ip是否在权限列表中,port不检查。 如果不匹配,udp数据丢弃。

CreatePermission

这个请求必须包括:XOR-PEER-ADDRESS(需要赋权限的ip),此字段可以有多个,但是ip不能重复。

Channel bindings

Channel bindings和一个allocation绑定,如果某个allocation过期,那么Channel bindings也一起失效。

一个channel binding包括:

  1. channel number
  2. transport address
  3. 过期时间

一个channel bindingchannel number或者transport address为唯一标识。 因此, 相同的channel不能绑定到两个不同的transport address, 相同的transport address也不能绑定到两个不同的channel

channel binding持续10分钟, 一旦channel binding过期,客户端必须等5分钟之后,才能把这channel number绑定到不同的transport address, 或者这个transport address绑定到不同的channel number

ChannelData

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Channel Number        |            Length             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
/                       Application Data                        /
/                                                               /
|                                                               |
|                               +-------------------------------+
|                               |
+-------------------------------+

如果使用TCPorTLS-over-TCP传输, 为了保持对齐,ChannelData的长度必须是4字节的倍数。 这个填充不反映在Length字段中。UDP没有这样的要求。

STUN methods

address Method Description
0x003 Allocate (only request/response semantics defined)
0x004 Refresh (only request/response semantics defined)
0x006 Send (only indication semantics defined)
0x007 Data (only indication semantics defined)
0x008 CreatePermission (only request/response semantics defined)
0x009 ChannelBind (only request/response semantics defined)

STUN attributes

attribute Description
0x000C CHANNEL-NUMBER
0x000D LIFETIME
0x0010 Reserved (was BANDWIDTH)
0x0012 XOR-PEER-ADDRESS
0x0013 DATA
0x0016 XOR-RELAYED-ADDRESS
0x0017 REQUESTED-ADDRESS-FAMILY
0x0018 EVEN-PORT
0x0019 REQUESTED-TRANSPORT
0x001A DONT-FRAGMENT
0x0021 Reserved (was TIMER-VAL)
0x0022 RESERVATION-TOKEN
0x8000 ADDITIONAL-ADDRESS-FAMILY
0x8001 ADDRESS-ERROR-CODE
0x8004 ICMP
本博客已稳定运行
发表了64篇文章 · 总计109.63k字
本站总访问量 次 · 您是本站第 位访问者
粤ICP备2025368587号-1| 使用 Hugo 构建
主题 StackJimmy 设计