1. 引言
位于 NAT 后方的主机可能希望与其他主机交换分组, 其中一些主机也可能位于 NAT 后方. 为实现这一点, 相关主机可以使用 "hole punching" (打洞) 技术 (见 [RFC5128]) 来尝试发现一条直接通信路径, 即从一台主机到另一台主机, 经过一个或多个 NAT 和路由器, 但不涉及任何 relay (中继) 的通信路径.
如 [RFC5128] 和 [RFC4787] 所述, 如果两台主机都位于行为不良的 NAT 后方, hole punching 技术将会失败. 例如, 如果两台主机后方的 NAT 在映射行为上采用 "Address-Dependent Mapping" 或 "Address and Port-Dependent Mapping", hole punching 技术通常会失败.
当无法找到直接通信路径时, 就需要使用充当分组 relay 的中间主机所提供的服务. 这个 relay 通常位于公共 Internet 中, 并在位于 NAT 后方的主机之间转发分组.
本规范定义了一种名为 TURN 的协议, 它允许位于 NAT 后方的主机 (称为 TURN client (TURN 客户端)) 请求另一台主机 (称为 TURN server (TURN 服务器)) 充当 relay. client 可以安排 server 在某些其他主机 (称为 peer (对等方)) 之间转发往返分组, 并控制中继方式. client 通过在 server 上获取一个 IP 地址和端口来做到这一点, 该地址和端口称为 relayed transport address (中继传输地址). 当 peer 向该 relayed transport address 发送分组时, server 会将该分组中继给 client. 当 client 向 server 发送分组时, server 会使用 relayed transport address 作为源地址, 将其转发给适当的 peer.
使用 TURN 的 client 必须有某种方式将 relayed transport address 传达给其 peer, 并获知每个 peer 的 IP 地址和端口 (更准确地说, 每个 peer 的 server-reflexive transport address (服务器反射传输地址), 见第 2 章). 如何完成这一点不属于 TURN 协议的范围. 一种可能方式是 client 和 peer 交换电子邮件消息. 另一种方式是 client 及其 peer 使用专门用途的 "introduction" 或 "rendezvous" 协议 (更多细节见 [RFC5128]).
如果 TURN 与 ICE [RFC5245] 一起使用, 则 relayed transport address 以及 peer 的 IP 地址和端口会包含在必须由 rendezvous protocol (会合协议) 承载的 candidate information (候选信息) 中. 例如, 如果 TURN 和 ICE 作为使用 SIP [RFC3261] 的多媒体解决方案的一部分, 则 SIP 承担 rendezvous protocol 的角色, 在 SIP 消息体中承载 candidate information. 如果 TURN 和 ICE 与其他 rendezvous protocol 一起使用, 则 [MMUSIC-ICE-NONSIP] 会提供关于 rendezvous protocol 必须执行哪些服务的指导.
虽然使用 TURN server 在两台 NAT 后方主机之间实现通信很可能成功, 但这会给 TURN server 提供者带来金钱和运维成本, 因为 server 通常需要到 Internet 的高带宽连接. 因此, 只有在无法找到直接通信路径时才使用 TURN server 是更理想的做法. 当 client 和 peer 使用 ICE 来确定通信路径时, ICE 会先使用 hole punching 技术搜索直接路径, 只有在无法找到直接路径时才使用 TURN server.
TURN 最初是为支持使用 SIP 信令的多媒体会话而发明的. 由于 SIP 支持 forking (分叉), TURN 支持每个 relayed transport address 对应多个 peer, 这是 SOCKS [RFC1928] 等其他方法不支持的特性. 不过, 本规范已经谨慎确保 TURN 也适用于其他类型的应用.
TURN 被设计为更大的 ICE NAT traversal (NAT 穿越) 解决方案中的一个组件. 强烈建议 TURN 实现者研究 ICE, 并认真考虑在其应用中使用 ICE. 但不使用 ICE 而单独使用 TURN 也是可能的.
TURN 是 STUN (Session Traversal Utilities for NAT) 协议 [RFC5389] 的扩展. 大多数 (但不是全部) TURN 消息都是 STUN 格式的消息. 本文档读者应熟悉 STUN.