首页 > 编程知识 正文

p2p穿透版ios(通俗易懂:快速理解P2P技术中的NAT穿透原理)

时间:2023-05-05 18:43:19 阅读:121222 作者:3237

由于导游词最近介入了有关测试P2P的逻辑,所以对NAT穿透的原理有一定的了解(当然不深)。 本文也是综合几种网上和长情啤酒参考的资料。 (引用处没有标明,敬请谅解。 这篇文章的目的是用自己的语言描述这个过程,同时在描述过程中加入自己的理解,形成以文章为要点的记录。 关于这个知识,自己也有很多盲点,请多关照各路大神。

一、背景知识介绍1.什么是NAT?

网络地址转换(NAT ),也称为网络掩码或IP掩码。 NAT是互联网地址的翻译技术,主要是将内部的私有IP地址(私有IP )转换为可以在公共网络上使用的公共网络IP (公共IP )。

2.为什么会有NAT?

回到20世纪80年代,当时的人们在设计网络地址时,总觉得超过2的32次方台终端设备(32位长)不会连接到互联网上。 另外,增加ip长度意味着计算、存储和传输设备的成本相当巨大,即使将ip长度从4字节增加到6字节也是如此。 后来发现IP地址不够了,NAT诞生了! (ipv6也是解决方案,但很难普及。 另外,未来ipv6是否足够还不清楚。

因此,NAT技术之所以能兴起,还是因为我们国家的公共网络IP地址太少,不够用,所以才会采取这种地址转换的策略。 可见,NAT的本质是通过允许组中的计算机共享同一IP来暂时解决IP不足的问题。

3.NAT有什么优缺点?

虽然上面已经讨论了其优点,但是根据定义,NAT可以同时将多台计算机连接到网络上,隐藏其内部网IP,因此也增加了内部网的网络安全。 另外,NAT针对来自外部的数据检查其NAT映射记录,拒绝没有该记录的数据包,从而提高了网络安全。

那么,NAT在此同时也会带来一些弊端。 首先,NAT设备会编辑和修改数据包,从而降低数据发送的效率。 另外,各协议的应用各不相同,也有不能通过NAT的协议(不能通过NAT的协议很多),这需要用透射技术解决。 我们稍后将集中讨论贯通技术。

在了解的简要背景后,我将向您介绍NAT实现的主要方法以及NAT的类型。

http://www.Sina.com/http://www.Sina.com /

二、NAT实现方式和主要类型【文章福利】小编推荐自己的linuxC/C++语言交流群:832218493,整理了一些个人觉得比较好的学习书籍、视频资料共享zrdxy,有需要的可以自行添加哦!~!

1 )静态NAT )即静态地址转换。 请注意,公共IP支持私有IP,是一对一转换,同时这里只进行IP转换,没有端口转换。 板栗:

2 ) NAPT )端口复用技术。 与静态NAT的区别在于,NAPT不仅执行IP地址转换,还执行传输层端口转换。 具体而言,只有一个公共IP,用于区分不同端口的专用IP主机上的数据。 再举一个栗子。

从上面对NAT实现方式的介绍可以看出,NAPT在现实环境中的应用显然更加广泛。 因此,以下重点介绍NAPT的主要类型。

2.NAT的主要类型相对于NAPT,我们主要分为锥形NAT和对称NAT两种。 其中,锥型NAT又分为完全锥型、限制锥型和端口限制锥型。 总之,对称NAT的一个请求对应于一个端口; 非对称NAT (非对称NAT )在NAT上被映射到同一端口,表示多个请求(从外部到内部)对应于一个端口,并且目的地IP (无论目的地IP端口是否相同),只要源IP端口不改变分别介绍这四种类型及其区别。

更多面试资料与电子书请关注

特点: IP和端口不受限制。

表现形式:将来自内部相同IP地址和相同端口号(IP_IN_A : PORT_IN_A )的主机监听/请求发送到具有公共网络IP的端口(IP _ out _ b : port _ a ) 任意外部IP地址和端口是映射到其公共网络的称为IP的端口访问(IP_OUT_B : PORT_OUT_B )是内部的该主机) IP _ in _ a : port 在此技术中,基于C/S架构的APP应用可以在任意一侧开始连接。 不是很绕圈子吗? 更简单地说,一旦客户端建立了从内到外映射(NatIP:NatPort - A:P1 ),其他IP的主机b或端口A:P2就可以使用该孔向客户端发送数据请参阅下图(照片来自互联网)。

1.NAT实现方式

特点: IP受限制,端口不受限制。

表示:与完全锥形NAT不同,在公共网络映射后,并非所有IP都允许访问该端口。 要进行通信,必须连接到内部主机所在的外部IP主机,并且该外部IP主机必须能够与该内部主机进行通信,但端口不受限制。 板栗。 成为客人

端由内到外建立映射(NatIP:NatPort –> A:P1),A机器可以使用他的其他端口(P2)主动连接客户端,但B机器则不被允许。因为IP受限啦,但是端口随便。见下图(绿色是允许通信,红色是禁止通信)。

3)端口受限型NAT(Port Restricted Cone NAT)

特点:IP和端口都受限。

表现形式:该技术与受限锥形NAT相比更为严格。除具有受限锥形NAT特性,对于回复主机的端口也有要求。也就是说:只有当内部主机曾经发送过报文给外部主机(假设其IP地址为A且端口为P1)之后,外部主机才能以公网IP:PORT中的信息作为目标地址和目标端口,向内部主机发送UDP报文,同时,其请求报文的IP必须是A,端口必须为P1(使用IP地址为A,端口为P2,或者IP地址为B,端口为P1都将通信失败)。例子见下图。这一要求进一步强化了对外部报文请求来源的限制,从而较Restrictd Cone更具安全性。

4)对称型NAT(Symmetric NAT)

特点:对每个外部主机或端口的会话都会映射为不同的端口(洞)。

表现形式:只有来自同一内部IP:PORT、且针对同一目标IP:PORT的请求才被NAT转换至同一个公网(外部)IP:PORT,否则的话,NAT将为之分配一个新的外部(公网)IP:PORT。并且,只有曾经收到过内部主机请求的外部主机才能向内部主机发送数据包。内部主机用同一IP与同一端口与外部多IP通信。客户端想和服务器A(IP_A:PORT_A)建立连接,是通过NAT映射为NatIP:NatPortA来进行的。而客户端和服务器B(IP_B:PORT_B)建立连接,是通过NAT映射为NatIP:NatPortB来进行的。即同一个客户端和不同的目标IP:PORT通信,经过NAT映射后的公网IP:PORT是不同的。此时,如果B想要和客户端通信,也只能通过NatIP:NatPortB(也就是紫色的洞洞)来进行,而不能通过NatIP:NatPortA(也就是黄色的洞洞)。

以上,就是NAPT的四种NAT类型。可以看出由类型1)至类型4),NAT的限制是越来越大的。

三、NAT路由类型判断

根据上面的介绍,我们可以了解到,在实际的网络情况中,各个设备所处的网络环境是不同的。那么,如果这些设备想要进行通信,首先判断出设备所处的网络类型就是非常重要的一步。举个例子来说:对于视频会议和VoIP软件,对位于不同NAT内部的主机通信需要靠服务器来转发完成,这样就会增加服务器的负担。为了解决这种问题,要尽量使位于不同NAT内部的主机建立直接通信,其中,最重要的一点就是要判断出NAT的类型,然后才能根据NAT的类型,设计出直接通信方案。不然的话,两个都在NAT的终端怎么通信呢?我们不知道对方的内网IP,即使把消息发到对方的网关,然后呢?网关怎么知道这条消息给谁,而且谁允许网关这么做了?

为了解决这个问题,也就是处于内网的主机之间能够穿越它们之间的NAT建立直接通信,已经提出了许多方法,STUN(Session Traversal Utilities for NAT,NAT会话穿越应用程序)技术就是其中比较重要的一种解决方法,并得到了广泛的应用。在这个部分,我们将重点介绍下STUN技术的原理。(PS:除此之外,还有UPNP技术,ALG应用层网关识别技术,SBC会话边界控制,ICE交互式连接建立,TURN中继NAT穿越技术等等,本文不一一做介绍。)

四、STUN协议

STUN是一种网络协议,它允许位于NAT(或多重NAT)后的客户端找出自己的公网地址,查出自己位于哪种类型的NAT之后以及NAT为某一个本地端口所绑定的Internet端端口。这些信息被用来在两个同时处于NAT路由器之后的主机之间建立UDP通信。该协议由RFC 5389定义。STUN由三部分组成:STUN客户端、STUN服务器端、NAT路由器。STUN服务端部署在一台有着两个公网IP的服务器上。大概的结构参考下图。STUN客户端通过向服务器端发送不同的消息类型,根据服务器端不同的响应来做出相应的判断,一旦客户端得知了Internet端的UDP端口,通信就可以开始了。

STUN协议定义了三类测试过程来检测NAT类型。

**Test1:**STUN Client通过端口{IP-C1:Port-C1}向STUN Server{IP-S1:Port-S1}发送一个Binding Request(没有设置任何属性)。STUN Server收到该请求后,通过端口{IP-S1:Port-S1}把它所看到的STUN Client的IP和端口{IP-M1,Port-M1}作为Binding Response的内容回送给STUN Client。
Test1#2:STUN Client通过端口{IP-C1:Port-C1}向STUN Server{IP-S2:Port-S2}发送一个Binding Request(没有设置任何属性)。STUN Server收到该请求后,通过端口{IP-S2:Port-S2}把它所看到的STUN Client的IP和端口{IP-M1#2,Port-M1#2}作为Binding Response的内容回送给STUN Client。

**Test2:**STUN Client通过端口{IP-C1:Port-C1}向STUN Server{IP-S1:Port-S1}发送一个Binding Request(设置了Change IP和Change Port属性)。STUN Server收到该请求后,通过端口{IP-S2:Port-S2}把它所看到的STUN Client的IP和端口{IP-M2,Port-M2}作为Binding Response的内容回送给STUN Client。

Test3:STUN Client通过端口{IP-C1:Port-C1}向STUN Server{IP-S1:Port-S1}发送一个Binding Request(设置了Change Port属性)。STUN Server收到该请求后,通过端口{IP-S1:Port-S2}把它所看到的STUN Client的IP和端口{IP-M3,Port-M3}作为Binding Response的内容回送给STUN Client。

STUN协议的输出是:
1)公网IP和Port
2)防火墙是否设置
3)客户端是否在NAT之后,及所处的NAT的类型

因此我们进而整理出,通过STUN协议,我们可以检测的类型一共有以下七种:

A:公开的互联网IP。主机拥有公网IP,并且没有防火墙,可自由与外部通信
B:完全锥形NAT。
C:受限制锥形NAT。
D:端口受限制形NAT。
E:对称型UDP防火墙。主机出口处没有NAT设备,但有防火墙,且防火墙规则如下:从主机UDP端口A发出的数据包保持源地址,但只有从之前该主机发出包的目的IP/PORT发出到该主机端口A的包才能通过防火墙。
F:对称型NAT
G:防火墙限制UDP通信。

输入和输出准备好后,附上一张维基百科的流程图,就可以描述STUN协议的判断过程了。

STEP1:检测客户端是否有能力进行UDP通信以及客户端是否位于NAT后 – Test1
客户端建立UDP socket,然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器返回客户端的IP和Port,客户端发送请求后立即开始接受数据包。重复几次。
a)如果每次都超时收不到服务器的响应,则说明客户端无法进行UDP通信,可能是:G防火墙阻止UDP通信
b)如果能收到回应,则把服务器返回的客户端的(IP:PORT)同(Local IP: Local Port)比较:
如果完全相同则客户端不在NAT后,这样的客户端是:A具有公网IP可以直接监听UDP端口接收数据进行通信或者E。
否则客户端在NAT后要做进一步的NAT类型检测(继续)。

STEP2:检测客户端防火墙类型 – Test2
STUN客户端向STUN服务器发送请求,要求服务器从其他IP和PORT向客户端回复包:
a)收不到服务器从其他IP地址的回复,认为包前被前置防火墙阻断,网络类型为E
b)收到则认为客户端处在一个开放的网络上,网络类型为A

STEP3:检测客户端NAT是否是FULL CONE NAT – Test2
客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器用另一对(IP-2,Port-2)响应客户端的请求往回发一个数据包,客户端发送请求后立即开始接受数据包。 重复这个过程若干次。
a)如果每次都超时,无法接受到服务器的回应,则说明客户端的NAT不是一个Full Cone NAT,具体类型有待下一步检测(继续)。
b)如果能够接受到服务器从(IP-2,Port-2)返回的应答UDP包,则说明客户端是一个Full Cone NAT,这样的客户端能够进行UDP-P2P通信。

STEP4:检测客户端NAT是否是SYMMETRIC NAT – Test1#2
客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器返回客户端的IP和Port, 客户端发送请求后立即开始接受数据包。 重复这个过程直到收到回应(一定能够收到,因为第一步保证了这个客户端可以进行UDP通信)。
用同样的方法用一个socket向服务器的(IP-2,Port-2)发送数据包要求服务器返回客户端的IP和Port。
比较上面两个过程从服务器返回的客户端(IP,Port),如果两个过程返回的(IP,Port)有一对不同则说明客户端为Symmetric NAT,这样的客户端无法进行UDP-P2P通信(检测停止)因为对称型NAT,每次连接端口都不一样,所以无法知道对称NAT的客户端,下一次会用什么端口。否则是Restricted Cone NAT,是否为Port Restricted Cone NAT有待检测(继续)。

STEP5:检测客户端NAT是Restricted Cone 还是 Port Restricted Cone – Test3
客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器用IP-1和一个不同于Port-1的端口发送一个UDP 数据包响应客户端, 客户端发送请求后立即开始接受数据包。重复这个过程若干次。如果每次都超时,无法接受到服务器的回应,则说明客户端是一个Port Restricted Cone NAT,如果能够收到服务器的响应则说明客户端是一个Restricted Cone NAT。以上两种NAT都可以进行UDP-P2P通信。

通过以上过程,至此,就可以分析和判断出客户端是否处于NAT之后,以及NAT的类型及其公网IP,以及判断客户端是否具备P2P通信的能力了。当然这是自己个人笔记的第一篇,后面,再作一篇笔记《NAT穿透原理浅析(二)》分析下不同NAT类型的穿透打洞策略。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。