点对点如何在互联网上工作?

Pac*_*ier 17 networking internet bittorrent peer-to-peer

据我所知,除非我们知道路由器采用的路由机制,否则无法从网络外部向本地网络中的计算机发送数据包。

假设我们有一个如下所示的设置:

  1. 计算机-A,IP 192.168.1.2(默认网关 192.168.1.1)

  2. 计算机-B,IP 192.168.1.3(默认网关 192.168.1.1)

  3. 路由器-C,IP 192.168.1.1(外部 IP 1.1.1.1)

  4. Router-D(外部 IP 2.2.2.2)

计算机-A、计算机-B 和路由器-C 属于同一本地网络。Router-D 想将数据发送到 Computer-A,但它不能不通过 Router-C 来做到这一点。

现在,如果目的端口是 1000,Router-C 会将数据包转发到 Computer-A,如果目的端口是 2000,则将数据包转发到 Computer-B。但可以肯定的是,唯一知道这种路由机制的设备是 Router-C 本身!连电脑 A 和电脑 B 都不知道,对吧?

所以Router-D如果通过1000端口向Router-C发送数据包,就可以向Computer-A发送数据包,但是Router-D怎么知道通过1000端口发送数据包,而不是说1001端口呢?

像 Bittorrent 这样的点对点程序是如何解决这个问题的?我能想到的唯一解决方案是让 Router-D 通过所有端口将数据包发送到 Router-C ,以便将其转发到 Computer-A,但有更好的解决方案吗?

Syn*_*ech 9

你的困惑源于一些不正确的假设。

但可以肯定的是,唯一知道这种路由机制的设备是 Router-C 本身!连电脑 A 和电脑 B 都不知道,对吧?

什么为什么?那么为什么路由器被配置为将这些端口转发到这些 IP?您必须先设置 P2P 客户端使用特定端口,然后再设置路由器以进行对应。

但是 Router-D 怎么知道通过端口 1000 发送数据包,而不是说端口 1001?

因为您将 P2P 客户端配置为使用特定端口(该协议的标准或非标准端口)。

我能想到的唯一解决方案是让 Router-D 通过所有端口将数据包发送到 Router-C,以便将其转发到 Computer-A,但是有更好的解决方案吗?

它比那简单得多。当客户端与对等方建立连接时,它指定要使用的端口,因此对等方在该端口上发送数据。

嗯,但 Bittorrent 不会改变路由器的行为,对吗?由于某些路由机制可能是动态的,如 superuser.com/a/187190/78897 中所示,计算机 A 如何知道它?

客户端不直接影响路由器,但路由器可以配置/智能到足以适应客户端的行为。您可以在路由器和客户端中启用UPnP以自动配置连接,并且大多数路由器都具有状态检查功能作为其端口转发机制的一部分。

综上所述,这意味着可以在随机端口上动态建立连接,然后路由器可以跟踪正在发生的事情,而不是将一切视为随机的、无意义的连接。这样,它可以根据需要转发连接,因为例如,它是对刚刚发生的另一个连接的响应

当您有多个系统使用相同的程序时,问题就会出现。将多个系统连接到同一个路由器、共享同一个 IP 和使用动态端口很快变得无法管理,即使有状态检查,也很难让它正常工作。在这种情况下,将需要使用静态端口(默认或其他)。


如果您使用SmartSniffTCPView 之类的程序来监视您的连接,您会注意到 P2P 连接通常将您配置的端口(或客户端的默认端口)作为传入连接的目的地,以及默认或自定义/源的随机端口,反之亦然。