Networking 为什么不能绕过3G网络NAT?

Networking 为什么不能绕过3G网络NAT?,networking,3g,nat,Networking,3g,Nat,我正在开发一个p2p聊天应用程序,它可以在DSL和两个不同的NAT上正常工作,但是当涉及到3G USB互联网连接时,它就失败了 我发现在3g网络中不可能绕过NAT,而已知的p2p应用程序,如Skype和torrents,也无法绕过3g网络,只要它们遇到这些问题,就会通过中央服务器发送数据 我想知道3g网络的架构是什么。我听说他们没有专用IP,端口对只有公共IP,端口可用,一个公共端口可以分配给多个设备,对吗?若有,服务器如何向3g网络发送数据 即使存在端口共享,P2P应用程序也可以通过Wikip

我正在开发一个p2p聊天应用程序,它可以在DSL和两个不同的NAT上正常工作,但是当涉及到3G USB互联网连接时,它就失败了

我发现在3g网络中不可能绕过NAT,而已知的p2p应用程序,如Skype和torrents,也无法绕过3g网络,只要它们遇到这些问题,就会通过中央服务器发送数据

我想知道3g网络的架构是什么。我听说他们没有专用IP,端口对只有公共IP,端口可用,一个公共端口可以分配给多个设备,对吗?若有,服务器如何向3g网络发送数据

即使存在端口共享,P2P应用程序也可以通过Wikipedia运营商级NAT:

上述技术在CGN中运行良好。CGN也可以 利用端口重载行为,这意味着 具有相同端口值的内部端点可以映射到相同端口 公共端点。这不会破坏5-uple的唯一性 {协议,公共地址,公共端口,远程地址,远程端口} 因此是可以接受的。TCP端口保留也可能导致以下情况 当CGN端口过载且不是协议的问题时 健全性。TCP端口重载允许CGN适应更多主机 在内部,同时保留TCP端到端通信保证


但是,该段未引用任何参考文献。

对于运营商,他们可能不会选择与您的内部客户端相同的外部端口。这会破坏TCP和UDP穿孔。请看这里:


这是可能的,您无法准确猜出端口号。您可能有点走火入魔,无法建立连接。对于可能适用于对称和大规模NAT的更稳健的打孔方法,请尝试以下方法之一:

  • 为什么不能绕过3G网络NAT

    这归结为统计数字。为了建立连接,您必须将数据包发送到他们所在的端口,并且他们必须将数据包发送到您所在的端口。如果您发送到错误的端口号,或者他们发送到错误的端口号,则您将丢失,并且无法建立连接。如果双方同时绑定到一个端口并发送一个指向另一方ip地址的数据包,则有1/65535(65535是ip地址上的端口数)的机会将数据包发送到他们的端口,并且他们有大约1/65535的机会将数据包发送到您的端口。因此,您建立连接的机会是(1/65535)*(1/65535)或(1/65535^2)

    您无法知道任何后续连接的端口号,因为对于每个新的出站连接,路由器都会在1024到65535之间的时间间隔内随机为您提供一个新的端口号。因此,如果你问服务器你的ip和端口号是什么,它可能会告诉你正确的ip(你的ip地址不会经常改变,除非你关掉手机或类似的东西),但端口号会改变。如果您试图猜测端口号,则存在((65535-1024-1)/(65535-1024)),或者假设可供选择的端口号的数量为(65535-1024),则猜测错误的几率为99.998%


    因此,除非端口号是可预测的(在许多4G网络中,端口号不是可预测的),否则你就没有机会了。

    我正在为多代理系统开发开源中间件,最近我们不得不为4G/3G网络上的p2p使用创建一个基于UDP的传输选项。我们已经在T Mobile的数据计划以及NATs背后的各种学术网络上对此进行了测试,目前我对其实现非常有信心。由于这个问题似乎没有任何可靠的解决方案,我想我会通过REGISTRY_CLIENT transport选项与大家分享我们目前在MADARA中间件()中实现的解决方案类型

    对于我们来说,我们为P2P端点选择了您可能称之为注册服务器或名称服务(如果您熟悉CORBA的话)。注册表服务器需要在UDP可以通过单向消息到达的某个公共ip:端口上运行。在我们的测试中,我们租用了一个AmazonEC2节点,并确保防火墙设置允许UDP流量通过我们要绑定的UDP端口。在服务器端(注册表服务器的公共ip:port配对),我们绑定到端口并等待客户端注册。任何想要与他人对话的P2P客户端都会向注册表服务器发送一条注册表消息

    P2P client ----> [register message] ---> Registry Server
    
    register消息可以包含任意内容。实际上,我们的数据协议除了一个消息头之外没有其他内容。在服务器端,我们通过正常的套接字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发送返回消息,而不是通过我们提供的任何ip:port信息
    [Registry Response for P2P Client #3]
    111.111.50.34:5627
    111.111.37.24:15234