P2P打洞,NAT的种类及NAT相应原理

      涉及公网通信的同学,或多或少都知道NAT穿网相关的一些知识,尤其是需要在公网使用UDP传输音视频等流媒体的同学,经常会遇到一些奇奇怪怪的问题,其中一部分就跟穿网有关。接下来来讲一些NAT相关的理论知识,NAT的转化图如下:

      NAT有三种类型:静态NAT(Static NAT)、动态地址NAT(Pooled NAT)和网络地址端口转换(Network Address Port Translation,NAPT)。其中静态NAT设置起来最简单,内部网络中的每个主机被永久映射成外部网络中的某个合法地址,而动态地址NAT则是在外部网络中定义了一系列的合法地址,采用动态分配的方法映射到外部网络;NAPT则是把内部地址映射到外部网络的一个IP地址的不同端口上。

      前两种类型实际上都不能节省IP地址,这里我们就不讨论了。NAPT是大家比较熟悉的一种转换方式,它普遍应用于接入设备中,可以将中小型的网络隐藏在一个合法的IP地址后面,这个优点使得这种方式在小型办公室内非常实用,通过从ISP处申请一个公网IP地址,可以将多台电脑或网络设备通过NAPT接入Internet。

      一般来说,NAPT有四种类型,但它实际上又分为两大类:锥型NAT和对称NAT。其中锥型NAT又分为三类,加上对称NAT一共是四类。具体如下:

     (1)Full Cone NAT(全锥型NAT)

        内网主机建立一个UDP的socket(表示为localIP:localPort,比如:192.168.1.2:10000),第一次使用的这个socket给外部主机发送数据时,NAT设备(如路由器)会给其分配一个公网IP、端口对(publicIP:publicPort,如:47.96.11.3:10000),并记住他们之间的映射关系。以后用这个socket向外面任何主机发送数据都将使用这对publicIP:publicPort。此外,任何主机只要知道这个publicIP:publicPort就可以给它发送数据,NAT设备会根据它已经记住的映射关系将收到的数据转发到相应的内部主机的localIP:localPort上。简单来说就一句话:内部主机向外打了一个洞,外部的任何主机都可以利用这个洞与它通信。

    (2)Restricted Cone NAT (限制锥型NAT,即IP限制锥型)

       内网主机建立一个UDP的socket(localIP:localPort),第一次使用这个socket给外部主机发送数据时NAT设备会给其分配一个公网的publicIP:publicPort,以后用这个socket向外面任何主机发送数据都将使用这对publicIP:publicPort。此外,如果外部主机想要发送数据给这个内部主机,除了需要知道这个publicIP:publicPort外,内部主机在这之前必须用这个socket曾向这个外部主机的IP发送过数据。也就是说,如果内网的主机从来没有往某一公网IP发送过数据,则这个公网是不能向内部主机发送数据的,即使它知道publicIP:publicPort也不行。按洞的理论来说,就是内部主机向某一外部主机打了一个洞后,只有该外部主机才能利用这个洞。

   (3)Port Restricted Cone NAT(端口限制锥型NAT)

      这种NAT与Restricted Cone类似,唯一不同的是,如果外部主机想要给内网主机发送数据,它除了必须知道publicIP:publicPort外,而且内部的主机必须事先向该外部主机的IP:Port发送过数据,并且该外部主机必须使用相应的IP:Port通过publicIP:publicPort向内部主机发送数据。

      可以看出,Port Restricted Cone NAT与Restricted Cone相比增加了对外网主机使用的端口的限制,即内部主机向外部主机上的某一端口打了一个洞,则只有该端口可以使用这个洞,其他的不行。

   (4)Symmetric NAT(对称型NAT)

     锥型NAT对内部主机的同一socket(localIP:localPort)发往任何外网主机的数据分配一个publicIP:publicPort,而对称型NAT会对内网主机向同一socket(localIP:localPort)发往外部不同主机的数据分配不同的publicIP:publicPort映射关系。

     详细来讲,内网主机建立一个UDP socket(localIP:localPort),当利用这个socket第一次向外部主机1发送数据时,NAT设备会为其映射一个publicIP1:publicPort1,以后内网主机发送给外部主机1的所有数据都利用这个publicIP1:publicPort1。如果内部主机同时利用这个sokcet给外部主机2发送数据,第一次发送时,NAT设备会为其分配一个publicIP2:publicPort2,以后内网主机发送给外部主机2的所有数据都利用这个publicIP2:publicPort2。

     如果外部任何主机B想要发送数据给这个内网主机A,A必须曾经用过这个socket像这个外部主机B的IP发送过数据,并且A需要知道B向M发送数据时NAT设备为其映射的publicIP:publicPort。这样这个外部主机A就可以利用自己的IP:anyPort(即任何端口)给publicIP:publicPort发送数据。

     对称型NAT相当于同一内部主机向不同的外部主机发送数据时,需要打不同的洞。

     另外,NAT设备上的洞一般是有生命周期的,需要长时间没有数据发送时,需要定期发送保活包,不然长时间没有数据,NAT设备可能会将相应的洞关闭。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值