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

P2P NAT检测和穿越方式的更多相关文章

  1. NAT的三种方式

    NAT的三种方式: 一.端口NAT acces-list 1 permit IP/Mask ip nat inside source list “number” interface fastether ...

  2. Proteus传感器+气体浓度检测的报警方式控制仿真

    Proteus传感器+气体浓度检测的报警方式控制仿真 目录 Proteus传感器+气体浓度检测的报警方式控制仿真 1 实验意义理解 2 主要实验器件 3 实验参考电路 4 实验中的问题思考 4.1 实 ...

  3. VMware的“桥接”、“NAT”、“Host-only”上网方式的区别

    http://liblog.littleyuan.com/archives/9 在说到VMware的网络模型之前,先说一下VMware的几个虚拟设备: VMnet0:这是VMware用于虚拟桥接网络下 ...

  4. CentOS 6.5静态IP的设置(NAT和桥接联网方式都适用)

    不多说,直接上干货! 为了方便,用Xshell来.并将IP设置为静态的.因为,在CentOS里,若不对其IP进行静态设置的话,则每次开机,其IP都是动态变化的,这样会给后续工作带来麻烦.为此,我们需将 ...

  5. CORS漏洞利用检测和利用方式

    CORS全称Cross-Origin Resource Sharing, 跨域资源共享,是HTML5的一个新特性,已被所有浏览器支持,不同于古老的jsonp只能get请求. 检测方式: 1.curl访 ...

  6. [lua][openresty]代码覆盖率检测的解决方式

    废话在前 什么是代码覆盖率 来自百度百科 代码覆盖(Code coverage)是软件测试中的一种度量,描述程式中源代码被测试的比例和程度,所得比例称为代码覆盖率. 开发人员为何关注? 在我们的开发过 ...

  7. p2p nat 穿透原理

    nat 打洞穿透原理,需要服务端. 假设有A.B两个客户端和S一个服务器 Step 1 : A.B发送UDP请求给S,S知道了A.B在公网的IP和端口. Step 2: A从S中取B在公网的IP和端口 ...

  8. 一种Go使用tcp检测超时的方式

    c.SetReadDeadline(time.Now()) if _, err := c.Read(one); err == io.EOF { l.Printf(logger.LevelDebug, ...

  9. mysql每天弹出窗口检测更新关闭方式...

    右击计算机-->管理-->系统工具-->任务计划程序-->MySQL<如下图>,选中右键删除或者禁用即可... 更新分界线--------------------- ...

随机推荐

  1. Python学习三---序列、列表、元组

    一.序列 1.1.序列概念 pythn中最基本的数据结构是序列(sequence). 序列中每个元素被分配一个序号-元素索引,第一个索引是0,第二个是1,以此类推.类似JAVA中数组和集合中的下标. ...

  2. java 进制转换

    class Dec2XXX { public static void main(String[] args) { toBin(6); toHex(6); toOct(6); } /*10to2*/ p ...

  3. Windows 编 程中的字符串

    (1)在win32编程中,如何使用string类型 #include <string> using namespace std; LPTSTR    lpCmdLine = L" ...

  4. Java部分总结图片版2(已加上原图链接!!!)

    Java部分总结图片版2(加上原图链接)

  5. 设计模式 --- 模型-视图-控制器(Model View Controller)

    模型-视图-控制器(Model-View-Controller,MVC)是Xerox PARC在20世纪80年代为编程语言Smalltalk-80发明的一种软件设计模式,至今已广泛应用于用户交互应用程 ...

  6. 肯爹的 StringUtils.isNumeric(String str)

    在项目中遇到一处bug,调试的结果竟然是StringUtils.isNumeric(String str) 在捣鬼(采用的是org.apache.commons.lang.StringUtils),下 ...

  7. 最锋利的Visual Studio Web开发工具扩展:Web Essentials详解(转)

    Web Essentials是目前为止见过的最好用的VS扩展工具了,具体功能请待我一一道来. 首先,从Extension Manager里安装:最新版本是19号发布的2.5版 然后重启你的VS开发环境 ...

  8. Android开发之 adb 启动问题或是部署应用不成功,出现“The connection to adb is down, and a severe error has occured.”错误

    首先是今天想测试下应用,没有问题的话就进行下一步的操作来着,结果遇到这个问题, The connection to adb is down, and a severe error has occure ...

  9. 【转载】kafka的工作原理

    http://www.ibm.com/developerworks/cn/opensource/os-cn-kafka/index.html 消息队列 消息队列技术是分布式应用间交换信息的一种技术.消 ...

  10. js开发工具箱

    昨天看到一位大牛的博客,里面有一篇文章“web前端开发分享-目录”,文章中提到的一个给前端er用的一个js开发工具箱.自己使用了一下,非常好用,代码压缩,代码美化,加密,解密之类基本功能都有,生成二维 ...