STUN: NAT 类型检测方法
STUN(Simple Transversal of UDP through NATs)[21]是RFC3489 规定的一种NAT 穿透方式,它采用辅助的方法探测NAT 的IP 和端口。
STUN 的探测过程需要有一个公网IP的STUN 服务器,在NAT 后面的客户端必须和此服务器配合,互相之间发送若干个UDP数据包。
UDP 包中包含有客户端需要了解的信息,比如NAT 外网IP,PORT 等等。客户端通过是否得到这个UDP 包和包中的数据判断自己的NAT 类型。
前提条件:有一个公网的Server 并且绑定了两个公网IP(IP1,IP2)。这个Server 做UDP 监听(IP1,Port1),(IP2,Port2)并根据客户端的要求进行应答。
第一步:检测客户端是否有能力进行UDP 通信以及客户端是否位于NAT 后面。客户端建立UDP socket,然后用这个socket 向服务器的(IP1,Port1)
发送数据包要求服务器返回客户端的IP 和Port, 客户端发送请求后立即开始接受数据包,要设定socketTimeout(300ms),防止无限堵塞,重复这个过程若干次。
如果每次都超时,无法接受到服务器的回应,则说明客户端无法进行UDP 通信,可能是防火墙或NAT 阻止UDP 通信,这样的客户端也就不能建立P2P 连接了 。
当客户端能够接收到服务器的回应时,需要把服务器返回的客户端(IP,Port)和这个客户端socket 的 (LocalIP,LocalPort)比较,
如果完全相同则客户端不在NAT 后,这样的客户端具有公网IP 可以直接监听UDP端口接收数据进行通信(检测停止)。
否则客户端在NAT后要做进一步的NAT类型检测(检测继续)。
第二步:检测客户端NAT 是否是Full Cone NAT。客户端建立UDP socket 然后用这个socket 向服务器的(IP1,Port1)发送数据包
要求服务器用另一对(IP2,Port2)响应客户端的请求往回发送一个数据包,客户端发送请求后立即开始接受数据包,要设定socket Timeout(300ms),防止无限堵塞. 重复这个过程若干次。
如果每次都超时,无法接受到服务器的回应,则说明客户端的NAT 不是一个Full Cone NAT,具体类型有待下一步检测(继续)。
如果能够接受到服务器从(IP2,Port2)返回的应答UDP 包,则说明客户端是一个Full Cone NAT,这样的客户端能够进行UDP-P2P 通信,检测停止。
第三步:检测客户端NAT 是否是Symmetric NAT。客户端建立UDP socket 然后用这个socket 向服务器的(IP1,Port1)发送数据包要求服务器返回客户端的IP 和Port,
因为第一步保证了这个客户端可以进行UDP 通信,那么肯定能够获得返回的数据。
用同样的方法用一个socket 向服务器的(IP2,Port2)发送数据包要求服务器返回客户端的IP和Port。
比较上面两个过程从服务器返回的客户端(IP,Port),如果两个过程返回的(IP,Port)有一对不同则说明客户端为Symmetric NAT,
这样的客户端无法进行UDP-P2P通信。否则是Restricted Cone NAT,是否为Port Restricted Cone NAT 有待检测。
第四步:检测客户端NAT 是否是Restricted Cone NAT 还是Port Restricted ConeNAT。
客户端建立UDP socket 然后用这个socket 向服务器的(IP1,Port1)发送数据包要求服务器用IP1 和一个不同于Port1 的端口发送一个UDP 数据包响应客户端,
客户端发送请求后立即开始接受数据包,要设定socket Timeout(300ms),防止无限堵塞. 重复这个过程若干次。
如果每次都超时,无法接受到服务器的回应,则说明客户端是一个Port Restricted Cone NAT,如果能够收到服务器的响应则说明客户端是一个Restricted Cone NAT。
以上两种NAT 都可以进行UDP-P2P 通信。
注:以上检测过程中只说明了可否进行UDP-P2P 的打洞通信,具体怎么通信一般要借助于另外的中间服务器。
另外对于Symmetric NAT 不是说完全不能进行UDP-P2P 打洞通信,可以进行端口预测打洞, 不过不能保证成功。
STUN: NAT 类型检测方法的更多相关文章
- JavaScript中常用的几种类型检测方法
javascript中类型检测方法有很多: typeof instanceof Object.prototype.toString constructor duck type 1.typeof 最常见 ...
- NAT类型与穿透 及 STUN TURN 协议
STUN : Simple Traversal of User Datagram Protocol [UDP] Through Network Address Translators [NATs] S ...
- JS做类型检测到底有几种方法?看完本文就知道了!
JS有很多数据类型,对于不同数据类型的识别和相互转换也是面试中的一个常考点,本文主要讲的就是类型转换和类型检测. 数据类型 JS中的数据类型主要分为两大类:原始类型(值类型)和引用类型.常见的数据类型 ...
- 小结 javascript中的类型检测
先吐槽一下博客园的编辑器,太不好用了,一旦粘贴个表格进来就会卡死,每次都要用html编辑器写,不爽! 关于javascript的类型检测,早在实习的时候就应该总结,一直拖到现在,当时因为这个问题还出了 ...
- js安全类型检测
背景: 都知道js内置的类型检测,大多数情况下是不太可靠的,例如: typeof . instanceof typeof 返回一个未经计算的操作数的类型, 可以发现所有对象都是返回object ...
- Objective-C 【动态类型检测&响应方法】
------------------------------------------- 动态类型检测 代码: #import <Foundation/Foundation.h> @inte ...
- 六.OC基础--1. id和instancetype类型,2.动态类型检测,3.响应方法,构造方法,4.重写构造方法,5.自定义构造方法
1. id和instancetype类型, id和instancetype类型区别: 1. id和instancetype都可以用来作为方法的返回值 2. id可以用来定义类型,instancetyp ...
- 手写面试编程题- 数组去重 深拷贝 获取文本节点 设置奇数偶数背景色 JS中检测变量为string类型的方法 第6题闭包 将两个数组合并为一个数组 怎样添加、移除、移动、复制、创建和查找节点? 继承 对一个数组实现随机排序 让元素水平 垂直居中的三种方式 通过jQuery的extend方法实现深拷贝
第1题==>实现数组去重 通过 new Set(数组名) // var arr = [12, 12, 3, 4, 5, 4, 5, 6, 6]; // var newarr1 = new Set ...
- Javascript学习笔记:3种检测变量类型的方法
①typeof检测变量类型 console.log(typeof 1);//number console.log(typeof "a");//string console.log( ...
随机推荐
- php 正则中的"i,m,s,x,e"分别表示什么
i如果设定此修正符,模式中的字符将同时匹配大小写字母.m当设定了此修正符,“行起始”和“行结束”除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的之后和之前.s如果设定了此修正符,模式中的圆点元 ...
- C++模板知识小结
模板定义:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性.模版可以分为两类,一个是函数模版,另外一个是类模版. 由于类模板包含类型参数,因 ...
- 多种css3时尚侧栏菜单展开显示效果Off-Canvas Menu Effects
今天我们想分享多种css3时尚侧栏菜单展开显示效果.侧边栏应用广泛,我们之前已经产生了一些效果灵感.风格演变,今天我们要展示一套新的灵感的现代效果.不同的布局和菜单的同步转换和页面可以让一切看起来更有 ...
- springMVC框架访问web-inf下的jsp文件
博客原文章:http://td.xue163.com/1042/1/10425265.html 用户提出问题:springMVC框架访问web-inf下的jsp文件,具体如下: 使用springMVC ...
- linux笔记_20150825_linux有什么好处
那么多人在用,linux到底有毛好处? 其实我也不太清楚,有人说免费,可是大家用windows也不要钱的.我想在天朝,要钱的软件不多吧.一个子也不用花.真心感谢为人民服务的那些大牛. 现在,除了在ub ...
- 项目管理及自动构建工具Maven
项目管理及自动构建工具Maven 一.Maven安装.目录结构.cmd命令1.下载安装apache-maven-3.2.3-bin.zip下载:http://maven.apache.org/down ...
- 游戏BI,起步了。
思索许久,终于决定自己的发展将会是游戏的BI. 即说即做,本文是我未来BI工作的开端. 传统的游戏BI,只是将运营的工作数据化,流量的变现指标化.和网站类似,无外乎用户导入,流失,保有,付费,回访等等 ...
- 【LeetCode】83 - Remove Duplicates from Sorted Array
Given a sorted array, remove the duplicates in place such that each element appear only once and ret ...
- UI控件入门
其实整个学习过程.确实有点儿混乱,因为不懂的东西太多,一会儿看这,一会儿看那,马上就乱了. 还是先做点儿简单的事儿,说控件,但不会说完全,只是入个门,知道怎么学控件,具体要学好每一个控件需要项目中磨练 ...
- 类的大小——sizeof 的研究
类的大小——sizeof 的研究(1) 先看一个空的类占多少空间? class Base { public: Base(); ~Base(); }; 注意到我这里显示声明了构造跟析构,但是sizeof ...