本文分享TURN的概念、生命周期以及使用方法,方便大家在WebRTC开发中更好的理解TURN通信。
TURN是什么
WebRTC 在无法建立直接连接的情况下,RFC 8656中定义了 TURN(使用中继穿透 NAT)。当你的两个 peer 的 NAT 类型不兼容,或者双方使用不同协议时,就需要使用 TURN!TURN 也可以被用于保护隐私的目的。如果通过 TURN 运行所有通讯,客户的真实地址在对端是被隐藏的。
TURN 使用专用服务器。该服务器充当客户端的代理。客户端连接到 TURN 服务器并创建一个对应的 Allocation
。通过创建该 Allocation
,客户端将获得一个临时 IP/ 端口 / 协议
三元组,其他 peer 可以使用该 IP/ 端口 / 协议
将数据发送给该客户端。这个新的监听地址被称为中继传输地址
。你可将其视为转发地址并分享给他人,以便其他人可以通过 TURN 向你发送流量!对于每个将获得该中继传输地址
的 peer,你必须为其创建一个新的 Permission
,以允许它与你进行通信。
当你通过 TURN 发送出站流量时,它会通过中继传输地址
发送。当远程 peer 获得该出站流量时,他们会看到数据来自 TURN 服务器。
TURN 生命周期
下面就是一个客户端创建 TURN allocation
时必须做的所有事情。对于其他 peer 而言,与使用 TURN 服务器的客户端进行通信和其他客户端没有任何区别,先获得 IP 和端口,然后像跟其他任何主机一样通信。
Allocations
Allocations 是 TURN 的核心。本质上,一个 allocation
就是一个 “TURN 会话 “。要创建一个 TURN allocation,你需要与 TURN Server Transport Address
(服务器传输地址,通常在 3478 端口)进行通信。
创建 allocation 时,你需要提供 / 确定以下内容:
- 用户名 / 密码 – 创建 TURN allocation 时需要身份验证。
- Allocation 传输方式 – 服务器(
中继传输地址
)与 peer 之间的传输协议, 可以是 UDP 或 TCP。 - 连续端口 – 你可以为多个 allocation 请求顺序排列的一系列端口,这点与 WebRTC 无关。
如果请求成功,你将在 TURN 服务器上获得响应,在响应的数据部分,包含以下的 STUN 属性:
XOR-MAPPED-ADDRESS
–TURN Client
的Mapped Address
。当有人将数据发送到中继传输地址
时,数据将被转发到该地址。RELAYED-ADDRESS
– 这是你提供给其他客户端的地址。如果有人将数据包发送到该地址,数据包会被转发到 TURN 客户端。LIFETIME
– Allocation 被销毁的时间。你可以通过发送Refresh
请求来延长这一时间。
译注:上面两个地址很拗口,但实际上理解起来并不复杂。
Mapped Address
是 Turn Client 的实际地址,也就是 Turn Server 收到数据包时的目标地址
。而Relayed Address
是 Turn Client 的名义地址,也就是其他 WebRTC Agent 要发送数据给这个 Turn Client 时,所使用的地址。
权限
在你为远程主机创建权限之前,远程主机是无法通过你的中继传输地址
发送数据的。所谓创建权限,即是告知 TURN 服务器一个 ” 可以用来发送入站流量 ” 的 IP 和端口。
远程主机需要先为你提供 TURN 服务器上使用的 IP 和端口。这意味着它应该先向 TURN 服务器发送一个 STUN 绑定请求
。 有时会发生这样一个常见的错误情况,即是远程主机发送 STUN 绑定请求
到另外一台服务器,然后再要求 TURN 服务器为此 IP 创建权限。
对于上面那种错误情况,假设你要为一个使用地址相关的映射
的 NAT 网络的主机创建权限,如果你从其他 TURN 服务器生成映射地址
,则所有入站流量都将被丢弃。因为每次他们与其他主机通信时,它都会生成一个新的映射。如果未被刷新,权限将在 5 分钟后过期。
译注:对于这个常见的错误情况,实际指的是被连接的主机从 TURN 服务器以外的 STUN/TURN 服务器获取本机 IP,再告知发起连接的主机这样的情况。当被连接的主机使用
地址相关的映射
类型的 NAT 时,它获取的 IP 在当前的 TURN 服务器上是无效的。
SendIndication/ChannelData
这是 TURN 客户端将消息发送到远端 peer 时所使用的两个消息。
SendIndication 是一个自包含的消息。它包含你希望发送的数据,以及你希望发送的目标。如果你要向远端 peer 发送大量消息的话,这种方式很昂贵。因为如果要发送 1,000 条消息,目标 IP 地址就被重复了 1,000 次!
ChannelData 允许你发送数据,但不需要重复 IP 地址。你需要先创建一个具有 IP 和端口的通道(Channel)。然后使用 ChannelId 发送,IP 和端口将在服务器端被填充进去。如果你要发送大量消息,这是更好的选择。
刷新
Allocations 将自动销毁。要避免其过早销毁,TURN 客户端必须在创建 allocation 时指定的 LIFETIME
到来之前,及时刷新它们。
TURN 使用方法
TURN 有两种用法。通常情况下,一个 peer 会作为 “TURN 客户端 ” 连接,而另一方则直接进行通信。在某些情况下,你可能在两侧都需要使用 TURN 服务。举例来说,当两个客户端都位于在禁用 UDP 的网络中时,只能通过 TCP 连接到各自的 TURN 服务器来建立连接。
下面这些图有助于说明 TURN 的用法。
单个 TURN Allocation 通信
双重 TURN Allocation 通信
译注:单个 TURN Allocation 的情况,指的是一个 TURN Client 和另一个可访问的 UDP Client 的通信。双重 TURN Allocation 的情况,指的是两个 TURN Client 之间通信。
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。