【问题标题】:TCP Hole Punching works using Java sockets and not with PythonTCP 打孔使用 Java 套接字而不是 Python
【发布时间】:2013-01-15 12:37:13
【问题描述】:

我阅读了有关 TCP 打孔的论文here

为了做到这一点,必须绑定用于与远程主机建立 TCP 连接的套接字以及本地主机用来侦听与同一端口的连接的套接字。我已经能够在 Java 中做到这一点,但即使在给定套接字设置了 SO_REUSEADDR 标志时,在 Python 中也无法做到这一点。有人可以向我解释为什么吗?是因为 Python 本身就是单线程的吗?

【问题讨论】:

  • 不是一个真正的java问题,重新标记,继续
  • 如果没有更多信息,最好是一些代码,您的问题无法回答。
  • 我知道地球上没有人成功地完成了 TCP 打孔。这应该是有趣的答案栏
  • @cobie 我知道打孔是什么以及它是如何工作的。我只是说我还没有看到有人用 TCP 数据包打洞。

标签: python sockets tcp network-programming hole-punching


【解决方案1】:

据我测试/研究,TCP 打孔并不是一种适用于所有情况的可行技术。 首先,NAT 不能很好地支持 TCP 打孔,并且它们的行为是不可预测的。

在 resume 中,它依赖于发送 TCP SYN 数据包和接收 TCP SYN 数据包(在正常对话中,您将使用 SYN+ACK 进行响应),以便 NAT 在两台主机之间打开连接。一些 NAT 可能会打开此连接,而另一些则不会。 我知道完成NAT Traversal 的最佳方式是使用UDP。由于 UDP 不是面向连接的,您可以开始发送和接收数据包,这样 NAT 就会认为一个数据包是另一个数据包的回复。

UDP Hole Punching

此外,为了使 UDP 与 TCP 一样可靠,您可以使用 TCP over UDP 的实现。

UDT

很抱歉我没有回答你的问题,但是为什么在 Java 中有效而在 Python 中为什么没有,很难知道,它与虚拟机实现和系统调用甚至您正在使用的 NAT 有关。

【讨论】:

  • 根据我的经验 - 使用 UDP 并在其之上增加一些可靠性。即使使用 UDP - 它也不会在所有情况下都有效(阅读对称 NAT),这取决于路由器如何管理端口映射。如果它不可预测,则无法遍历。但是 - 如果您处理所有可能的情况,您将可以使用 99% 的路由器。此外,您可以通过 UDP 建立 TCP 隧道。
  • 谢谢,我不知道对称 NAT。有没有办法克服这个?
猜你喜欢
  • 2016-12-05
  • 2021-02-24
  • 2015-02-10
  • 2012-10-18
  • 2013-07-07
  • 1970-01-01
  • 2012-02-07
  • 1970-01-01
  • 2017-12-17
相关资源
最近更新 更多