了解允许 bittorrent 对等点通过 TCP 相互连接的必要条件

Understanding the requisites that allow bittorrent peers to connect to each other via TCP

BitTorrent 点通过 TCP(主要)相互连接。当对等点 A 尝试连接到对等点 B 时,对等点 B 是否也需要同时尝试与 A 连接,以便发生 TCP 3 次握手并形成连接?如果不是,为什么?

此外,我一直在研究三种比特流客户端实现。当他们开始与获得的对等点建立 TCP 连接时,我注意到 none 他们打开了一个 TCP 套接字来监听他们向跟踪器宣布的端口。这是否意味着没有人可以发起与他们的联系?他们不应该创建这样的 TCP 套接字吗?

When a peer A tries to connect to peer B, does peer B also needs to try to connect with A simultaneously so the TCP 3-way handshake happens and they form a connection? If not, why?

连接设置是一个通用的 TCP 功能,并非特定于 bittorrent。一侧通过在循环中调用 connect on an unconnected socket and the other side has a listening socket configured on which it calls accept 来启动连接,为每个接受的传入连接创建创建 connection-specific 套接字。

有一个用于连接设置的 simultaneous open 流程,但这很少相关,connect/accept 流程被 bittorrent 客户端使用。

I noticed none of them opens a TCP socket to listen on the port they are announcing to the tracker.

他们通常会这样做并且应该这样做,除非进程权限不足以绑定特定端口或另一个进程已经在侦听它,在这种情况下他们至少应该记录警告。

如果您使用端口扫描,那么您可能会看到防火墙或 NAT 妨碍您,而不是客户端没有打开侦听套接字。相反,您可以使用 netstat 之类的东西(可能需要一些额外的参数,具体取决于 OS)来显示监听套接字。

如果他们真的没有打开侦听套接字,那么是的,那将是一个问题,因为他们无法接受传入的连接并且只能与一组更有限的客户端(那些接受的)交谈。 Bittorrent 是一个 peer-to-peer 协议意味着客户端应该是平等的(对等的),这意味着它们应该同样能够发起和接受连接。