我阅读了有关 TCP 打洞的论文 here .
为了做到这一点,必须绑定(bind)用于与远程主机建立 TCP 连接的套接字以及本地主机用于监听与同一端口的连接的套接字。我可以在 Java 中执行此操作,但不能在 Python 中执行此操作,即使为给定套接字设置了 SO_REUSEADDR 标志也是如此。有人可以向我解释为什么吗?是因为Python本质上是单线程的吗?
最佳答案
据我测试/研究,TCP 打洞并不是一种适用于所有情况的可行技术。 首先,NAT 不能很好地支持 TCP 打洞功能,并且它们的行为是不可预测的。
在恢复过程中,它依赖于发送 TCP SYN 数据包并接收 TCP SYN 数据包(在正常对话中,您将使用 SYN+ACK 进行响应),以便 NAT 会在两个主机之间打开连接。某些 NAT 可能会打开此连接,而其他 NAT 则不会。 据我所知,完成 NAT 穿越的最佳方法是使用 UDP。由于 UDP 不是面向连接的,您可以开始发送数据包并接收数据包,这样 NAT 就会认为一个数据包是来自另一个数据包的回复。
此外,为了使 UDP 与 TCP 一样可靠,您可以使用基于 UDP 的 TCP 实现。
参见UDT
很抱歉我没有回答你的问题,但是为什么在 Java 中有效而在 Python 中无效,很难知道,这与虚拟机实现和系统调用甚至你正在使用的 NAT 有关。
关于python - TCP 打洞使用 Java 套接字而不是 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14625299/