快速理解P2P技术中的NAT穿透原理

【快速理解P2P技术中的NAT穿透原理】导语
最近介入测试P2P的相关逻辑,因此对NAT穿透原理做了一定程度的了解(当然也没有很深入) 。。写本文的目的就是,用自己的语言描述了这个过程,同时也在描述过程中加入了一些自己的理解,形成一篇文章作为要点的记录 。对于这一块的知识,自己也有很多盲点,还请各路大神多多指教 。
一、背景知识介绍1.什么是NAT?NAT(Network Address Translation,网络地址转换),也叫做网络掩蔽或者IP掩蔽 。NAT是一种网络地址翻译技术,主要是将内部的私有IP地址(private IP)转换成可以在公网使用的公网IP(public IP) 。
2.为什么会有NAT?时光回到上个世纪80年代,当时的人们在设计网络地址的时候,觉得再怎么样也不会有超过32bits位长即2的32次幂台终端设备连入互联网,再加上增加ip的长度(即使是从4字节增到6字节)对当时设备的计算、存储、传输成本也是相当巨大的 。后来逐渐发现IP地址不够用了,然后就NAT就诞生了!(虽然ipv6也是解决办法,但始终普及不开来,而且未来到底ipv6够不够用仍是未知) 。
因此,NAT技术能够兴起的原因还是因为在我们国家公网IP地址太少了,不够用,所以才会采取这种地址转换的策略 。可见,NAT的本质就是让一群机器公用同一个IP,这样就暂时解决了IP短缺的问题 。
3.NAT有什么优缺点?优势其实上面已经刚刚讨论过了,根据定义,比较容易看出,NAT可以同时让多个计算机同时联网,并隐藏其内网IP,因此也增加了内网的网络安全性;此外,NAT对来自外部的数据查看其NAT映射记录,对没有相应记录的数据包进行拒绝,提高了网络安全性 。
那么,NAT与此同时也带来一些弊端:首先是,NAT设备会对数据包进行编辑修改,这样就降低了发送数据的效率;此外,各种协议的应用各有不同,有的协议是无法通过NAT的(不能通过NAT的协议还是蛮多的),这就需要通过穿透技术来解决 。我们后面会重点讨论穿透技术 。
简单的背景了解过后,下面介绍下NAT实现的主要方式,以及NAT都有哪些类型 。
二、NAT实现方式及主要类型1.NAT实现方式
1)静态NAT:也就是静态地址转换 。是指一个公网IP对应一个私有IP,是一对一的转换,同时注意,这里只进行了IP转换,而没有进行端口的转换 。举个栗子:

快速理解P2P技术中的NAT穿透原理

文章插图
 
2)NAPT:端口多路复用技术 。与静态NAT的差别是,NAPT不但要转换IP地址,还要进行传输层的端口转换 。具体的表现形式就是,对外只有一个公网IP,通过端口来区别不同私有IP主机的数据 。再举个栗子 。
快速理解P2P技术中的NAT穿透原理

文章插图
 
通过上面NAT实现方式的介绍,我们其实不难看出,现实环境中NAPT的应用显然是更广泛的 。因此下面就重点介绍下NAPT的主要类型有哪些 。
2.NAT的主要类型对于NAPT我们主要分为两大类:锥型NAT和对称型NAT 。其中锥型NAT又分:完全锥型,受限锥型和端口受限锥型 。概括的说:对称型NAT是一个请求对应一个端口;锥型NAT(非对称NAT)是多个请求(外部发向内部)对应一个端口,只要源IP端口不变,无论发往的目的IP是否相同,在NAT上都映射为同一个端口,形象的看起来就像锥子一样 。下面分别介绍这四种类型及其差异 。
1)完全锥型NAT(Full Cone NAT,后面简称FC)
特点:IP和端口都不受限 。
表现形式:将来自内部同一个IP地址同一个端口号(IP_IN_A : PORT_IN_A)的主机监听/请求,映射到公网IP某个端口(IP_OUT_B : PORT_OUT_B)的监听 。任意外部IP地址与端口对其自己公网的IP这个映射后的端口访问(IP_OUT_B : PORT_OUT_B),都将重新定位到内部这个主机(IP_IN_A : PORT_IN_A) 。该技术中,基于C/S架构的应用可以在任何一端发起连接 。是不是很绕啊 。再简单一点的说,就是,只要客户端,由内到外建立一个映射(NatIP:NatPort -> A:P1)之后,其他IP的主机B或端口A:P2都可以使用这个洞给客户端发送数据 。见下图(图片来自网络) 。
快速理解P2P技术中的NAT穿透原理

文章插图
 
2)受限锥型NAT(Restricted Cone NAT)
特点:IP受限,端口不受限 。
表现形式:与完全锥形NAT不同的是,在公网映射端口后,并不允许所有IP进行对于该端口的访问,要想通信必需内部主机对某个外部IP主机发起过连接,然后这个外部IP主机就可以与该内部主机通信了,但端口不做限制 。举个栗子 。当客户端由内到外建立映射(NatIP:NatPort –> A:P1),A机器可以使用他的其他端口(P2)主动连接客户端,但B机器则不被允许 。因为IP受限啦,但是端口随便 。见下图(绿色是允许通信,红色是禁止通信) 。


推荐阅读