首先,Client A登录服务器,NAT A为这次的Session分配了一个端口60000,那么Server S收到的Client A的地址是202.187.45.3:60000,这就是Client A的外网地址了。同样,Client B登录Server S,NAT B给此次Session分配的端口是40000,那么Server S收到的B的地址是187.34.1.56:40000。
此时,Client A与Client B都可以与Server S通信了。如果Client A此时想直接发送信息给Client B,那么他可以从Server S那儿获得B的公网地址187.34.1.56:40000,是不是Client A向这个地址发送信息Client B就能收到了呢?答案是不行,因为如果这样发送信息,NAT B会将这个信息丢弃(因为这样的信息是不请自来的,为了安全,大多数NAT都会执行丢弃动作)。现在我们需要的是在NAT B上打一个方向为202.187.45.3(即Client A的外网地址)的洞,那么Client A发送到187.34.1.56:40000的信息,Client B就能收到了。这个打洞命令由谁来发呢,呵呵,当然是Server S。
总结一下这个过程:如果Client A想向Client B发送信息,那么Client A发送命令给Server S,请求Server S命令Client B向Client A方向打洞。呵呵,是不是很绕口,不过没关系,想一想就很清楚了,何况还有源代码呢(侯老师说过:在源代码面前没有秘密 8)),然后Client A就可以通过Client B的外网地址与Client B通信了。
注意:以上过程只适合于Cone NAT的情况,如果是Symmetric NAT,那么当Client B向Client A打洞的端口已经重新分配了,Client B将无法知道这个端口(如果Symmetric NAT的端口是顺序分配的,那么我们或许可以猜测这个端口号,可是由于可能导致失败的因素太多,我们不推荐这种猜测端口的方法)。
分享到:
相关推荐
C# udp NAT打洞客户端,可以实现不能局域网的通信,亲测,测试请需要设置一个IP地址,这个IP地址为外网的IP地址,如果没有外网的IP地址,请通过路由器设置DMZ主机地址,也可以实现外网的功能,UDP NAT的原理可以在我...
实现两台NAT内主机之间的通信,基于UDP传输协议,VC写的
C# udp NAT打洞服务端,服务端必须放置在有外网IP的服务器上, 可以实现不能局域网的通信,亲测,测试请需要设置一个IP地址,这个IP地址为外网的IP地址,如果没有外网的IP地址,请通过路由器设置DMZ主机地址,也可以...
udp 穿透, 传透NAT,打洞。不仅有文档的介绍,将原理介绍清楚,而且有可以直接运行的源码。学习udp打洞的好资料。
C#UDP打洞NAT C#UDP打洞NAT C#UDP打洞NAT
python nat p2p打洞压测程序
UDP打洞相关的资料,包括原理,说明,以后相关的源码,是学习udp打洞的绝好资料。自己用过,感觉不错。
超经典的TCP打洞程度源代码。目前网上的全是UDP打洞,很少有TCP方面的。
用纯java代码写的点对点打洞技术,非常使用。希望对大家用帮助。
udp的nat打洞源码,vc6下编译通过,打洞成功。
就是非常有名的“UDP打洞技术”,UDP打洞技术依赖于由公共防火墙和cone NAT,允许适当的有计划的端对端应用程序通过NAT“打洞”,即使当双方的主机都处于NAT之后。这种技术在 RFC3027的5.1节[NAT PROT] 中进行了重点...
讲解如果通过NAT打洞来实现P2P打洞,资料中包含源码。
C# UDP穿越NAT,UDP打洞,UDP Hole Punching源代码
用C# 实现 UDP 穿越NAT UDP打洞 有全部源码和原理阐述
相关的技术详细资料,图文相结合,更有利于大家的学习
实现了子网间NAT、网络通信功能;首先服务器上运行server,在两个不同子网下运行client并连接服务器,然后选择通信,当两个client互相收发到数据后,打洞就成功了。
C# UDP穿越NAT打洞,可在广域网实现仿qq即时通讯,点对点发送消息。
UDP打洞实现了子网间的穿透功能,首先在一台拥有公网IP服务器上运行server,在不同的两个子网PC上运行client,输入服务器IP,即可进行打洞,实现不同子网的通信。
较详细的介绍了NAT原理,TCP打洞的原理以及附带TCP打洞的源码,具有较好的参考价值。
PeerToPeer打洞 UDP穿墙NAT c源代码