P2P打洞源理介绍
- 格式:doc
- 大小:41.00 KB
- 文档页数:3
穿越NAT的意义:NAT是为了节省IP地址而设计的,但它隐藏了内网机器的地址,“意外”起到了安全的作用。
对外不可见,不透明的内部网络也与互联网的“公平”应用,“相互共享”的思想所不容,尤其是P2P网络中“相互服务”的宗旨,所以穿越NAT,让众多内部网络的机器也参与到P2P 网络中的大集体中来,一直是P2P开发者的所希望的。
穿越NAT需要借助外部的支持,说白了就是“内外勾结”,骗过NAT。
很多P2P网络成功地实现了这一目标,但还是有一些“遗憾”---并非所有的情况下都可以。
由于客户端是主动登录P2P网络才可穿越,所以P2P的方式也没有违背企业的内部管理原则,毕竟“自由世界”的加入都是自觉自愿的。
NAT原理:NAT(Network Address Translation)网络地址转换/网络地址翻译。
工作原理:NAT主要的通过对数据包头的地址替换来完成内网计算机访问外网服务的。
当内部机器要访问外部网络时,NAT设备把内部的IP1与端口号1(网络层地址与传输层地址),转换成NAT的外部IP2与新的端口号2,再送给外部网络,数据返回时,再把目的为IP2:端口2的数据包替换为IP1:端口1,送给内网机器。
若通讯协议的内容中有IP地址的传递,如FTP协议,NAT在翻译时还要注意数据包内涉及协议地址交互的地方也要替换,否则协议就会出现地址混乱。
在NAT设备中维护了这个要替换地址的映射表,并根据内部计算机的通讯需求维护该表。
外部网络来数据包能否进入NAT,主要是看是否已经有可映射的表项,若没有就会丢弃。
NAT的外部公网地址可以是一个IP,也可以是一个网段,形成地址池。
NAT还可以把某个外网地址直接影射给内网的某个服务器,让外网的用户可以直接访问到这台服务器。
NAT的工作的隐藏内网的机器,但允许内网主动打开到外网的通讯“通道”,也就是建立映射表项。
NAT给P2P带来的问题是:NAT只允许单方面发起连接,通讯的双方不是平等的,P2P 网络的基础有了问题,具体的表现为:内网主机IP是私有的,外部主机看不到,也无法主动发起连接即使知道了内网IP,但NAT会丢弃没有在影射表的数据包内网主机可以作为客户端访问外网,但不能作为服务器提供服务当两个主机都位于各自的NAT之后,要实现P2P的连接,就不仅是谁主动的问题,而是如何解决在两个NAT上同时有对方映射表项的问题。
打洞原理的应用引言打洞原理是一种常见的网络通信技术,在网络安全和软件开发中具有重要的应用。
本文将介绍打洞原理的基本概念和原理,并介绍其在实际应用中的一些典型案例。
打洞原理概述打洞原理,也称为NAT穿越技术,是通过一系列技术手段实现在网络环境中突破防火墙、NAT和代理等设备的限制,建立两个位于不同私有网络中的主机之间的直接通信。
通过打洞原理,可以实现点对点的直接连接,跨越了传统网络中的限制,大大提升了网络通信的效率和便利性。
打洞原理的基本原理1.NAT设备的穿越:在私有网络中,通常会使用NAT设备来将内部IP地址和端口映射到公共网络上,这会导致两个位于不同私有网络中的主机无法直接通信。
打洞原理通过一系列技术手段,绕过NAT设备,使得两个私有网络中的主机能够直接通信。
2.UDP通信的特性:打洞原理通常使用UDP协议进行通信,因为UDP协议相比于TCP协议,具有更好的穿透性。
UDP协议与TCP协议不同,不需要经过三次握手等繁琐的过程,而是直接发送数据包,因此能够更容易地穿越网络设备。
3.中间服务器的协助:在打洞原理中,通常会借助第三方的服务器进行协助。
这个服务器在两个私有网络中的主机之间起到中转的作用,帮助建立直接的通信通道。
通过合理的协议设计和中转服务器的存在,打洞原理能够实现两个私有网络中的主机之间的直接通信。
打洞原理的应用场景1.P2P文件共享:在P2P文件共享中,通常会涉及到直接点对点的通信。
打洞原理能够帮助不同私有网络中的用户建立直接的通信通道,加快文件传输的速度和效率。
2.实时语音视频通话:在实时语音视频通话中,需要实现低延迟和高质量的通信。
打洞原理可以帮助不同私有网络中的用户建立直接的通信通道,提升通话质量和稳定性。
3.远程桌面控制:在远程桌面控制中,需要实现即时响应和快速传输。
打洞原理可以帮助远程主机与客户端建立直接的通信通道,提供更流畅的使用体验。
4.多人网络游戏:在多人网络游戏中,需要实现实时的数据交互和同步。
P2P通信原理与实现(C++),NAT,网络穿透原理1.简介当今互联网到处存在着一些中间件(MIddleBoxes),如NAT和防火墙,导致两个(不在同一内网)中的客户端无法直接通信。
这些问题即便是到了IPV6时代也会存在,因为即使不需要NAT,但还有其他中间件如防火墙阻挡了链接的建立。
当今部署的中间件大多都是在C/S架构上设计的,其中相对隐匿的客户机主动向周知的服务端(拥有静态IP地址和DNS名称)发起链接请求。
大多数中间件实现了一种非对称的通讯模型,即内网中的主机可以初始化对外的链接,而外网的主机却不能初始化对内网的链接,除非经过中间件管理员特殊配置。
在中间件为常见的NAPT的情况下(也是本文主要讨论的),内网中的客户端没有单独的公网IP 地址,而是通过NAPT转换,和其他同一内网用户共享一个公网IP。
这种内网主机隐藏在中间件后的不可访问性对于一些客户端软件如浏览器来说并不是一个问题,因为其只需要初始化对外的链接,从某方面来看反而还对隐私保护有好处。
然而在P2P应用中,内网主机(客户端)需要对另外的终端(Peer)直接建立链接,但是发起者和响应者可能在不同的中间件后面,两者都没有公网IP地址。
而外部对NAT公网IP和端口主动的链接或数据都会因内网未请求被丢弃掉。
本文讨论的就是如何跨越NAT实现内网主机直接通讯的问题。
详解,网络穿透,P2P,打洞的核心原理视频讲解:「链接」P2P丨网络穿透与NAT原理分析:「链接」2.术语防火墙(Firewall):防火墙主要限制内网和公网的通讯,通常丢弃未经许可的数据包。
防火墙会检测(但是不修改)试图进入内网数据包的IP地址和TCP/UDP端口信息。
网络地址转换器(NAT):NAT不止检查进入数据包的头部,而且对其进行修改,从而实现同一内网中不同主机共用更少的公网IP(通常是一个)。
基本NAT(Basic NAT):基本NAT会将内网主机的IP地址映射为一个公网IP,不改变其TCP/UDP端口号。
P2P设计文档1.1 系统总体架构及关键流程1.客户端服务器分布打洞方案一P2P穿越nat可以分为两步:(1)识别通信双方是哪种类型的nat。
需要得到NAT的类型和以下一些数据:1.UDP是否通过:UDP是否被防火墙干掉了?2.本机在公网上还是在NA T之后(局域网)?3.通信双方是否在同一局域网内4.不同目的IP的映射是否相同:映射相同则为Cone NAT,否则就是对称型5.IP是否受限:如果是Cone NA T,那么是否存在受限IP的特性6.PORT是否受限:如果是Cone NA T,那么是否存在受限端口的特性(2)针对不同类型的nat,进行nat打洞。
设通信双方为A、B,NAT分别是Na和Nb,S是服务器。
NA T类型简写对应:全锥形->FC,限制锥形->RC,端口限制锥形->PC,对称型->SN1.其中一个具有公网地址的情况:假设具有公网地址的为A,那么,A通知S:A希望与B建立通信,然后S转告B,让B主动连接A的公网地址,当B连接到A之后,A就可以通过B向A打的洞与B进行通信了,而无论B是何种类型的NA T2.其中一个是全锥形nat的情况:假设Na是FC,由于FC的特性:内网中同主机同端口与外部的所有通信都使用同一个洞,当这个洞被打开后,所有外部主机都可以使用这个洞向这个内网地址(IP:PORT)发送数据。
所以只要其中一方是FC,就可以实现双方的直接通信。
这些组合的打洞流程如下:A通知S,让S通知B向A已经存在的那个洞发送数据。
那么A是肯定可以收到B发来的这个包的,这时A再回复B,则AB间的链路成功建立。
而不论Nb是什么类型(原因同“其中一个具有公网地址的情况“)。
3.其中一个是RC的情况:RC->FC属于“其中一个属于FC的情况“,上面已经证明过,跳之。
RC->RC:令B发包给A(锥形NA T对于所有会话都使用同一个端口,所以现在他们是互相知道彼此在NA T上映射的外网地址的),此时将会被Na丢掉,因为在这个时候Na之上的洞认为:此洞为S而开(此洞在A登陆S的时候就打好了),只有S的端口可以往此洞发包(Na是受限型NAT)。
P2P原理及UDP穿透简单说明这里我们主要是是简单讲解一下UDP实现NAT的穿透(俗称打洞)NAT的全称是Network Address Translator中文称之为网络地址转换NAT分为两大类,NAT和NAPT(Network Address Port Translator)端口地址转换用于实例,简单的说,实现P2P需要一个中转服务器。
也就是需要一个第三方以简单的通迅来讲,首先我们来看一个示例图。
A<——————>BA与B之间进行的通迅A的IP地址为222.182.100.1B的IP地址为222.182.100.2如果这两个用户都是采用的全球唯一的IP地址,那么他们通迅很简单,也不需要实现P2P。
A<------------------>Nat<-------------------->B如果其中一方为内网用户,及IP地址不为全球唯一IP就会出现通过路由器进行通迅。
那么在经过路由器的时候,路由器会出现映射IP地址与端口的情况。
如:A为内网用户。
B为外网用户。
则B的IP地图为全球唯一IP地址。
可以直接通迅。
A的IP地址为:192.168.1.100 端口为1025经过路由器向B进行通迅,路由器将会产生一个一分钟到几小时不定的一个Session,这个Session映射了内网A的IP地址及其接收信息的端口。
那么路由向B发送信息的时候,IP地址及端口就变成了222.182.100.1:3645(假设)这个时候实际上A就是在进行路由NAT的穿透如果我们在B向A发送信息的时候采用192.168.1.100:1025这样的IP和端口,是找不到A的,因为这个IP不是全球唯一IP。
那么B需要的是在收到A的信息的时候,获取其IP地址和端口,那么获取到的就是222.182.100.1:3645这个路由器的映射Session地址。
B现在只需要向这个映射地址发送消息,路由器就会自动将消息发送到对应的A 方去。
p2p技术之n2n源码核⼼简单分析⼀⾸先在开篇之前介绍下内⽹打洞原理场景:⼀个服务器S1在公⽹上有⼀个IP,两个私⽹机器C1,C2C1,C2分别由NAT1和NAT2连接到公⽹,我们需要借助S1将C1,C2建⽴直接的TCP连接,即由C1向C2打⼀个洞,让C2可以沿这个洞直接连接到C1主机,也就成了局域⽹访问的模式。
实现过程如下:1. S1启动两个⽹络监听(主连接监听,打洞监听)2. 由于S1是公⽹,所以C1,C2和S1保持通信,3. 当C1需要和C2建⽴直接的TCP连接时,⾸先连接S1的打洞监听端⼝,并发给S1请求协助连接C2的申请,同时在该端⼝号上启动侦听,记得套接字设置允许重⼊SO_REUSEADDR 属性,否则侦听会失败4. S1监听打洞端⼝收到请求后通知C2,并将C1经过NAT1转换的公⽹IP地址和端⼝等信息告诉C25. C2收到S1的连接通知后⾸先与S1的打洞端⼝连接,随便发送⼀些数据后⽴即断开(原因:让S1知道C2经过NAT-2转换后的公⽹IP和端⼝号)6. C2试着连接到C1(经过NAT1转换后的公⽹IP地址和端⼝),⼤多数路由器对于不请⾃到的SYN请求包直接丢弃⽽导致连接失败,但NAT1会纪录此次连接的源地址和端⼝号,为接下来真正的连接做好了准备,这就是所谓的打洞,即C2向C1打了⼀个洞,下次C1就能直接连接到C2刚才使⽤的端⼝号7. 客户端C2打洞的同时在相同的端⼝上启动侦听。
C2在⼀切准备就绪以后通过与S1的主连接监听端⼝回复消息“我准备好了”,S1在收到以后将C2经过NAT2转换后的公⽹IP和端⼝号告诉给C18. C1收到S1回复的C2的公⽹IP和端⼝号等信息以后,开始连接到C2公⽹IP和端⼝号,由于在步骤6中C2曾经尝试连接过C1的公⽹IP地址和端⼝,NAT1纪录了此次连接的信息,所以当C1主动连接C2时,NAT2会认为是合法的SYN数据,并允许通过,从⽽直接的TCP 连接建⽴起来了n2n项⽬开源地址:/ntop/n2n其实现核⼼是利⽤虚拟⽹卡巧妙实现了⽹络隧道的封装,只利⽤了tap设备,实⽤twofish加密接⼝lzo数据压缩实现了内⽹通讯。
[p2p]UDP用打洞技术穿透NAT的原理与实现首先先介绍一些基本概念:NAT(Network AddressTranslators),网络地址转换:网络地址转换是在IP地址日益缺乏的情况下产生的,它的主要目的就是为了能够地址重用。
NAT分为两大类,基本的NAT和NAPT(NetworkAddress/Port Translator)。
最开始NAT是运行在路由器上的一个功能模块。
最先提出的是基本的NAT,它的产生基于如下事实:一个私有网络(域)中的节点中只有很少的节点需要与外网连接(呵呵,这是在上世纪90年代中期提出的)。
那么这个子网中其实只有少数的节点需要全球唯一的IP地址,其他的节点的IP地址应该是可以重用的。
因此,基本的NAT实现的功能很简单,在子网内使用一个保留的IP子网段,这些IP对外是不可见的。
子网内只有少数一些IP地址可以对应到真正全球唯一的IP地址。
如果这些节点需要访问外部网络,那么基本NAT就负责将这个节点的子网内IP转化为一个全球唯一的IP 然后发送出去。
(基本的NAT会改变IP包中的原IP地址,但是不会改变IP包中的端口)关于基本的NAT可以参看RFC 1631另外一种NAT叫做NAPT,从名称上我们也可以看得出,NAPT 不但会改变经过这个NAT设备的IP数据报的IP地址,还会改变IP数据报的TCP/UDP端口。
基本NAT的设备可能我们见的不多(呵呵,我没有见到过),NAPT才是我们真正讨论的主角。
看下图:Server S118.181.0.31:1235|^ Session 1 (A-S1) ^ || 18.181.0.31:1235 | |v 155.99.25.11:62000 v ||NAT155.99.25.11|^ Session 1 (A-S1) ^ || 18.181.0.31:1235 | |v 10.0.0.1:1234 v ||Client A10.0.0.1:1234有一个私有网络10.*.*.*,ClientA是其中的一台计算机,这个网络的网关(一个NAT设备)的外网IP是155.99.25.11(应该还有一个内网的IP地址,比如10.0.0.10)。
p2p打洞原理P2P打洞原理解析什么是P2P打洞?P2P打洞是一种用于实现点对点(Peer-to-Peer)通讯的技术,它允许两个位于不同私有网络中的设备直接建立连接。
通过打洞技术,P2P应用程序可以绕过NAT(网络地址转换)设备,实现直接通信,从而提高通信效率和减少延迟。
NAT和P2P通信的挑战在传统的计算机网络中,大多数终端设备都处于私有网络中,使用NAT设备将私有IP地址转换为公共IP地址进行对外通信。
这种网络环境下,P2P通信面临以下挑战:1.防火墙:NAT设备本质上是一种防火墙,它会过滤来自公共网络的进入连接请求,因此会阻止外部P2P节点访问设备。
2.IP和端口映射:每个设备在私有网络中会分配一个唯一的内部IP地址和端口号,这使得在P2P网络中直接访问设备变得困难。
P2P打洞的基本原理为了克服NAT带来的障碍,P2P打洞技术通过利用NAT设备对出站和入站连接的处理机制来建立通信。
它主要包括以下几个步骤:1.发现:P2P应用程序通过一种中介服务器(如STUN服务器)进行交互,获取设备的公共IP地址和端口号信息。
2.打洞:P2P应用程序通过向STUN服务器发送UDP数据包,请求与另一个设备建立连接。
这将使STUN服务器记录设备的公共IP地址和端口,并将其返回给P2P应用程序。
3.连接:P2P应用程序通过交换彼此的公共IP地址和端口信息,直接尝试建立UDP或TCP连接。
由于设备在STUN服务器记录下的信息,若没有防火墙及路由器的干预,连接可以成功建立。
通过这种方式,P2P应用程序绕过了NAT设备,实现了直接的点对点通信。
P2P打洞的限制与改进尽管P2P打洞技术可以解决NAT带来的通信难题,但它仍然面临一些限制:1.对称NAT:如果设备处于对称NAT环境下,P2P打洞可能会失败。
对称NAT会为每个不同目标地址分配不同的公共IP和端口,这阻碍了直接通信的建立。
2.防火墙:一些防火墙可能会检测打洞技术并丢弃相关的数据包,从而影响通信的建立。
当C1——→ S1 时:
1.C1 发送数据包BCS1中地址项:10.0.0.1:1239 ——→18.181.0.31:1235。
2.NAT 接收到数据包BCS1,产生端口6200,把数据包BCS1中地址项更改为:155.99.25.11:6200 ——→18.181.0.31:1235,并在NAT中的映射表中建立条目:
10.0.0.1:1239 155.99.25.11:6200 18.181.0.31:1235。
3.此时,当外部主机发送包到NAT,包中地址为:IP :Port——→155.99.25.11:6200,NAT在映射表中查找“NAT
栏”为155.99.25.11:6200,“Remote栏”为IP :Port的条目。
如没有查找到,则丢弃该外部数据包。
如果找到,
则向该积条目中“Client栏”中的地址发送该数据包。
“打洞”的原理
当内部网1的Client C11,内部网2的Client C21分别通过NAT1,NAT2连接到Server S1时的状态如上图所示。
此时,当C11——→ C21:
1.C11 发送数据包BCC21中地址项:10.0.0.1:1239 ——→188.55.37.71:6200。
2.则在NAT1中将新增条目:10.0.0.1:1239 155.99.25.11:6200 188.55.37.71:6200。
3.显然当此时还没有“打洞”时,这数据包BCC21到达NAT2时,因为在NAT2中找不到“NAT栏”为188.55.37.71:6200,“Remote栏”为155.99.25.11:6200的条目,所以这数据包丢弃,不能到达C21。
4.因为3。
所述,所以要在NAT2中新增条目:“NAT栏”为188.55.37.71:6200,“Remote栏”为155.99.25.11:6200的条目。
这个过程是:
1.C11——→S1,发送一数据包,地址项为:原始为10.0.0.1:1239 ——→18.181.0.31:1235,经NAT1后,更改为:155.99.25.11:6200 ——→18.181.0.31:1235,内容为:C11向C21发出打洞请求。
2.S1——→C21,发送一数据包,地址项为:18.181.0.31:1235 ——→188.55.37.71:6200,内容为:C11向C21发出打洞请求。
3.C21——→C11,发送一数据包地址项为:原始为10.0.0.10:1239 ——→155.99.25.11:6200,经NAT2后,更改为:188.55.37.71:6200 ——→155.99.25.11:6200,内容为:确认打洞。
4.此时,在NAT2中将新增条目:10.0.0.10:1239 188.55.37.71:6200 155.99.25.11:6200。
5.然后,C11发送后,经NAT1转换发送到NAT2时,这时已有“NAT栏”为188.55.37.71:6200,“Remote栏”为155.99.25.11:6200的条目,数据包将不再丢弃,而是发送到C21。
至此,C11能和C21通信了。