如何在像BitTorrent这样的点对点协议中进行NAT穿透。

33

我了解NAT穿透以及STUN、TURN和ICE的使用。我想知道这些是否在像BitTorrent这样的点对点文件共享应用程序中实现。无论是通过STUN创建直接连接还是通过TURN中继,跟踪器是否有助于在NAT后面通信的同行之间进行通信。在分布式哈希表(DHT)的情况下,一个同行如何与其他NAT后面的同行通信?

1个回答

53
BitTorrent不需要连接到群体中的任何特定成员,它不是点对点聊天协议,其中两个特定端点想要互相通信。它所关心的只是群体的连接图具有足够高的连通度。
换句话说,让NAT后面的客户端彼此交谈有一定的可取性,但不至于耗费主要资源,例如流量转发,来达到这个目标。在单个节点级别上,故障是一种选择。因此,它不使用sip/turn等协议。
当然,在总体群体级别上,随着不可达节点比例的增加,性能仍将下降。如果没有人可以接受传入连接,则BitTorrent无法工作。
各种客户端使用以下一些方法的组合来改善大容量传输连接的连通性:
  • 只要应用程序在运行,就可以通过网关与PCPNAT-PMPUPnP-IGD协商来转发端口
  • 对于TCP,可以使用源端口绑定(出站连接)和端口重用(监听+出站)套接字选项,使用相同的本地端口来利用端点独立(EIM)NAT映射(也称为完全锥形NAT)。
  • 类似地,对于UDP,应该使用单个套接字结合sendto/recvfrom或等效API,将所有应用层连接多路复用到单个端口,而不是为每个对等方创建一个套接字。
  • ut_holepunch extension,它使用互相可达的种子成员代替stun服务器(基本上是大部分未记录的)。
  • 可选的基于UDP的传输协议(µTP),可以与前面的点结合使用。通常使用UDP更容易实现nat穿透。
  • IPv6能力信令,原则上允许客户端升级其连接,然后通过PEX/DHT聊天关于v6对等方。
  • 提示用户执行手动端口转发

在DHT的情况下,只使用前两个点(网关协商和端口重用)。尝试为单个请求-回复周期进行NAT穿越的开销将超过100%,不值得。


你知道libtorrent是否与TURN/STUN/ICE服务器兼容吗? - Gubatron
1
@Gubatron的问题不太清楚。您是指libtorrent是否可以充当stun服务器,还是作为客户端利用这些服务器进行NAT遍历? - the8472
很可能是后者。 - tejasvi88

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接