Python P2P 网络(NAT 穿透)
为了便于理解,我们假设这两台机器都在使用ipv4,并且都在NAT网络后面。我想在这两台机器上打开一个套接字,让它们通过这些套接字连接起来(或者用类似的方式)。我知道这需要用到NAT穿透,但我不太明白NAT穿透是怎么回事(一个曾经连接的套接字现在可以变成接受连接的吗?)如果有谁在Python中使用过NAT穿透,我会非常感激你们的帮助。
3 个回答
听起来你需要设置端口转发,也就是告诉你的路由器,把它收到的特定端口的请求转发给后面的某个服务。
这个通常是在你路由器的管理界面里进行设置的。
打洞技术在维基百科上有很好的介绍。
打洞是一种计算机网络技术,用于在两个不同组织之间建立通信,这两个组织都在限制性防火墙后面。这个技术常用于在线游戏、点对点(P2P)和网络电话(VoIP)等应用。两个客户端会先与一个没有限制的第三方服务器建立连接,这样服务器就能获取它们的外部和内部地址信息。因为每个客户端都是主动向服务器发起请求的,所以服务器知道它们的IP地址和为这个会话分配的端口号,并把这些信息互相分享。拥有有效的端口号后,防火墙就会接受来自双方的进来的数据包。ICMP打洞、UDP打洞和TCP打洞分别使用互联网控制消息、用户数据报和传输控制协议。通过TCP的恶意打洞,可以将压缩的SYN数据包发送到一个共同的ACK路径中。
在这里有关于TCP、UDP和ICMP打洞的各种技术链接。
一般来说,要从A打洞到B(两者都在NAT后面),需要一个第三方服务器C,A和B都可以先连接到这个服务器。服务器会把A的连接信息发送给B,反之亦然。然后A和B使用这些信息尝试直接连接,但这个过程并不是100%可靠的。
如果没有第三方服务器,我觉得这个方法是行不通的。
编辑
你可能还想了解一下UPnP,具体可以查看这个链接。我不太确定路由器对它的支持程度,但听起来很适合你的应用。