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 (sender)和NAT-B(receiver)的不同而不同,具体方式如下:
|
NAT-B |
公网 |
FULL CONE |
RESTRICT CONE |
PORT RESTRICT |
SYMMETRIC |
|
公网 |
direct |
hole punching |
hole punching |
hole punching |
reverse |
|
FULL |
direct |
hole punching |
hole punching |
hole punching |
reverse |
|
RESTRICT |
direct |
hole punching |
hole punching |
hole punching |
reverse |
|
PORT |
direct |
hole punching |
hole punching |
hole punching |
Port prediction |
|
SYMMETRIC |
direct |
hole punching |
hole punching |
Port prediction |
Port prediction |
P2P NAT检测和穿越方式的更多相关文章
- NAT的三种方式
NAT的三种方式: 一.端口NAT acces-list 1 permit IP/Mask ip nat inside source list “number” interface fastether ...
- Proteus传感器+气体浓度检测的报警方式控制仿真
Proteus传感器+气体浓度检测的报警方式控制仿真 目录 Proteus传感器+气体浓度检测的报警方式控制仿真 1 实验意义理解 2 主要实验器件 3 实验参考电路 4 实验中的问题思考 4.1 实 ...
- VMware的“桥接”、“NAT”、“Host-only”上网方式的区别
http://liblog.littleyuan.com/archives/9 在说到VMware的网络模型之前,先说一下VMware的几个虚拟设备: VMnet0:这是VMware用于虚拟桥接网络下 ...
- CentOS 6.5静态IP的设置(NAT和桥接联网方式都适用)
不多说,直接上干货! 为了方便,用Xshell来.并将IP设置为静态的.因为,在CentOS里,若不对其IP进行静态设置的话,则每次开机,其IP都是动态变化的,这样会给后续工作带来麻烦.为此,我们需将 ...
- CORS漏洞利用检测和利用方式
CORS全称Cross-Origin Resource Sharing, 跨域资源共享,是HTML5的一个新特性,已被所有浏览器支持,不同于古老的jsonp只能get请求. 检测方式: 1.curl访 ...
- [lua][openresty]代码覆盖率检测的解决方式
废话在前 什么是代码覆盖率 来自百度百科 代码覆盖(Code coverage)是软件测试中的一种度量,描述程式中源代码被测试的比例和程度,所得比例称为代码覆盖率. 开发人员为何关注? 在我们的开发过 ...
- p2p nat 穿透原理
nat 打洞穿透原理,需要服务端. 假设有A.B两个客户端和S一个服务器 Step 1 : A.B发送UDP请求给S,S知道了A.B在公网的IP和端口. Step 2: A从S中取B在公网的IP和端口 ...
- 一种Go使用tcp检测超时的方式
c.SetReadDeadline(time.Now()) if _, err := c.Read(one); err == io.EOF { l.Printf(logger.LevelDebug, ...
- mysql每天弹出窗口检测更新关闭方式...
右击计算机-->管理-->系统工具-->任务计划程序-->MySQL<如下图>,选中右键删除或者禁用即可... 更新分界线--------------------- ...
随机推荐
- spring源码分析的书到了
现在写java后台可以说都能用上spring 在原有的spring基础上,加上自己定制的一些功能,能够使编程变得非常简化. 我也准备在我的毕业设计中写一些spring改造的东西.用来简化开发. 就拿连 ...
- Sqlserver创建连接MySql的链接服务器
第一步:在MySql服务器上安装与系统对应的 MySql-Connector-ODBC 官方下载地址 安装过程中可能会报 缺失 msvcr100.dll 的错误,这需要你根据系统到网上下载对应的这个 ...
- 【mysql】关于Index Condition Pushdown特性
ICP简介 Index Condition Pushdown (ICP) is an optimization for the case where MySQL retrieves rows from ...
- 大数据架构-使用HBase和Solr将存储与索引放在不同的机器上
大数据架构-使用HBase和Solr将存储与索引放在不同的机器上 摘要:HBase可以通过协处理器Coprocessor的方式向Solr发出请求,Solr对于接收到的数据可以做相关的同步:增.删.改索 ...
- Swing应用开发实战系列之四:组件内容实时刷新问题
窗口组件动态刷新问题,在dotnet中根本不算什么问题,用几句代码很轻松就能搞定,但是在Swing中,实现动态刷新组件内容却是一件颇为吃力的事情.譬如针对我们经常用到的刷新JLable.JTextFi ...
- android:layout_gravity和android:gravity的区别
1.首先来看看android:layout_gravity和android:gravity的使用区别. android:gravity: 这个是针对控件里的元素来说的,用来控制元素在该控件里的显示位置 ...
- URAL 1430 Crime and Punishment
Crime and Punishment Time Limit:500MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u ...
- Vmware中Ubuntu的各种问题
Question1: Ubuntu正在运行的时候手残强行关闭了Vmware软件,重启软件发现如下图所示的状态: ''' 完全黑屏怎么解决,提示信息是recovering journal就是说正在恢复日 ...
- OpenXml入门----给Word文档添加表格
下面将展示如何使用Openxm向Word添加表格. 代码中表头和数据我用的同一个TableRow来添加,其实可以通过TableHeader来,其实都一样.后面教程我会给出如何设置单元格样式.表头那一行 ...
- Elastic search入门
首先是下载elasticsearch https://www.elastic.co/downloads,解压: 然后下载了中文分析器ik,github上搜索elasticsearch-ik就能找到,h ...