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 client
和turn server
也用udp
方式,
除非有其他原因,比如:防火墙拦截udp
等。
Allocations
客户端发送请求到服务端获取到中继地址之后,客户端要保持此地址活跃,默认的生命周期是10分钟
,
客户端要在此时间内刷新请求,如果不想使用了,就发送生命周期为0的请求。
|
|
URI Scheme
turns
必须是TLS-over-TCP
orDTLS-over-UDP
,端口默认:5349
turn
必须是UDP
orTCP
,host
为turn server
ip。 端口默认:3478
turn
是stun
的扩展,所有的turn
消息除了ChannelData
之外,都是stun
格式的消息。
权限
turn server
存在权限列表,包括ip
和分配的过期时间
, 如果有权限,所有的peer
可以使用该ip
来发送数据到client
。
客户端可以通过CreatePermission
orCHannelBind
请求来申请或者刷新给定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
包括:
- channel number
- transport address
- 过期时间
一个channel binding
以 channel number
或者transport address
为唯一标识。
因此, 相同的channel
不能绑定到两个不同的transport address
, 相同的transport address
也不能绑定到两个不同的channel
channel binding
持续10分钟
, 一旦channel binding
过期,客户端必须等5分钟
之后,才能把这channel number
绑定到不同的transport address
,
或者这个transport address
绑定到不同的channel number
。
ChannelData
|
|
如果使用TCP
orTLS-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 |