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 类型检测方法的更多相关文章

  1. JavaScript中常用的几种类型检测方法

    javascript中类型检测方法有很多: typeof instanceof Object.prototype.toString constructor duck type 1.typeof 最常见 ...

  2. NAT类型与穿透 及 STUN TURN 协议

    STUN : Simple Traversal of User Datagram Protocol [UDP] Through Network Address Translators [NATs] S ...

  3. JS做类型检测到底有几种方法?看完本文就知道了!

    JS有很多数据类型,对于不同数据类型的识别和相互转换也是面试中的一个常考点,本文主要讲的就是类型转换和类型检测. 数据类型 JS中的数据类型主要分为两大类:原始类型(值类型)和引用类型.常见的数据类型 ...

  4. 小结 javascript中的类型检测

    先吐槽一下博客园的编辑器,太不好用了,一旦粘贴个表格进来就会卡死,每次都要用html编辑器写,不爽! 关于javascript的类型检测,早在实习的时候就应该总结,一直拖到现在,当时因为这个问题还出了 ...

  5. js安全类型检测

    背景: 都知道js内置的类型检测,大多数情况下是不太可靠的,例如:  typeof  . instanceof typeof 返回一个未经计算的操作数的类型, 可以发现所有对象都是返回object  ...

  6. Objective-C 【动态类型检测&响应方法】

    ------------------------------------------- 动态类型检测 代码: #import <Foundation/Foundation.h> @inte ...

  7. 六.OC基础--1. id和instancetype类型,2.动态类型检测,3.响应方法,构造方法,4.重写构造方法,5.自定义构造方法

    1. id和instancetype类型, id和instancetype类型区别: 1. id和instancetype都可以用来作为方法的返回值 2. id可以用来定义类型,instancetyp ...

  8. 手写面试编程题- 数组去重 深拷贝 获取文本节点 设置奇数偶数背景色 JS中检测变量为string类型的方法 第6题闭包 将两个数组合并为一个数组 怎样添加、移除、移动、复制、创建和查找节点? 继承 对一个数组实现随机排序 让元素水平 垂直居中的三种方式 通过jQuery的extend方法实现深拷贝

    第1题==>实现数组去重 通过 new Set(数组名) // var arr = [12, 12, 3, 4, 5, 4, 5, 6, 6]; // var newarr1 = new Set ...

  9. Javascript学习笔记:3种检测变量类型的方法

    ①typeof检测变量类型 console.log(typeof 1);//number console.log(typeof "a");//string console.log( ...

随机推荐

  1. Http中Cookie与Set-Cookie头

    [原文:http://hi.baidu.com/qinglvzhuye/item/6664a807bb8be3dd73e676d6] android 获取 cookies 有很多办法,但是记住了. h ...

  2. dos 实用命令收集

    隐藏文件夹: H:\>attrib gho +h +s +r 解决win2012服务器上网慢:netsh int tcp set global  ecn=disable

  3. 虚拟机VMware tools作用以及其安装

    虚拟机VMware tools的作用(1). 更新虚拟机中的显卡驱动, 使虚拟机中的XWindows可以运行在SVGA模式下.在客户操作系统中安装Mware Tools非常重要.如果不安装VMware ...

  4. 性能测试指标&说明 [解释的灰常清楚哦!!]

    详见: 浅谈软件性能测试中关键指标的监控与分析 http://www.51testing.com/html/18/n-3549018.html

  5. CMDB属性及分类问题思考

    定义的烦恼 在某一次系统监控的讨论会议上,我随便提出了个问题:“如何定义一个系统?”,结果答案就五花八门起来了,会议也跑题了. 为什么问这个问题,是因为某些同事觉得某个系统比较大,就往下分为子系统.组 ...

  6. 【quick-cocos2d-x】Lua 语言基础

    版权声明:本文为博主原创文章,转载请注明出处. 使用quick-x开发游戏有两年时间了,quick-x是cocos2d-Lua的一个豪华升级版的框架,使用Lua编程.相比于C++,lua的开发确实快速 ...

  7. C语言部分

    1.内核的裁剪怎么裁剪 2.深入理解uboot 3.TCP/IP TCP/UDP原理是什么? 4.项目里你做了些什么?怎么做的?为什么要那样做? 5.指针与数组的用法及计算 6.单链表和双链表的用法 ...

  8. javascript常用的小知识

    1. oncontextmenu="window.event.returnvalue=false" 将彻底屏蔽鼠标右键 <table border oncontextmenu ...

  9. InfiniBand

    Mellanox InfiniBand卡线缆性能延迟性测试程序源码,C源码实现操作mysql库,实现简单的增删改查,代码当前用的是增插入20000条数据 具体见源码 #include <mysq ...

  10. 第一百九十六天 how can I 坚持

    老妈邮的咸菜到了,美味啊,买不到,哈哈. 以后要勤给鱼换水啊,10天不换,水都臭了,拒绝懒惰. 明天要回济南了,刘松结婚,估计又没法发博客了. 两条鱼,一条罗娜,一条我,哈哈. 睡觉.