一、 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 |
公网 |
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 |