我正在尝试一些p2p网络。 经过研究后,我了解到的最大障碍之一是“如果客户端位于NAT /防火墙后面怎么办” ,后来我发现了打孔技术,但并不一定保证它能正常工作。

据我所知,我不理解为什么它可能会失败,这是我到目前为止所知道的:


在此处输入图片说明
根据上图,这就是我了解如何建立成功连接的方式。

  1. 爱丽丝通过创建与目录服务器的连接来加入网络(1) 发生这种情况时, Alice的 NAT将创建一个从其公共ip到其本地ip的映射。
  2. 目录服务器接收连接并将Alice的公共ip:port存储在目录中
  3. 鲍勃 (2)做同样的事情,加入网络并在目录中发布他的ip:port
  4. 爱丽丝想和鲍勃交流。 因此,她从目录中查找Bob的 ip:port (3)
  5. 爱丽丝鲍勃的 ip:port上发送她从服务器获取的数据。 (5)
  6. 由于Bob还具有从is ip:port到其本地ip:port的映射,因此NAT仅将在Bob的公共ip:port上接收到所有数据转发到他的计算机。
  7. 爱丽丝的同作品
    我希望我对自己了解的解释很清楚。 我的问题是,对此有何困难或不可靠? 我肯定很想念一些东西。 你能解释一下这是什么吗?

===============>>#1 票数:10 已采纳

一个问题是,爱丽丝NAT服务器中的NAT映射可能会在固定时间之后或一段时间不活动后超时。

第二个潜在的问题是,NAT服务器可能会限制Alice的NAT映射仅对Alice建立的TCP连接或Alice与所连接的初始IP“ she”之间的连接“良好”。 (换句话说,Alice和Bob之间的直接通信可能会被阻止。)

等等。

问题在于NAT服务器的行为高度依赖于管理组织的配置/策略决策的方式。 这些决定中的许多决定可能意味着您特定的P2P使用模式将无法可靠地工作……或根本无法工作。


那么,我关于打孔的整个想法是错误的吗?

不。这只是意味着它不会一直有效。

===============>>#2 票数:3

防火墙通常是有状态的。 Bob(2)与外部目录服务器建立通信,在他的NAT服务器中设置了一个规则,该规则允许Bob和目录服务器进行通信。 当NAT服务器看到来自Alice的数据包时,它会拒绝/丢弃它们,因为它没有看到Bob与Alice建立通信。

===============>>#3 票数:3

可能是NAT穿孔的最大问题是缺乏端口一致性 为了使实施正常工作,两个NAT中至少有一个必须支持它。

端口一致性是将相同(local ip, local port)映射到相同(external ip, external port)而不考虑目标(destination ip, destination port) 否则,目录服务器所看到的端口将对客户端没有帮助,因为它与客户端之间需要彼此通信的端口不同。

(请注意,这比端口保留external port == local port )要弱。)

不幸的是,对于P2P通信,大多数NAT都是某种对称NAT,并且没有一致的端口映射。

===============>>#4 票数:1

首先有2种打孔1.UDP打孔2.TCP打孔

UDP穿孔成功率达82%TCP穿孔成功率达64%我做了很多UDP穿孔实验,它们大多都成功了,但在TCP穿孔方面却不尽相同。

TCP打孔失败的原因仅是路由器NAT表。 我会尽力解释一下:

客户端1-> connect(client2)--Internet-- connect(client1)<-客户端2

现在,如果Client1 ** SYN数据包****到达client2且** client2 ** SYN数据包未释放**,则client2的ROUTER可以执行以下两项操作:1.将RST数据包发送回,因为连接被拒绝到client1 。 2.立即丢弃数据包,并且没有答复发送到client1。

如果发生这种情况,将不会建立连接。

我只能提出一种解决方案,即从两个客户端进行的连接调用之间的时间差应该很小。 连接呼叫差异应以毫秒为单位

提示:如果您在本地网络中,请禁用防火墙

对于ubuntu用户: sudo ufw disable

  ask by Krimson translate from so

未解决问题?本站智能推荐:

1回复

每个NAT下的P2P网络

我正在做一些移动项目,需要与两个设备进行P2P通信。 而且我遇到了问题。 (因为智能手机很少有公共IP) 我找到了一些答案。 这是“ UDP打孔”。 我想我在概念上100%理解“ UDP打孔”,并编写了一些代码。 但这是行不通的。 这是我的情况。 但这不起作用
1回复

P2P应用程序,打孔无法在端点独立映射NAT上进行

我目前正在使用“打孔”方法在C中实现(UDP)p2p应用程序。 我发现J. Selbie以前的帖子确实在说明,他解释了基础知识并进行了相应的介绍( post1 , post2 ),但是可能我缺少了一些东西,只有一个同龄人正在接收数据,而另一个同龄人却没有。 这是我正在采取的步骤:
1回复

P2P技术的比较

我经历过各种基于udp的P2P技术,例如Stun。 我最近实现了UDP / TCP打孔,以实现p2p。 我发现还有其他技术,例如ICE,UPnP和teredo 谁能告诉我这些技术之间的区别是什么。 哪一种是近年来用于P2P的最新技术/协议。 如果可以的话,可以对
2回复

需要帮助设置udp打孔以进行p2p数据传输。 无法使STUN工作

我正在尝试将UDP数据包从一个客户端发送到另一个客户端。 令C1为我要用来接收数据的客户端,让C2为要发送数据的客户端。 我在做什么: 向STUN服务器询问两个客户端的公共IP地址和端口。 我将其他IP地址和公共端口告知每个客户端。 C1在其公共地址和端口上向C2发
2回复

UDP打孔帮助

我正在尝试通过互联网为我的游戏添加网络,使用Peer to Peer。 我已经实现了一个仅LAN版本,它使用.NET的对等类来连接本地网络。 我意识到我需要使用UDP打孔来建立与防火墙后面的其他客户端的连接。 这就是我开始实现它的方式:服务器是一个HTTP服务器,它使用非常简单的P
1回复

通过服务器脚本进行简单的PHP NAT打孔

我正在尝试编写一个可以充当“主服务器”并促进两个Java游戏客户端之间的P2P连接的PHP脚本。 我正在使用共享的Web主机,该主机允许主服务器的端口访问。 首先,我想测试主服务器和Java客户端之间的UDP套接字连接。 这是我的PHP脚本,名为“ masterServer.php”
2回复

使用STUN打孔

我目前正在尝试通过互联网发送UDP消息,并且必须为端点A和B(它们都在NAT后面)设置防火墙。 为此,我想使用STUN服务器进行打孔。 当A向STUN服务器创建请求时(例如,private:85.1.1.12:6000和public:173.194.78.127:19302),我得到85
1回复

我一直在尝试打孔并将数据报发送到路由器后面的我的朋友计算机,但没有任何反应

我正在尝试创建p2p连接。 这是我已经检查过的只是一个测试应用程序,但似乎无法通过互联网运行。 这是我在PC上用来向我的朋友发送数据报的Java代码: ' '
1回复

P2P发现功能

我想知道如何在LAN P2P网络中实现发现功能。 我不想使用.NET 3.5 P2P库,我想自己设计。在用户按下Connect按钮的那一刻,他在局域网中发送了一条广播消息,通知其他对等方他有空。接收线程上的其他对等方可以识别该消息,并可以通过它们建立连接。 例如:IP为192.168.0.1
1回复

P2P隔离预防

创建一个P2P网络的机会是什么,在该网络中一组对等点可以与其他点隔离开来。 显然,我并不完全理解P2P,但是我认为您可以得到一小群对等点,它们仅在真正的主要对等点群位于其他地方时彼此了解。