P2P NAT检测和穿越方式以及两者之间的关系

附加的话:P2P 是否能够打通请查看最后的表


一、      NAT类型

本文转自:http://www.cnblogs.com/hummersofdie/archive/2013/05/21/3090163.html 

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

tips:一个基本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)

二、      NAPT的四种类型

首先我们假设一种场景:一个内网用户A(Private Endpoint)首次向外发送数据包时创建了地址映射会话,并为A分配了一个公网的Endpoint(IP+PORT),为了方便我们定义它为PA(Public Endpoint);现在外部主机B(IP:PORT)要与A进行通信:

(1)    任何外部主机(B、C、D、E)只要把消息发送到PA上,A就可以接收到消息;A所在的NAT是完全锥型(FULL CONE NAT);

(2)    把消息发送到PA,并且保证A曾经与B的主机IP通信,A才能接收到信息;A所在的NAT就是限制锥型(RESTRICT CONE NAT);

(3)    把消息发送到PA,并且保证A曾与B的Endpoint(IP+PORT)通信,A才能接收到信息;A所在的NAT就是端口限制型(PORT RESTRICT CONE NAT);

(4)    A与不同的外部主机通信,NAT就会给A分配不同的Public Endpoint,外部主机B和C、D、E们,想和A通信,必须A先发消息,它们才能把消息响应给A;A所在的NAT类型就是对称型(SYMMETRIC NAT);

三、      NAT类型的检测方法

根据NAT类型的不同,STUN服务器检测NAT类型分为以下几步。(STUN服务器有两个公网Endpoint,我们假设为E1和E2,假设STUN服务器为STUN);

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

A发UDP数据包给E1,STUN将E1收到的数据包头打包用E1反馈给A,A比较包中的Endpoint与自己的Endpoint是否相同,如果相同,证明A不位于任何NAT之后;否则,就是位于NAT之后,并不能判断具体的NAT类型;

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

A发UDP数据包给E1,STUN将E1收到到数据包头打包,用E2反馈给A,如果能收到,证明A所处的NAT是完全锥型的,否则就不是;

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

A分别向E1、E2发送UDP数据包,STUN分别用相应的Endpoint将消息包头打包反馈给A,A比较一下收到的两个包头中的Endpoint是否相同;如果相同,A所处的NAT就不是对称型的,否则是对称型的;

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

A发UDP数据包给E1,STUN服务器用与E1相同的IP但不同的端口的Endpoint把收到的包头打包发给PA,如果能收到,证明A所处的NAT类型是限制型的,如果不能收到,说明A所处的NAT类型是端口限制型的。

tips:A在发消息后会开始监听端口,并设置超时时间,防止无限阻塞;另外每次检测的时候也不止发一次UDP包。

四、      穿透方法

穿透有4种方法:

(1)直接通信(direct)

(2)打洞穿越(hole punching)

(3)反向穿越(reverse)

(4)端口预测(Port prediction)

为了方便说明,我们假设有两个客户端(Peer),A和B;A和B都会注册到同一个服务器regist-server,我们简称为其RS;这样RS要让A和B进行通信而不通过自己;根据A和B所处的NAT环境不同,就有不同的方法。我们做如下假定

A是主动连接者,B是被动链接者;

NAT给A分配的Public Endpoint是PA;

NAT给B分配的Public Endpoint是PB;

A所属的NAT为NAT-A;

B所属的NAT为NAT-B;

A、 B不在同一个局域网内,不在同一个NAT后;

穿透的四种方法可以说明如下:

(1)直接通信:RS把PB(IP:PORT)直接发给PA,A向PB发消息;

(2)打洞穿越:RS把PA发给PB,把PB发给PA,PA发消息给PB,PB发消息给PA;

(3)反向穿越:RS把PA发给PB,让B发消息给PA;

(4)端口预测:很难实现UDP-P2P通信

穿越方法根据NAT-A (sender)和NAT-B(receiver)的不同而不同,具体方式如下:

   NAT-B
NAT-A

公网

FULL CONE

RESTRICT CONE

PORT RESTRICT

SYMMETRIC

公网

direct

hole punching

hole punching

hole punching

reverse

FULL CONE

direct

hole punching

hole punching

hole punching

reverse

RESTRICT CONE

direct

hole punching

hole punching

hole punching

reverse

PORT RESTRICT

direct

hole punching

hole punching

hole punching

Port prediction

SYMMETRIC

direct

hole punching

hole punching

Port prediction

Port prediction


发布了120 篇原创文章 · 获赞 44 · 访问量 71万+

猜你喜欢

转载自blog.csdn.net/qiaoliang328/article/details/72734560