我正在开发一个p2p聊天应用程序,它可以在DSL两个不同的NAT上正常工作,但是当涉及到3G USB互联网连接时,它会失败。
我发现不可能绕过3g网络的NAT,而Skype和种子等已知的p2p应用也无法绕过3g网络,每当遇到这些问题时,通过中央服务器发送数据。
我想知道3g网络的架构是什么。我听说他们没有私有IP,端口对只有公共IP,端口可用,一个公共端口可以分配给很多设备,我是否正确?如果是这样,服务器如何将数据发送到3g网络?
答案 0 :(得分:3)
我致力于开发多代理系统的开源中间件,最近我们不得不为4G / 3G网络上的p2p使用创建基于UDP的传输选项。我们已经对T Mobile的数据计划以及NAT背后的各种学术网络进行了测试,我对目前的实施情况非常有信心。由于此处似乎没有任何可靠的解决方案,我想我会通过REGISTRY_CLIENT传输选项分享我们目前在MADARA中间件(http://madara.sourceforge.net/)中实现的解决方案类型。
对于我们来说,我们为P2P端点选择了您可能称之为注册服务器或名称服务(如果您熟悉CORBA)。注册服务器需要在UDP可以通过单向消息到达的某个公共IP:端口上运行。对于我们的测试,我们租用了一个Amazon EC2节点,并确保防火墙设置允许UDP流量通过我们要绑定到的UDP端口。在服务器端(公共ip:注册表服务器的端口配对),我们绑定到端口并等待客户端注册。任何想要与他人交谈的P2P客户端都会向注册服务器发送注册消息
P2P client ----> [register message] ---> Registry Server
注册消息可以包含任意内容。我们的普通数据协议实际上没有其他内容的消息头。在服务器端,我们通过正常的套接字recv调用检查注册消息发送者的远程主机(左上方的P2P客户端)。该远程主机应该是通过保护P2P客户端的防火墙的端点信息。
要了解这里发生了什么,我们必须看看如何将P2P客户端的消息路由到我们的公共注册服务器。以下ASCII图显示了从P2P客户端到EC2服务器的路径上套接字可能看到的远程信息(即示例防火墙映射)。这只显示了一个防火墙,但它应该可以在P2P客户端和注册服务器之间使用多个NAT,只要NAT在流量通过指定的特定NAT的ip:端口时保持公共IP:端口打开。
P2P client ----> [message from 192.168.1.10:35000] ---> Firewall ---> [message from 111.111.50.34:5627] --> Registry Server
现在,如果我们尝试从我们的注册服务器向192.168.1.10:35000发送消息,它将失败(或者至少,它几乎肯定会转到错误的位置)。同样,您可以看到4G防火墙也在将端口从35000更改为5627.要将消息发送回P2P客户端,您需要做两件事:1)通过111.111.50.34:5627发送返回消息比我们最初绑定到P2P客户端的所有ip:端口信息,以及2)确保P2P客户端或注册服务器频繁地重新发送数据 - 每秒一次似乎很好,我们的目的是永久绑定到公共IP:端口为111.111.50.34:5627,在我们的示例中。
作为我们协议的一部分,我们不只是将无用的数据包发送回注册的P2P客户端。我们发送该客户端组/ clique / domain /中的所有P2P客户端的相关公共IP:端口配对。基本上,我们发送注册服务器知道的与P2P客户端相关的所有内容的P2P客户端发现信息。
例如,假设有两个P2P客户端通过111提供商提供的消息通过111.111.50.34:5627和111.111.37.24:15234 ip:端口绑定向注册服务器发送消息。一个新的P2P客户端从111.111.70.105:7000连接,我们在一个简单的列表中回复其他两个端点:
[Registry Response for P2P Client #3]
111.111.50.34:5627
111.111.37.24:15234
现在,在P2P客户端#3端,您可以使用此列表并将其用作P2P应用程序的潜在端点。这些是你的P2P同行。您可以通过您注册的同一个套接字创建UDP数据包,只要它们不在保守的防火墙之后(例如手机上的移动连接热点,根据我的经验传统上设计用于阻止临时端口上的所有入站UDP流量)没有可用于启用端口转发的配置设置的绑定)和流量应该能够在两个方向上流动。
如前所述,为了保持P2P UDP连接有效,您基本上只需要定期向/从此端点重新发送数据,以保持公共IP:端口绑定在保护P2P客户端的每个防火墙上保持活动和活动状态。这可以通过定期向公共注册服务器重新发送注册信息和/或从其他P2P客户端接收UDP数据包到4G防火墙已分配给您的P2P客户端的公共IP:端口来完成。
答案 1 :(得分:1)
为什么不能绕过3G网络NAT?
归结为统计数据。为了建立连接,您必须将数据包发送到它们所在的端口,并且必须将数据包发送到您所在的端口。如果您发送错误的端口号或发送错误的端口号,您将错过并且未建立任何连接。如果你们两个同时绑定到一个端口并发送一个指向另一个IP地址的数据包,你在一个65535中有一个(65535是ip地址上的端口数),有机会将数据包发送到他们的端口,他们有大概有1到65535的机会将数据包发送到您的端口。因此建立连接的机会是(1/65535)*(1/65535)或(1/65535 ^ 2)。
您无法知道任何后续连接的端口号,因为对于每个新的出站连接,路由器会在1024到65535之间的间隔内随机为您提供一个新的端口号。因此,如果您询问服务器您的IP和端口是什么数字是,它可能告诉你正确的IP(你的IP地址不会经常改变,除非你关闭手机或类似的东西),但端口号将改变。如果您尝试猜测端口号有((65535-1024-1)/(65535-1024)),或者您认为错误的99.998%更改,假设可供选择的端口号的数量是( 65535-1024)。
因此,除非端口号是可预测的(在许多4G网络中它们不是这样),否则你就没有机会了。
答案 2 :(得分:0)
Wikipedia claims运营商级NAT 可以遍历P2P应用程序,即使存在端口共享:
上述技术在CGN中运行良好。 CGN也可以 利用端口重载行为,这意味着不同 具有相同端口值的内部端点可以映射到相同的端点 公共端点。这并没有打破5-uple的独特性 {协议,公共地址,公共端口,远程地址,远程端口} 因此是可以接受的。 TCP端口保存也可能导致案件 CGN端口过载的地方,不是协议的问题 稳健。 TCP的端口重载允许CGN适合更多主机 内部同时保留TCP端到端通信保证。
但是,该段没有引用参考文献。
答案 3 :(得分:0)
对于运营商,他们可能不会选择与您的内部客户端相同的外部端口。这打破了TCP和UDP打孔。见这里:
答案 4 :(得分:0)
有可能,您无法准确猜出端口号。您可能会稍微离开并且无法建立连接。对于可以在对称和大规模NAT上工作的更强大的打孔方法,请尝试以下方法之一: