NAT简介

咱们晓得,WebRTC会依照内网、P2P、直达的程序来尝试连贯。在大部分的状况下,理论是应用P2P或者直达的。这里P2P的场景次要应用的技术就是NAT穿透。

咱们先简略理解下NAT。NAT在实在网络中是常见的,它的呈现一是为了解决ipv4地址不够用的问题,二是为了网络安全思考的。

  • 首先,让同一个内网中的多台主机共用一个公网ip,能够大大缓解ipv4向ipv6适度期间,ipv4地址不够用的问题。
  • 另外,NAT将主机暗藏在内网中,也就使得黑客想拜访起来并没有那么容易了。

NAT的标准在RFC 3022中定义,其次要作用就是做网络地址转换。NAT设施(路由器)会在内网地址和外网地址之间建设起映射关系。当内网主机向外网主机发送信息时,NAT会将内网地址替换为映射的外网地址。绝对应的,当外网主机向内网主机产生信息时,NAT会将外网地址替换为映射的内网地址。

因为NAT设施的存在,外网主机通常无奈间接与内网主机通信。所以在建设P2P连贯之前,须要做的就是NAT穿透,也就是俗称的“打洞”。

NAT类型

RFC3489和RFC5389是对于NAT穿透的协定,其中RFC3489中把NAT分成了4个类型。它们对NAT穿透的限度呈递进趋势。

齐全锥型

  • 齐全锥型NAT的标准是,只有内网主机A通过端口p1收回数据包,在NAT上生成了相应的映射表(这个表就是所谓的“洞”)。接管数据包的外网主机能从这个数据包的报文中失去这个映射关系。它能够将这个映射关系通知其余外网主机,这样任意外网主机发送到这个NAT上端口p1的数据包就都会被转发到内网主机A上。
  • 齐全锥型NAT的特点就是只有“打洞”胜利,所有晓得这个“洞”的主机都能通过它和内网主机进行通信。

IP限度锥型

  • IP限度锥型NAT的标准相比于齐全锥型NAT,限度了外网来的IP。也就是说,只有从内网主机发送数据包的目标IP,发送到这个NAT上端口p1的数据包才会被转发到内网主机A上。
  • IP限度锥型NAT的特点就是“打洞胜利”后,只有胜利“打洞”的外网主机能力通过这个“洞”和内网主机进行通信。其余外网主机即便晓得这个“洞”,发来的数据包也回被NAT抛弃。

端口限度锥型

  • 端口限度锥型NAT的标准相比于IP限度锥型NAT,除了限度外网来的IP,还要限度端口。也就是说只有从内网主机发送数据包的目标IP和端口,发送到这个NAT上端口p1的数据包才会被转发到内网主机A上。
  • 端口限度锥型NAT的特点就是,除了限度了“洞”的外网ip,还限度了“洞”的外网端口。

对称型

  • 对称型NAT的标准相比于端口限度锥型NAT,还减少了一条规定。从内网主机A上发到不同的外网主机的数据包通过NAT时,NAT都会为之调配不同的外网端口。
  • 对称型NAT的特点就是,内网主机每次发送数据包给不同的外网主机时,都会产生一个新的“洞”。

NAT类型检测

要进行NAT穿透,内网主机首先要晓得本人连贯的NAT的类型。在RFC3489中给出了规范的检测流程。这个过程须要2台领有2个网卡的STUN服务器。具体流程如下图所示。

  • 主机向1号服务器的某个IP和端口发送一条申请,如果超过超时工夫没有收到响应,则阐明主机与服务器之间UDP不通
  • 如果收到服务端的响应,则比照本地IP和接管到的响应包中的主机的公网IP。如果这两个IP统一,则阐明主机在公网上,没有NAT防护。如果不统一,则须要进一步的NAT类型检测,稍后详述。
  • 接下来,主机再次向1号服务器雷同的IP和端口发送一条申请,1号服务器在收到申请后,会应用第二个网卡返回响应。如果主机收到了这个响应,则阐明它在一个凋谢的网络上,是一台公网主机。如果主机没有收到这个响应,则阐明它在对称型防火墙(能够认为与对称型NAT相似)前面。
  • 回到下面进一步的NAT类型检测流程。主机也是向1号服务器雷同的IP和端口发送一条申请,1号服务器也会应用第二个网卡返回响应。如果主机收到了这个响应,则阐明它在齐全锥型NAT前面。
  • 如果主机没有收到这个响应,则向2号服务器发送一条申请。主机收到2号服务器的响应后,比照1号服务器返回的响应包中的主机的公网IP和2号服务器返回的响应包中的主机的公网IP,如果不统一,则阐明它在一个对称型NAT的前面。如果统一,则须要进一步的检测。
  • 主机再次向1号服务器发送一条申请,1号服务器应用雷同的IP(即接管申请的IP)和不同的端口返回响应。如果主机收到了这个响应,则阐明它在IP限制型NAT前面,如果主机没有收到这个响应,则阐明它在端口限制型NAT前面。

NAT穿透流程

在确认完主机所在网络中的NAT类型后,就能够判断是否能进行NAT穿透,以及确认NAT穿透的办法。

一般而言,齐全锥型NAT以及IP限制型NAT能够与任何其余类型的NAT互通;两边都是端口限制型NAT的也能够互通;一边是端口限制型NAT,另一边是对称型NAT,或者两边都是对称型NAT的状况下想实现穿透很难,所以这种状况个别会通过TRUN协定进行数据直达。

在WebRTC中通信的单方通过ICE替换了下面获取到的一些网络信息,之后就能够尝试NAT穿透,建设P2P连贯了。

假如须要建设P2P通信的单方为主机A和主机B。

  • 如果主机A在齐全锥型NAT或者IP限制型NAT后,只有主机先往主机B发送一个数据,就会在该NAT上留下“洞”,即便发送的数据被对方的NAT抛弃。后续主机B发往主机A的数据也能通过主机A这边的NAT上的“洞”实现穿透了。总的来说,这种状况下,只有单方不停的发送数据包,且没有某一方的数据包被全副抛弃,就能胜利穿透。
  • 如果主机A在端口限制型NAT后,而主机B也在端口限制型NAT后,只有单方相互发送数据包则和后面状况一样,能够利用NAT上的“洞”来穿透。
  • 主机A在端口限制型NAT后,主机B在对称型NAT后,或者两边都在对称型NAT后,就只能通过服务器直达来通信了。服务器直达的TURN协定在RFC5766中进行了具体的标准。