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-TCPorDTLS-over-UDP,端口默认:5349turn必须是UDPorTCP,host为turn serverip。 端口默认:3478
turn是stun的扩展,所有的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包括:
- 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
|
|
如果使用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 |