Python P2P 网络(NAT 打洞)

3

为了方便理解,我们假设两台机器都在IPv4和NAT网络后面。我希望能在两台机器上打开一个套接字,并通过这些套接字(或类似的系统)连接这些机器。我知道需要使用NAT穿透才能实现这一点,但我不确定NAT穿透如何应用(曾经连接的套接字现在可以接受吗?)。任何在Python中使用NAT穿透的人都可以帮忙,非常感谢。


你在使用UDP还是TCP? - Peter Gibson
我可以使用任何一种,我还没有特别选择。我也不是非常熟悉它们之间的区别。 - SwiftCore
TCP数据包是可靠的,并且将在另一端按顺序重新组装。UDP不可靠(数据包可能会被默默地丢失或乱序接收),但通常在由于时间限制而重新发送数据包不如放弃它们更可取的情况下使用(例如游戏、音频/视频聊天)。 - Peter Gibson
这些项目可能会引起您的兴趣:nattraversoPyPunchP2P - n611x007
3个回答

4
这被称为“NAT穿透问题”。 有三种解决方案:
  1. 静态配置NAT,将给定端口的传入连接请求转发到您的服务器。这也被称为端口转发
    enter image description here

  2. Internet Gateway Device (IGD) Protocol。允许NAT主机:
    -学习NAT路由器的公共IP地址
    -添加/删除端口映射(带租赁时间)
    即自动化静态NAT端口映射配置
    enter image description here

  3. 中继(用于Skype)
    -NAT客户端与中继/服务器建立连接
    -外部客户端连接到中继
    -中继在两个连接之间桥接数据包
    enter image description here

请参考书籍《计算机网络自顶向下方法 第六版-James F. Kurose, Keith W. Ross》第四章>>网络地址转换(NAT)以获取更多信息。

2
在计算机网络中,打洞是一种技术,用于在两个组织之间建立通信。这两个组织都位于受限制的防火墙后面。该技术被用于在线游戏、P2P和VoIP等应用程序中。两个客户端与一个未受限制的第三方服务器建立连接。服务器公开了它们的外部和内部地址信息。由于每个客户端都向服务器发起请求,所以服务器知道它们的IP地址和为该会话分配的端口号,并将其分享给对方。具有有效端口号使得防火墙接受来自每一方的传入数据包。ICMP打洞、UDP打洞和TCP打洞分别使用互联网控制消息、用户数据报和传输控制协议。使用恶意的TCP打洞,则可以通过常规确认路径发送压缩SYN数据包。关于TCP、UDP和ICMP打洞技术,链接在维基百科条目中。
通常,要从A到B(均位于NAT后面)打洞需要一个第三方服务器C,它们最初都可以连接。服务器将A的连接信息发送给B,反之亦然。A和B然后使用此信息尝试直接连接彼此,但该过程并不百分之百可靠。如果没有第三方服务器,则我认为它将无法工作。
另外,您还可以查看UPnP(http://en.wikipedia.org/wiki/Universal_Plug_and_Play#NAT_traversal),但我不确定路由器对其的支持情况。这听起来适用于您的应用程序。

我确实有一个第三方服务器(理论上)。这是我通过我们学校ACM领导的课外项目,因此我们可以访问ACM服务器上的服务器空间。我计划通过那个打洞。不过在实现方面还有点迷茫。 - SwiftCore

0

听起来你需要设置端口转发 - 基本上是告诉你的路由器将接收到的特定端口的呼叫转发到它后面的服务。

通常可以通过路由器的管理界面完成。


2
我特别关注 NAT 穿透,以避免这种情况。我正在尝试创建相对易于使用的软件,因此配置路由器听起来不太合理。 - SwiftCore
据我所知,您至少需要在一个方向上使用端口转发。一旦建立连接,就可以通过该连接简单地发送数据包。如果您不希望用户干预,我认为您可以使用UPnP,它允许您直接从应用程序设置端口转发。虽然我从未尝试过,但我不确定它有多容易。 - Ahmed Al-Sudani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接