Page 56 - Web性能权威指南
P. 56
见。为解决这个问题,在 STUN 失败的情况下,我们还可以使用 TURN(Traversal
Using Relays around NAT)协议(RFC 5766)作为后备。TURN 可以在最坏的情况
下跳过 UDP 而切换到 TCP。
TURN 中的关键词当然是中继(relay)。这个协议依赖于外网中继设备(图 3-6)在
两端间传递数据。
ዐीޜခഗ
图 3-6:TURN 中继服务器
• 两端都要向同一台 TURN 服务器发送分配请求来建立连接,然后再进行权限协商。
• 协商完毕,两端都把数据发送到 TURN 服务器,再由 TURN 服务器转发,从而
实现通信。
很明显,这就不再是端对端的数据交换了! TURN 是在任何网络中为两端提供连接
的最可靠方式,但运维 TURN 服务器的投入也很大。至少,为满足传输数据的需
要,中继设备的容量必须足够大。因此,最好在其他直连手段都失败的情况下,再
使用 TURN。
现实中的 STUN 和 TURN
谷歌的 libjingle 是一个用 C++ 开发的用于构建端到端应用程序的开源库,负责在
后台实现 STUN、TURN 和 ICE 协商。谷歌聊天软件 Google Talk 使用的就是这个
库,其文档也为我们考量现实中的 STUN 与 TURN 性能提供了有价值的参考:
• 92% 的时间可以直接连接(STUN);
• 8% 的时间要使用中继器(TURN)。
由于 NAT 设备遍地都是,相当一部分用户不能通过 STUN 直接建立 P2P 连接。
若要提供可靠的 UDP 服务,现实中必须同时支持 STUN 和 TURN。
构建高效的 NAT 穿透方案可不容易。好在,我们还有 ICE(Interactive Connectivity
Establishment)协议(RFC 5245)。ICE 规定了一套方法,致力于在通信各端之间建立一
38 | 第 3 章