如何连接从BitTorrent获取的同行节点

10

我想在Ruby中构建一个BitTorrent客户端(虽然语言对此并不重要)。

我阅读了BEP规范,其中指出在没有DHT支持的情况下查询跟踪器上的/announce将为给定信息哈希提供当前连接的对等方列表。

为了检查这个,我创建了一个种子文件,发现跟踪器返回了我的机器的IP和端口(我确认这是我的机器上运行的BitTorrent客户端的运行端口,即uTorrent)。

但问题在于,Peer信息返回的是我的ISP的IP地址,即111.125.209.41(因为我在NAT后面,这是公共面向互联网的IP地址)。

现在我无法使用我的ISP的公共面向互联网的IP地址通过TCP连接到在我的机器上运行的进程。

有人能建议一下BitTorrent是如何处理这个问题的,我应该怎么做来解决它。

也许在UDP上,BitTorrent会使用UDP穿透,不确定TCP上会发生什么。


这就是为什么许多BitTorrent客户端建议进行某种端口转发的原因。此外,种子客户端通常会主动连接到其他客户端,但如果两者都在NAT后面,则无法发生连接。 - Tyzoid
你实际遇到的问题是什么,是来自家庭网络外部还是内部的可达性?如果是来自网络内部,则对于BitTorrent来说不太重要,因为大多数节点都具有外部视图。 - the8472
@the8472 嗯,这个问题既涉及内部又涉及外部。首先,我该如何连接到一个位于 NAT 后面的外部节点?如果这个问题可以回答,那么内部节点的连接方式就不言自明了,也就是外部节点如何连接到我位于 NAT 后面的 Torrent 服务器。 - Ratatouille
你是否考虑过建立一个在你的 NAT 内运行的私有跟踪器?如果所有设备都在 NAT 后面,跟踪器应该能够使用内部 IP。 - Tyzoid
@Tyzoid 的观点是,我正在努力理解如何构建一个支持公共网络的极简 BitTorrent 客户端。 - Ratatouille
1个回答

2
有两个独立的问题。
  1. 互联网上的同行(即世界上的99.99999%)如何连接到您的NAT节点
  2. 网络内的同行如何连接到同一网络上的节点。
第一个问题通过各种NAT穿越方法实现,包括与NAT设备协商或手动配置。
第二个问题需要具有发夹路由功能的路由器与转发端口结合使用,或者本地对等体通过其他方式(例如LSD)发现内部地址。

1
@nullptr 这很复杂,我认为这应该成为另一个问题。 - the8472

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