我知道 p2p 通信在理论上是如何工作的:
计算机 A,IP 为 187.6.9.1
计算机 B 的 IP 为 137.2.9.4
计算机A和B都有一个服务器程序和一个客户端程序,它们直接通信而不需要已知的服务器,它们可能只使用它来了解彼此的IP,之后它们就可以直接互相交谈。
计算机 A 客户端向 B 的服务器程序发送消息,然后 B 的客户端向 A 的服务器发送消息,依此类推。
但实际上这是如何工作的呢?我之前在家里设置了一个 http 服务器,我必须配置我的调制解调器来打开一个端口并通过那里接收通信,这样全世界都可以访问它。
所以我的调制解调器 IP 是 187.6.9.1,我必须告诉它将端口 187.6.9.1:8080 转发到本地计算机,本地 ip:端口为 192.1.1.67:8080
但是当使用 p2p 协议(如 torrents)时,我无需配置调制解调器或任何东西。这是如何工作的?
免责声明:我确信这个问题已经被问过了,但是我发现关于 p2p 的类似问题,但没有关于我的疑问的问题,所以我不得不在大量类似但不相同的问题中搜索。
答案1
仅有的一A 和 B 之间的对等体需要能够接收传入连接。另一个对等体建立出站连接,并且其网关自动允许响应返回,只要它们属于同一连接(即相同的 TCP 端口等)。这与您连接到网站时相同 - 您不必配置端口转发以允许 HTTP 响应返回。(换句话说,网关的 NAT 是“有状态的”。)
许多家庭网关支持通过 UPnP-IGD 或 NAT-PMP 协议自动配置端口转发规则。大多数 P2P 软件将通过 UPnP-IGD 自动进行必要的配置 - 如果您检查调制解调器,它实际上可能会显示您的 BitTorrent 客户端已添加的规则。
如上所述,网关已经必须自动允许与您发起的连接相对应的回复数据包。即使双方都没有配置端口转发,它们也可以先通过中央服务器进行会面,然后合作欺骗双方网关,让它们认为到达的数据包两个都对等体是“回复”数据包;参见NAT 打洞和相关文章. 这是 VoIP 软件常用的。
使用 IPv6,每个对等体已经有一个唯一的地址,其他对等体可以直接向该地址发送数据包,从技术上讲,端口转发是不必要的。(它可能仍然需要你通过路由器的防火墙,虽然配置非常相似,但原因却不同。