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 类型检测方法,码迷,mamicode.com

时间: 2024-08-11 09:51:55

STUN: NAT 类型检测方法的相关文章

NAT类型

考 虑到UDP的无状态特性,目前针对其的NAT实现大致可分为Full Cone.Restricted Cone.Port Restricted Cone和Symmetric NAT四种.值得指出的是,对于TCP协议而言,一般来说,目前NAT中针对TCP的实现基本上是一致的,其间并不存在太大差异,这是因为TCP协议本身 便是面向连接的,因此无需考虑网络连接无状态所带来复杂性. 用语定义1.内部Tuple:指内部主机的私有地址和端口号所构成的二元组,即内部主机所发送报文的源地址.端口所构成的二元组2

JavaScript类型检测

在编写JS代码中,经常要对某个变量进行类型检测.常用的类型检测方法有: typeof Object.prototype.toString constructor instanceof typeof typeof可以识别出基本数据类型(null除外),同时typeof并不能识别具体的对象类型(Function除外). eg: typeof "seven"; // "string" typeof 7; //"number" typeof true ;

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

------------------------------------------- 动态类型检测 代码: #import <Foundation/Foundation.h> @interface Animal : NSObject -(void)run; -(void)abc; @end @implementation Animal -(void)run { NSLog(@"Animal run!"); } -(void)abc { NSLog(@"abc!&

LVS中ipvsadm的使用方法及NAT类型集群实现

LVS中实现负载均衡调度的规则生成工具是ipvsadm,程序包就是ipvsadm. 安装: 在centos64位上安装ipvsadm: #yum install ipvsadm –y 安装后键入#rpm –ql ipvsadm  显示出如下信息 #/etc/rc.d/init.d/ipvsadm  服务脚本 #/etc/sysconfig/ipvsadm-config  保存规则的配置文件 #/sbin/ipvsadm  主程序 #/sbin/ipvsadm-restore  从文件中恢复规则并

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

①typeof检测变量类型 1 console.log(typeof 1);//number 2 console.log(typeof "a");//string 3 console.log(typeof true);//boolean 4 console.log(typeof undefined);//undefined 5 console.log(typeof (function func(){}));//function 6 console.log(typeof null);//

说说javascript变量类型和变量类型检测

javascript是一种弱类型语言,它的典型例子就是即变量在使用的时候可以给它赋值任何类型.那么先来看下javascript都有那些变量类型已经它们的使用方法吧. 先来看看javascript都有那些类型吧: string --- 字符串number --- 数值boolean --- 布尔值undefined --- 未申明的变量 或 申明并未赋值null --- 空object  --- 对象function  --- 函数 这里比较有争议的是 function 类型到底要不要归属到变量类

JavaScript数据类型、类型检测函数——慕课网ArraysSimilar编程练习

基本类型 string number boolean function undefined object (null,Array,Date,window) 隐式转换与"==""===" num-string   var str=num+' ' string-num   var num=str-0 "=="进行隐式转换后判断(即判断变量里面的值) "==="直接判断(判断是不是一个东西) ( NaN!=NaN null===nu

JavaScript安全的类型检测

在JavaScript中,内置的类型检测机制并非是完全可靠的.这里分别指的typeof和instanceof关键字. 由于typeof有一些无法预知的行为,经常会导致检测数据类型时得到不靠谱的结果,Safari在对正则表达式应用typeof时会返回"function",在chrome下回返回"object". instanceof存在多个全局作用域的情况下(指的是一个页面中包含iframe),也是问题多多.比如下面的代码: var isArray = value i

通讯链路的检测方法

问题背景: TCP不能及时通知连接中断,如果使用keep-live机制默认时间是2小时11分钟15秒没有通讯才会发送探测消息,如依靠TCP超时机制可能要等待9分钟才能检测出网络中断,因此必须用户自己检测连接是否正常. 连接中断可能的原因: 1)一方主机崩溃 发不出FIN,对等方依靠重发检测链路中断,如果崩溃方在对等方准备撤销连接之前又重新启动了,若此时收到了消息则会回复RST消息给对等方,这将导致对等方撤销连接,对等方会收到ECONNECREST错误,或者下一次读导致SIGPIPE信号或EPIP