内容目录

基本概念

  1. 基本的NAT类型:只转换IP,不转换端口
  2. NAPT:转换整个Endpoint (IP:PORT)

网络类型检测步骤

  1. 检测主机是否位于NAT后步骤
  2. 检测NAT是否是完全锥型步骤
  3. 检测NAT是否是对称型的步骤
  4. 检测NAT是限制型还是端口限制型

穿越方法介绍

  1. 简介
  2. 直接通信
  3. 打洞穿越
  4. 反向穿越
  5. 端口预测

根据NAT类选择穿越方法

  1. 穿越方法一览表
  2. 客户端的实现流程图

基本概念

1、基本的NAT类型:只转换IP,不转换端口


一个基本NAT往往需要具有多个公网IP来满足多个内网节点中具有相同端口的应用程序的同时访问。由于这种类型的NAT设备限制大,现在已不常见。

2、NAPT:转换整个Endpoint (IP:PORT)


现在常用的NAT类型是NAPT,NAPT是一种向外的NAT类型("向外"指内网访问别人不受限,别人访问内网受限),根据限制的不同分为以下四种类型:
   (1)完全锥型(FULL CONE NAT)
   (2)限制锥型(RESTRICT CONE NAT)
   (3)端口限制型(PORT RESTRICT CONE NAT)
   (4)对称型(SYMMETRIC NAT)

网络类型检测

如图,检测类型分为以下几步:

NAT类型检测

步骤1:检测主机是否位于NAT后


是否位于NAT后,是从受限的角度讲的,如果客户端部署在阿里云,配置了一个外网地址(阿里云的内网和外网IP地址不同,但是有固定的映射的关系),当你收到的请求100%和你自己配置的外网地址一致时,就可以称之为在公网;

步骤2:检测NAT是否是完全锥型


图中3、4两步,证明只要Endpoint(IP+PORT)对应就可以,换个IP和PORT发送请求,该节点依然能收到消息,说明外来访问并没有受限,这样的NAT类型就是完全锥型;

步骤3:检测NAT是否是对称型的


图中1、2、5、6步,说明每次节点的内网发起请求的Endpoint(IP+PORT)不变的情况下,公网的出口Endpoint(IP+PORT)都会变,这样的NAT类型就是对称型;

步骤4:检测NAT是限制型还是端口限制型


图中7、8两步,内网先发起请求到一个地址Endpoint(IP+PORT),如果对方换个PORT把请求发送回来,NAT不给转发,则NAT就是端口限制型,否则仅为限制锥型。

穿越方法介绍

简介


穿越方法有四种:直接通信(direct)、打洞穿越(hole punching)、反向穿越(reverse)、端口预测(port prediction)。为了方便说明,我们假设有两个客户端节点(Peer)A和B.


首先,A和B都需要把自己从STUN服务器中获取的消息,注册到同一个服务器AssistServer(AssistServer是自建的一个公网服务,用于协调边缘节点互相发送消息),如图:


我们假定Peer A为发起端,Peer B为接收端,四种穿越方式的请求序列图分别如下所示。

直接通信

打洞穿越

打洞穿越

从图中5、6、7三个步骤,可以看出,这是为应对Peer B处于端口限制型的NAT中,而做的设计。

反向穿越


如果Peer B所处的网络类型为对称型,Peer A的消息无法直达Peer B。那么我们就需要让Peer B首先发送消息,这其实是一种将Peer B变成发起端的方法。

反向穿越

端口预测


端口预测,就是统计客户端多次连接的地址,总结出客户端外网端口变化的规律,然后把预测出的下一个端口和外网地址发给对方,然后促成双方通信。这个方法穿透成功率极低,因此,如果碰上需要端口预测解决问题的时候,我们通常直接通过服务器转发的方式解决。

根据NAT类选择穿越方法

穿越方法一览表

穿越方法一览表

客户端的实现流程图


平台转发,可以选择TRUN的方式,也可以自建服务转发,但这样会耗费服务端的流量,有可能得不偿失。本文中讲的方法,可以保证很高的穿透率,但本质还是有中心的。那么常见的P2P的穿越方式到底是中心的还是去中心的?还是有新的技术来实现P2P的去中心化?去年比较火的IPFS的穿透方式又是什么呢?

转自程序员的那点事P2P中的NAT类型检测方法和穿越方式