内网穿透&UDP打洞
这两天找度度重新回忆了一下关于内网穿透的事情,在百度文库上找到了两三篇写的比较通俗易懂的文章,把内网穿透做个简单总结。
首先文章建议 Cone NAPT 还有希望,要是 Symmetri NAPT 就别想了,接着介绍了两种基本情况,一是一台内网机器连接外网通信的情况,二是两台内网之间互联的情况。
第一种,只需要内网主动发起连接就可以了。内网机器A(192.168.1.x:4000)要求连接外网服务端S(60.17.211.x:5000),发出连接请求后被A网所在网关NA(10.11.12.x)获取,NA将A的地址转变为其自身地址,并分配临时端口(6000)用作通讯,于是,当初的 A->S 就变成现在的 A->NA->S。那么S接到请求后看到的并不是A的地址,而是NA的IP和Port,此时S如果照着此地址回复,则NA收到,因为NA此时有通讯临时Session被创建了,所以在一定时间内(貌似根据不同硬件、软件设备而不同)还记得发到6000的信息要转给A,NA就会转发给A。至此,通讯成功。
第二种,两个内网之间就要复杂一些,有一个图很好,我转载了一下,特别声明,是从百度文库截图下来的。
这个图很清晰,做个简单备注就可以了。
首先,两个内网A和B谁都不能直接连谁,所以第一次,都是给S发送登录、心跳之类的,目的是表明自己的存在,并建立session,当然,这个过程还是通过自身网络的N实现的。那么,如何做到UDP穿透呢?
1. 假设左边的为A(192.168.1.77:8000),A->NA(211.133.*:6000)->S,此时,S记住了 A 的存在,NA也与A建立了对应关系(发到6000的信息就是A的),一样道理,B也与S建立了连接。
2. A通过S知道了B的存在(只是知道存在),A想连B,于是A告诉S,“让B探测我一下”
3. S把A的要求发给B,于是B发送“探测”包给A,事实上就是 B->NB->NA,但是因为 NA 不认识 NB(之前没联系过),所以 NA 就不会转发给 A,随之丢弃。但是 NB 上已经建立起了目的是 NA 的 session,这是后面打洞成功的关键一步。
4. B 发送探测给 A 之后,因为 NA 必定丢弃,所以 B 向 S 发送“反馈包”,就是图中的步骤 4,目的是告诉 S 已经发送过探测包给 A 了。这一步的目的是,借 S 之手告诉 A ,我已经联系过你了,我已经有了关于你的 session 。
5. S 通知 A:“人家 B 已经联系过你了”。
6. A 知道之后,发送数据包给 B ,也就是 A->NA->NB->B。当 NA->NB 时,因为 NB 存有当初链接 NA 的信息,所以 NB 认为它自己认识 NA ,会接受 NA 发送的信息,转发给 B,至此,理论上,打洞完成。AB之间可以互通了。还未经过自己试验,不知道对不对。
图中右上角步骤2中的文字“...给NAT211.134.*”应该是错误的,正确的应该是“211.133.*”,因为是 S 让 B 去连接 A,而 A 的地址是 211.133.*,另外还有几点疑惑和说明的地方
1. “信息不请自来,NAT 安全起见,是会被丢弃的”——A->NA->S 时,NA 接到请求会创建 session ,分配某端口如6000对应 A ,目的是接到发到 6000 端口上的信息就知道转发给 A,但只会接受当初 A 所请求的远程主机 S 所发过来的信息才会转发给 A,其它地址则会丢弃。这也是为什么两个内网不能直接互发的原因,举个例子就是洞还没打,外界发过来的信息,也会被看门人 NA 给扔掉,因 NA 那有一个记录表,A 曾经要求连接 S,这条记录就会有关于 S 的信息,比如另一台 S2 发过来同样的 6000 端口信息,由于 NA 没有记录不认识 S2 ,是会丢弃不会转发的。
2. 打洞要从内部向外部打,S 想连接 A,A 向 S 打洞(发起连接)。A 想连接 B,要通过 S 告诉 B 让 B 向 A 打洞,B 打完 A 沿此路打回去,才能成功。
分享到:
相关推荐
java 实现内网穿透,udp 打洞,NAT 穿透原理 1,客户端A登陆的时候,发送一个UDP数据包给服务器,然后服务器根据该包获得客户端A的IP和端口并保存到UdpAddressMap(用登录名作为key保存)中。 2,客户端A执行操作的...
UDP打洞是一种网络技术,主要用于穿透NAT(网络地址转换)网络,使位于不同NAT后的设备能够直接通信。在互联网环境中,许多设备都通过NAT连接,这使得它们拥有私有IP地址,无法直接相互连接。UDP打洞解决了这个问题...
UDP打洞技术是一种在NAT(网络地址转换)环境下实现两个位于不同内网的设备间直接通信的方法。在互联网上,许多设备通过NAT连接,这使得它们不能直接与外部网络中的其他设备通信,因为它们都有相同的公共IP地址。UDP...
UDP打洞就是为了解决这个问题,让两个内网设备能够直接交换数据,而无需通过服务器作为中介。 首先,我们要理解UDP(用户数据报协议)的特点。UDP是一个无连接的、不可靠的传输协议,它不保证数据包的顺序和完整性...
UDP打洞的关键在于“穿透”NAT,实现这一目标通常有两种方法:被动打洞和主动打洞。被动打洞依赖于外部服务器作为中介,由其中一个内网设备(A)向服务器发送请求,服务器将这个请求转发给另一个内网设备(B),B...
C# UDP穿越NAT打洞,可在广域网实现仿qq即时通讯,点对点发送消息。
UDP打洞技术是一种在NAT(网络地址转换)环境下实现两个私有网络内的主机之间直接通信的方法。在互联网上,许多设备由于连接到ISP时采用了NAT,它们的公网IP实际上是路由器分配的内部IP,因此不能直接与其他网络的...
UDP打洞技术是一种在NAT(网络地址转换)环境下实现两个位于不同内网的设备间直接通信的方法。在互联网上,许多用户设备由于IP地址稀缺,通常会通过NAT进行地址转换,这使得它们不能直接与其他内网设备通信。UDP打洞...
UDP打洞(UDP Hole Punching)是一种通过NAT(网络地址转换)技术,使两个位于不同内网的设备能够直接通信的技术。在C#中实现UDP打洞,主要是利用了UDP协议的特性以及对NAT行为的理解。下面将详细介绍这个过程。 ...
UDP打洞通信是一种在NAT(网络地址转换)环境下实现两个位于不同内网的设备间直接通信的技术。在互联网上,许多设备通过NAT连接,NAT会将内部私有IP地址转换为公共IP地址,这使得直接的端到端通信变得困难。UDP打洞...
本项目“基于MFC的UDP打洞通信客户端”是利用MFC库实现的一个UDP打洞通信的应用实例,旨在帮助开发者理解和掌握如何在Windows平台上利用C++进行网络编程,特别是处理NAT穿透问题。 首先,我们要理解UDP打洞的基本...
PeerToPeer打洞 UDP穿墙NAT c源代码
标题中的“测试udp打洞”指的是利用UDP协议进行P2P(Peer-to-Peer)网络穿透技术的测试。P2P技术允许网络上的设备直接通信,而无需通过中心服务器,从而节省带宽并提高效率。UDP(User Datagram Protocol)是一种无...
UDP打洞技术是一种在NAT(网络地址转换)环境下实现两个私有网络主机间通信的方法。在互联网上,由于IP地址的稀缺性,许多设备通过NAT与公网交互,这导致了内网设备的IP地址对外不可见。UDP打洞正是为了解决这一问题...
UDP打洞技术是一种在NAT(网络地址转换)环境下实现两个私有网络主机之间直接通信的方法,常用于P2P应用。在这个场景中,我们讨论的是一个基于C#编程语言编写的UDP打洞测试程序。这个程序的目标是帮助开发者理解和...
在UDP打洞中,设备A向STUN/TURN服务器发送请求,服务器会返回A的公网IP和端口信息,然后设备B可以通过这个信息向A发送数据。 在Netty中,实现UDP打洞的关键步骤如下: 1. **创建Netty Channel**: 首先,我们需要...
### TCP/UDP打洞技术详解 #### 一、引言 随着互联网的快速发展和技术进步,P2P(Peer-to-Peer)通信已成为一种常见的网络应用形式。然而,NAT(Network Address Translation,网络地址转换)的存在给P2P通信带来了...
总之,UDP打洞技术是解决内网主机间通信问题的有效手段,而易语言提供了一种方便的编程环境来实现这一技术。通过学习和实践“UDP打洞-易语言版”的源代码,你将能够更好地理解UDP打洞的原理,并掌握在易语言中实现这...
首先,理解UDP打洞的概念至关重要。打洞技术主要是通过两个位于NAT后的设备互相发送数据包,诱使NAT设备为它们创建一条直接通信的通道。这种技术通常分为服务器辅助和纯P2P两种模式。在C#中,我们通常采用服务器辅助...
标题“c# udp打洞聊天实例”指的是使用C#实现UDP协议进行穿透内网的聊天应用。内网穿透,又称为NAT穿越,是解决内网用户之间直接通信问题的一种技术,因为常规情况下,内网用户的IP地址对外不可见,需要通过这种方式...