python - TCP 打洞使用 Java 套接字而不是 Python

标签 python sockets tcp network-programming hole-punching

我阅读了有关 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 Hole Punching

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

参见UDT

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

关于python - TCP 打洞使用 Java 套接字而不是 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14625299/

相关文章:

bash - 如何用 Bash 制作 Echo 服务器?

python - 如何使用 Python 3.x 将回调及其参数从包装函数传递给装饰器?

python - 将 cftime.DatetimeJulian 转换为日期时间

python - 如何在帧中生成动画

c - 套接字错误 : connection refused - what am I doing wrong?

c - 服务器中的父进程卡在接受调用中。我如何从 child 那里干净地终止 parent

python - 在 Pandas 中找到第一个非 NaN 值

linux - 通过 802.11n 的 UDP 单播 - L2 积极 ACK 对 Linux 套接字发送缓冲区的影响

c - TCP 服务器/客户端如何保持连接?

python - 使用 boto 从 S3 获取时 TCP 套接字未关闭