P2P NAT检测和穿越方式

一、      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和NAT-B的不同而不同,具体方式如下:

   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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值