如何通过 Internet 建立 p2p 连接

Meh*_*and 5 networking p2p peer-to-peer

据说,对等网络不是用于路由和处理数据的服务器基础,仅使用服务器来获取最新的节点地址(可能是它们的互联网 IP 地址)以直接连接到其他节点,而无需中间服务器。所以我的问题是,计算机(节点)A如何通过互联网与节点B建立连接。ISP 给我们的 IP 无效并且无法访问。那么这个 p2p 如何通过互联网处理这些无效的节点 IP 地址呢?

use*_*686 4

假设问题是关于家庭/住宅连接:


事实上,大多数有线 ISP 都会向其客户提供可公开访问的 IPv4 地址。该地址被分配给客户的家庭路由器,该路由器可以接收数据包并将其转发到客户指定的任何内部设备。(它已经必须执行此操作,以便正确传递属于常规出站连接的入站回复 - 它记住哪个连接的数据包需要发送到哪个内部主机。)

对于 P2P,a) 客户添加静态规则(“端口转发”又名 DNAT)以始终将指定 TCP/UDP 端口的数据包发送到其计算机(节点 A)。然后其他节点可以简单地使用路由器的公共地址,它将在内部将数据包转发到节点 A。

(程序甚至可以使用 NAT-PMP 和/或 UPnP IGD 自动添加“端口转发”规则。)

或者 b) 程序可以使用各种“NAT 穿越”/ “打洞”机制,例如 STUN(它使用“辅助”服务器进行初始握手)。这些机制通常涉及欺骗路由器的自动连接跟踪,使每个节点看起来像是同时在同一对端口上向外连接到另一个节点。


对于使用 CGNAT 并且根本向客户提供公共 IPv4 地址的 ISP,选项 a) 通常是不可能的,而选项 b) 有时有效,有时无效。AFAIK,两个经过 CGNAT 处理的节点通常无法直接通信。

(请注意,即使经过 CGNAT 处理的节点仍然可以与任何具有公共地址的节点建立传出连接,因此它们并不是完全隔离的。我的意思是,如果它们不能这样做,那么它们就无法访问网络/邮件/游戏服务器也是吗?)

然而,至少其中一些 ISP 提供 IPv6 支持以及 CGNAT IPv4 服务。一般来说,IPv6 为每个设备提供一个公共地址,因此当两个节点都支持 IPv6 时,它们可以直接使用彼此的公共 IPv6 地址。

(他们可能仍然需要打洞或手动路由器配置,但那是因为防火墙通常会妨碍,而不是因为路由/寻址。)