UDP"打洞"原理
1. NAT分类
根据Stun协议(RFC3489),NAT大致分为下面四类
1) Full Cone
这种NAT内部的机器A连接过外网机器C后,NAT会打开一个端口.然后外网的任何发到这个打开的端口的UDP数据报都可以到达A.不管是不是C发过来的.
例如 A:192.168.8.100 NAT:202.100.100.100 C:292.88.88.88
A(192.168.8.100:5000) -> NAT(202.100.100.100 : 8000) -> C(292.88.88.88:2000)
任何发送到 NAT(202.100.100.100:8000)的数据都可以到达A(192.168.8.100:5000)
2) Restricted Cone
这种NAT内部的机器A连接过外网的机器C后,NAT打开一个端口.然后C可以用任何端口和A通信.其他的外网机器不行.
例如 A:192.168.8.100 NAT:202.100.100.100 C:292.88.88.88
A(192.168.8.100:5000) -> NAT(202.100.100.100 : 8000) -> C(292.88.88.88:2000)
任何从C发送到 NAT(202.100.100.100:8000)的数据都可以到达A(192.168.8.100:5000)
3) Port Restricted Cone
这种NAT内部的机器A连接过外网的机器C后,NAT打开一个端口.然后C可以用原来的端口和A通信.其他的外网机器不行.
例如 A:192.168.8.100 NAT:202.100.100.100 C:292.88.88.88
A(192.168.8.100:5000) -> NAT(202.100.100.100 : 8000) -> C(292.88.88.88:2000)
C(202.88.88.88:2000)发送到 NAT(202.100.100.100:8000)的数据都可以到达A(192.168.8.100:5000)
以上三种NAT通称Cone NAT.我们只能用这种NAT进行UDP打洞.
4) Symmetic
对于这种NAT.连接不同的外部目标.原来NAT打开的端口会变化.而Cone NAT不会.虽然可以用端口猜测.但是成功的概率很小.因此放弃这种NAT的UDP打洞.
2. UDP hole punching
对于Cone NAT.要采用UDP打洞.需要一个公网机器C来充当”介绍人”.内网的A,B先分别和C通信.打开各自的NAT端口.C这个时候知道A,B的公网 IP:Port. 现在A和B想直接连接.比如A给B发.除非B是Full Cone.否则不能通信.反之亦然.但是我们可以这样.
A要连接B.A给B发一个UDP包.同时.A让那个介绍人给B发一个命令,让B同时给A发一个UDP包.这样双方的NAT都会记录对方的IP,然后就会允许互相通信.
3. 同一个NAT后面的情况
如果A,B在同一个NAT后面.如果用上面的技术来进行互连.那么如果NAT支持loopback(就是本地到本地的转换),A,B可以连接,但是比较浪费带宽和NAT.有一种办法是,A,B和介绍人通信的时候,同时把自己的local IP也告诉服务器.A,B通信的时候,同时发local ip和公网IP.谁先到就用哪个IP.但是local ip就有可能不知道发到什么地方去了.比如A,B在不同的NAT后面但是他们各自的local ip段一样.A给B的local IP发的UDP就可能发给自己内部网里面的某某某了.
还有一个办法是服务器来判断A,B是否在一个NAT后面.(网络拓朴不同会不会有问题?)
--------------------------------------------------------------------------------------------------------------------------
From: http://hi.baidu.com/ligh0721/blog/item/0cbbc9384106252b96ddd872.html
前天编程做了一下UDP打洞的实验,今天特写了一篇文章总结一下。
我们知道网络上两个主机进行通信,如果其中一台主机拥有公网IP那么,那么进行会话是比较简单的,但是如果两台主机是位于不同内网之中的,那么应该如何进行通信呢。一种想法是再找一台公网的服务器,用来转发信息,但是这有一个问题,就是会给服务器带来压力,因此我们就来谈谈一种用于不同内网中的主机互相通信的一个解决方案——NAT打洞。
原理还是比较简单的,我们先了解一下什么是“NAT的洞”。当处于内网中的一台主机(ClientA/192.168.1.128)向一个公网的服务器 (Server)发送数据时,这时NAT(NAT1)将会打开一个临时性的端口用于与公网的服务器进行通信,并且会把那个内网主机发送出的IP数据报的头部中源IP地址改为NAT的公网IP(218.7.32.28),将TCP或UDP数据报中源端口(2347)改为那个临时端口(26756)这样就实现了由 “192.168.1.128:2347”到“218.7.32.28:26756”的源地址源端口的转换。这个数据包到达公网服务器后,服务器就可以根据这个包的头部信息进行回复。当服务器的数据包到达NAT后,NAT在将这个数据发送到内网主机192.168.1.128的2347端口。那么这个 NAT上的26756端口我们就称作“洞”。如果这个NAT不是Full Cone NAT的话(其实大多数的NAT确实不是这种类型的),那么我们说这个“洞”是有方向性的。一个洞应该会指向一个(也可以是多个)公网主机的IP地址。比如上面说的例子,在NAT1上打的洞是指向Server的IP地址。来自其他公网主机发向这个洞(也就是218.7.32.28:26756)的数据包会被非Full Cone类型的NAT所丢弃。所以如果有另一台处于另一内网的主机(ClientB/192.168.0.5)向218.7.32.28:26756直接发送数据的话,同样也会被NAT1丢弃。
那么如何建立ClientA和ClientB的直接会话呢?
网络环境描述:
内网1NAT:NAT1/218.7.32.28
内网1中一台主机:ClientA/192.168.1.128
内网2NAT:NAT2/218.7.31.221
内网2中一台主机:ClientB/192.168.0.5
公网服务器:Server
首先让ClientA和ClientB登录到服务器Server(假如两台主机都采用2347端口),此时NAT1和NAT2会分别为ClientA和 ClientB打开一个指向Server的洞(NAT1上218.7.32.28:26756和NAT2上218.7.31.221:27550)。服务器应改记录这两个客户端的信息(关键是那两个洞的信息)。当ClientA与ClientB要建立会话时,ClientA首先用2347端口向NAT2的洞发送一个数据包,当然这个数据包会被NAT2所丢弃,但是由于这是从NAT1内部向外部发送数据,所以NAT1为ClientA打开了一个指向NAT2 的洞。而且这个新洞与原来NAT1上指向Server的旧洞的是同一个洞(因为是同一个端口26756),所以这里可以说这个洞具有了两个方向,同时指向 Server和NAT2。这时ClientA应该通知Server,告诉ClientB,现在可以向NAT1的那个洞 (218.7.32.28:26756)发送数据包了。当ClientB向NAT1的那个洞发送数据以后,NAT2也为ClientB打了一个指向 NAT1的洞,这是可以说ClientA与ClientB的会话就建立完成了,他们可以不依赖Server进行通信了。如果以后ClientA和 ClientB还需要建立其他会话 ,那么这个牵线的“媒人”可以不是Server,而可以是ClientA或ClientB了。
UDP打洞可以实现不同内网内的主机进行通信,而且实施性比较高,一般用于P2P通信。这也就是为什么常会看见腾讯QQ在开始传输文件时会显示“UDP连接已经建立”了
相关推荐
UDP打洞技术是一种在NAT(网络地址转换)环境下实现...总之,这个项目提供了一个实用的示例,展示了如何利用UDP打洞技术穿透NAT,实现P2P通信。对于想要深入理解网络编程和P2P技术的人来说,这是一个非常有价值的资源。
UDP打洞是一种网络技术,主要用于穿透NAT(网络地址转换)网络,使位于不同NAT后的设备能够直接通信。在互联网环境中,许多设备都通过NAT连接,这使得它们拥有私有IP地址,无法直接相互连接。UDP打洞解决了这个问题...
NAT的实现机制对了解UDP打洞技术穿透NAT至关重要。对于NAPT来说,当私网中的计算机(如ClientA)使用UDP协议发送数据到公网的服务器时,NAPT设备会创建一个会话(Session),同时将数据包的源IP地址和源端口号进行...
**C# UDP打洞NAT技术详解** 在现代网络环境中,由于广泛使用了网络地址转换(Network Address Translation, NAT),很多设备无法直接进行对等网络(P2P, Peer-to-Peer)通信。NAT技术使得内部网络的设备可以通过一...
udp 穿透, 传透NAT,打洞。不仅有文档的介绍,将原理介绍清楚,而且有可以直接运行的源码。学习udp打洞的好资料。
UDP打洞技术是一种在NAT(网络地址转换)环境下实现两个位于不同内网的设备间直接通信的方法。在互联网上,许多设备通过NAT连接,这使得它们不能直接与外部网络中的其他设备通信,因为它们都有相同的公共IP地址。UDP...
PeerToPeer打洞 UDP穿墙NAT c源代码
本文将深入探讨UDP穿透NAT的原理以及其实现方法。 NAT工作原理: NAT的主要作用是将内部网络的私有IP地址映射为外部网络的公共IP地址,从而解决IP地址短缺的问题。当内部主机向外部发送数据时,NAT会记录源IP和端口...
UDP打洞(UDP Hole Punching)是一种通过NAT(网络地址转换)技术,使两个位于不同内网的设备能够直接通信的技术。在C#中实现UDP打洞,主要是利用了UDP协议的特性以及对NAT行为的理解。下面将详细介绍这个过程。 ...
UDP打洞是一种穿透NAT的技术,通过两个位于NAT后的设备互相发送数据包,诱使NAT为它们打开一个“洞”,允许它们之间的直接通信。这个过程通常涉及三个步骤:首先,客户端A和B分别向公共服务器发送数据包;然后,...
UDP打洞的关键在于“穿透”NAT,实现这一目标通常有两种方法:被动打洞和主动打洞。被动打洞依赖于外部服务器作为中介,由其中一个内网设备(A)向服务器发送请求,服务器将这个请求转发给另一个内网设备(B),B...
UDP打洞相关的资料,包括原理,说明,以后相关的源码,是学习udp打洞的绝好资料。自己用过,感觉不错。
UDP打洞技术是一种在NAT(网络地址转换)环境下实现两个位于不同内网的设备间直接通信的方法。在互联网上,许多用户设备由于IP地址稀缺,通常会通过NAT进行地址转换,这使得它们不能直接与其他内网设备通信。UDP打洞...
UDP打洞技术是一种在NAT(网络地址转换)环境下实现两个私有网络内的主机之间直接通信的方法。在互联网上,许多设备由于连接到ISP时采用了NAT,它们的公网IP实际上是路由器分配的内部IP,因此不能直接与其他网络的...
1. **UDP打洞**:由于NAT的存在,直接的P2P通信通常无法进行。UDP打洞技术就是解决这个问题的方法。它利用了NAT的特性,即NAT会记住从内部设备发起的出站连接,并允许来自同一外部地址的返回数据包通过。打洞的过程...
UDP打洞技术是一种在NAT(网络地址转换)环境下实现两个私有网络主机之间直接通信的方法,常用于P2P应用、多人在线游戏等场景。本文将深入探讨C#实现的UDP打洞服务端和客户端的关键知识点。 1. **UDP基础**: UDP...
UDP打洞技术是一种在NAT(网络地址转换)环境下实现两个私有IP地址之间直接通信的方法,常用于P2P(点对点)通信。在本文中,我们将深入探讨C语言实现UDP打洞的原理、步骤以及代码实现的关键点。 首先,理解UDP打洞...
标签"udp打洞通信测试"进一步确认了这个项目的核心内容,即通过UDP进行穿透NAT的通信测试。 压缩包内的文件名称列表揭示了具体的内容: 1. `udp打洞通信.doc`:可能是一个文档,详细解释了UDP打洞通信的概念、原理...
UDP打洞技术作为一种有效的NAT穿透方案,为P2P通信提供了解决方案。通过合理的操作流程设计和中间服务器的帮助,即使在网络地址转换设备的存在下,也能实现两台主机间的直接通信。随着IPv6的逐步普及,NAT带来的问题...