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 章
   51   52   53   54   55   56   57   58   59   60   61