TCP Hole Punching使用Java套接字而不是Python

cob*_*bie 2 python sockets network-programming tcp hole-punching

我在这里阅读了有关TCP打孔的文章.

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

fre*_*crs 5

从我测试/研究的角度来看,TCP Hole Punching并不是一种适用于各种情况的可行技术.首先,NAT漏洞不能很好地支持TCP Hole Punching,它们的行为是不可预测的.

在恢复中,它依赖于发送TCP SYN数据包并接收TCP SYN数据包(在正常会话中,您将使用SYN + ACK进行响应),以便NAT将在两个主机之间打开连接.有些NAT可能会打开此连接,而其他NAT则不会.我知道实现NAT Traversal的最好方法是使用UDP.由于UDP不是面向连接的,因此您可以开始发送数据包并进行恢复,因此NAT会认为一个数据包是另一个数据包的回复.

请参阅 UDP打孔

此外,要使UDP像TCP一样可靠,您可以使用TCP over UDP的实现.

UDT

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

  • 根据我的经验 - 使用UDP并在其上添加一些可靠性.即使使用UDP - 它也不适用于所有情况(阅读有关对称NAT),取决于路由器如何管理端口映射.如果不可预测,你就无法遍历.但是 - 如果您处理所有可能的情况,您将可以使用99%的路由器.此外,您可以通过UDP隧道TCP. (2认同)