我在这里阅读了有关 TCP 打孔的论文。
为了做到这一点,必须绑定用于与远程主机建立 TCP 连接的套接字以及本地主机用来侦听与同一端口的连接的套接字。我已经能够在 Java 中执行此操作,但即使在给定套接字设置了 SO_REUSEADDR 标志时,也无法在 Python 中执行此操作。有人可以向我解释为什么吗?是因为 Python 本身就是单线程的吗?
我在这里阅读了有关 TCP 打孔的论文。
为了做到这一点,必须绑定用于与远程主机建立 TCP 连接的套接字以及本地主机用来侦听与同一端口的连接的套接字。我已经能够在 Java 中执行此操作,但即使在给定套接字设置了 SO_REUSEADDR 标志时,也无法在 Python 中执行此操作。有人可以向我解释为什么吗?是因为 Python 本身就是单线程的吗?
据我测试/研究,TCP 打孔并不是一种适用于所有情况的可行技术。首先,NAT 不能很好地支持 TCP 打孔,并且它们的行为是不可预测的。
在简历中,它依赖于发送 TCP SYN 数据包并接收 TCP SYN 数据包(在正常对话中,您将使用 SYN+ACK 进行响应),以便 NAT 在两台主机之间打开连接。一些 NAT 可能会打开此连接,而另一些则不会。我知道完成NAT Traversal的最佳方法是使用 UDP。由于 UDP 不是面向连接的,因此您可以开始发送数据包并接收数据包,因此 NAT 会认为一个数据包是另一个数据包的回复。
请参见 UDP 打孔
此外,为了使 UDP 与 TCP 一样可靠,您可以使用 TCP over UDP 的实现。
见UDT
很抱歉我没有回答你的问题,但是为什么在 Java 中有效,为什么在 Python 中没有,很难知道,它与虚拟机实现和系统调用甚至你正在使用的 NAT 有关。