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<如下图>,选中右键删除或者禁用即可... 更新分界线--------------------- ...
随机推荐
- iOS之UI--微博个人详情页
前言:微博个人详情页,和我常用的的QQ空间的详情页是同样的.要求能够融会贯通,做这一类的界面能够快速上手实现. 动态图效果展示: 直接使用UINavigationBar->UITableView ...
- 关于git
一.Git基础教程 01.[入门练习]廖雪峰 git教程网:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8 ...
- MONGODB(三)——Java操作Mongo
相比于java调用MySqlApI来操作数据库,调用Mongo要简洁容易的多.通过一个简单的样例,很容易地就可以上手 一.导入Jar包 添加Monog支持Java的jar包,这里使用的是2.9.3 & ...
- Windows环境下maven 安装与环境变量配置
Maven是一个项目管理的Java 工具,在JavaEE中,我们可以使用Maven方便地管理团队合作的项目,现在我们在学习JavaEE框架,使用Maven可以管理类库,有效方便地供团队中的其他人员使用 ...
- hdu 3635 Dragon Balls(并查集)
Dragon Balls Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- 开创学习的四核时代-迅为iTOP4412学习开发板
产品特点: 处理器: Exynos 4412 处理器,Cortex-A9四核,功耗性能俱佳! 性能: 1GB(可选2GB) 双通道 64bit数据总线 DDR3: 4GB(可选16GB)固态硬盘EMM ...
- Java语言中的基本词汇
1.标识符包.类.方法.参数和变量的名称.大小写字母.数字._和$符号的组合,不以数字开始,不能使关键字,不能包括分隔符和换行.(严格区分大小写,最大长度255个字符) 2.字面量 某种类型的值(具 ...
- docker containerd 中的create 容器操作
containerd的create container的API如下所示: type CreateContainerRequest struct { Id string BundlePath strin ...
- 【问题&解决】解决 Android SDK下载和更新失败“Connection to https://dl-ssl.google.com refused”的问题
缘由: 更新sdk,遇到了更新下载失败问题: Fetching https://dl-ssl.google.com/android/repository/addons_list-2.xmlFetche ...
- html5 实现video标签的自定义播放进度条
现在随着html5的渐热,越来越多的web开发者都开始选择使用html5写出一些比较好的web应用. html代码: <!DOCTYPE html> <html lang=" ...