我正在尝试一些p2p网络。在做了一些研究之后,我学到的最大障碍之一就是“如果客户端在NAT /防火墙后面会怎么样”,后来我发现了关于打孔的问题,但并不总能保证能够正常工作。
据我所知,我不明白它为什么会失败,这是我目前所知道的:
ip:port
存储在目录ip:port
ip:port
。的(3) ip:port
的数据。的(5) ip:port
到其本地ip:port
的映射,因此NAT只会转发在 Bob public {上收到的所有数据{1}}到他的电脑。答案 0 :(得分:7)
一个问题是,Alice的NAT服务器中的NAT映射会在固定时间之后或一段时间不活动后超时。
第二个潜在的问题是NAT服务器可以限制Alice的NAT映射仅对Alice建立的TCP连接“好”,或者Alice与初始IP“她”连接的连接。 (换句话说,Alice和Bob之间的直接通信可能会被阻止。)
等等。
问题是NAT服务器的行为高度依赖于管理组织的配置/策略决策。其中许多决策可能意味着您的特定P2P使用模式无法可靠地运行......或者根本无法运行。
那么我对打孔的整个想法是错误的吗?
没有。这只意味着它不会一直有效。
答案 1 :(得分:3)
防火墙通常是有状态的。 Bob(2)与外部目录服务器建立通信在其NAT服务器中建立规则,允许Bob和目录服务器进行通信。当NAT服务器看到来自Alice的数据包时,它拒绝/丢弃它们,因为它没有看到Bob与Alice建立通信。
答案 2 :(得分:1)
NAT挖洞中最大的问题可能是缺乏端口一致性。为了使您的实现起作用,两个NAT中至少有一个必须支持它。
端口一致性是指将(local ip, local port)
映射到同一(external ip, external port)
而不管(destination ip, destination port)
的位置。如果没有这个,目录服务器看到的端口对clies是没有帮助的,因为它不会是客户端需要相互通信的相同端口。
(请注意,这是一个比 port preservation 更弱的要求,其中external port == local port
。)
不幸的是,对于P2P通信,大多数NAT都是Symmetric NAT的某种风格,并且不具有一致的端口映射。
答案 3 :(得分:0)
首先,有两种类型的打孔 1.UDP打孔 2.TCP打孔
UDP打孔成功率为82% TCP打孔成功率为64% 我做了很多UDP打孔实验,它们大部分都是成功的,但在TCP打孔的情况下并不相同。
TCP打孔失败的原因只是路由器NAT表。我会尽力解释一下:
客户1 - > connect(client2)--Internet--connect(client1)< - Client 2
现在,如果 Client1 ** SYN Packet ****到达client2并且** client2 ** SYN数据包未发布**,则client2的ROUTER可以做两件事: 1.当连接拒绝client1时,返回RST数据包。 2.立即丢弃数据包,没有回复发送给client1。
如果发生这种情况,将不会建立连接。
我只能建议一个解决方案,来自客户端的连接呼叫之间的时差应该非常小。连接呼叫差异应以毫秒为单位
提示:如果您在本地网络中,请禁用防火墙
对于ubuntu用户: sudo ufw disable