转载 http://blog.csdn.net/mazidao2008/article/details/4934257

STUN(Simple Traversal of UDP over NATs,NAT 的UDP简单穿越)是一种网络协议,它允许位于NAT(或多重NAT)后的客户端找出自己的公网地址,查出自己位于哪种类型的NAT之后以及NAT为某一个本地端口所绑定的Internet端端口。这些信息被用来在两个同时处于NAT 路由器之后的主机之间建立UDP通信。该协议由RFC 3489定义。

一旦客户端得知了Internet端的UDP端口,通信就可以开始了。如果NAT是完全圆锥型的,那么双方中的任何一方都可以发起通信。如果NAT是受限圆锥型或端口受限圆锥型,双方必须一起开始传输。

需要注意的是,要使用STUN RFC中描述的技术并不一定需要使用STUN协议——还可以另外设计一个协议并把相同的功能集成到运行该协议的服务器上。

SIP之类的协议是使用UDP分组在Internet上传输音频和/或视频数据的。STUN是一个客户机-服务器协议。一个VoIP电话或软件包可能会包括一个STUN客户端。这个客户端会向STUN服务器发送请求,之后,服务器就会向STUN客户端报告NAT路由器的公网IP地址以及NAT为允许传入流量传回内网而开通的端口。

以上的响应同时还使得STUN客户端能够确定正在使用的NAT类型——因为不同的NAT类型处理传入的UDP分组的方式是不同的。四种主要类型中有三种是可以使用的:完全圆锥型NAT、受限圆锥型NAT和端口受限圆锥型NAT——但大型公司网络中经常采用的对称型NAT(又称为双向NAT)则不能使用。

Simple Traversal of User Datagram Protocol (UDP) Through Network

Address Translators (NATs) (STUN)

STUN,是为了实现透明的穿透NAT,而定义的一套协议。它使本地的内网的机器,具有取得,能够得知它的NAT网关的IP,NAT类型的能力。

为什么需要STUN:

因为NAT虽然解决了IP地址稀少的问题,但是也带来了很多的问题。比如所有P2P应用,像文件SHARE,要想穿透NAT,首先知道NAT的一些特性:

NAT分为4种(加上防火墙的话,多几种情况):

1.完全透明NAT(Full Cone NAT):

从相同内部主机(IN IPX) +端口(IN PORTX)发送的数据MAPING为相同的IP(OUT IP X)和端口(OUT PORT X)发送带外网.并且从另一个服务器(Y),如果直连到MAPING的IP(OUT IP X)和端口(OUT PORT X )上,数据将会被转发到内部主机上. (IN IPX), (IN PORTX).

也就是说进内部网的数据包的SPORT,SPORT不受限制

2.受限NAT(Restricted Cone),

从相同内部主机(IN IPX) +端口(IN PORTX)发送的数据MAPING为相同的IP(X)和端口发送带外网.和完全NAT不同的是,只有当为X时,外部机器的的请求就被转发到主机(IN IPX) +端口(IN PORTX)。也就是说进内部网的数据包的,SPORT不受限制,SIP受限制,只能为NAT MAP数据的IP

3,端口受限NAT(Port Restricted Cone)

和受限NAT不同的是,只有当外部主动请求的的源IP和端口,等于内部网发送的请求的目的IP和端口。

4.对称NAT

如果发送的包的目的IP AND PORT,那么MAPPING IP AND PORT,将相同。内部网同一台机器,同一个端口如果目的地址不同,那么MAPPING的端口也不同,所以只有他主动连的服务器才可能知道他的 MAPPING后端口,别的服务器如果想连他只能靠猜测端口。

总结:前面3重NAT,MAPING PORT 和 IP,是根据发送包的的内部网的IP和端口决定的。如果数据的内网IP和端口相同,那么MAPPING后的端口和地址是固定。这个功能为我们的穿越提供了很好条件。

第4种NAT,打洞后的MAPPING 地址和端口将变地不可靠。很难穿越。注意SERVERA,和SERVERB是两个公网地址,而不是两台机器.

STUN协议(浅析例子分析)

主要功能是检测是否位于NAT后面,如果位于NAT后面,经过NAT转换后的地址和端口是什么,另外可以检测NAT的类型。

基本思想

在私网内部安装一个STUN client,在公网上安装一个STUN Server,STUN 协议定义了一些消息格式,大体上分成Request/Response,client向server发送 request,server发送response给client。如何检测STUN client是否在NAT后面呢?原理很简单,Server在收到client的UDP包以后,Server将接收到该包的地址和端口利用udp传回来给 client,client把这些地址和端口与本机的ip地址和端口进行比较,如果不同,说明在NAT后面,否则就位于NAT前面。为了检测不同类型的 NAT,STUN协议定义了一些消息属性,要求Server有不同的动作,比如发送响应的时候使用不同的IP地址和端口,或者改变端口等等。STUN协议 对NAT可能有效,但是对防火墙就无能为力了,因为防火墙可能不会打开UDP端口。

NAT分类

STUN协议将NAT粗略分为4种类型,即Full Cone、Restricted Cone、Port Restricted Cone和Symmetric。举个实际例子来说明这四种NAT的区别:

A机器在私网(192.168.0.4)

NAT服务器(210.21.12.140)

B机器在公网(210.15.27.166)

C机器在公网(210.15.27.140)

现在,A机器连接过B机器,假设是 A(192.168.0.4:5000)-> NAT(转换后210.21.12.140:8000)-> B(210.15.27.166:2000)。

同时A从来没有和C通信过。

则对于不同类型的NAT,有下列不同的结果:

Full Cone NAT:C发数据到210.21.12.140:8000,NAT会将数据包送到A(192.168.0.4:5000)。因为NAT上已经有了192.168.0.4:5000到210.21.12.140:8000的映射。

Restricted Cone:C无法和A通信,因为A从来没有和C通信过,NAT将拒绝C试图与A连接的动作。但B可以通过210.21.12.140:8000与A的 192.168.0.4:5000通信,且这里B可以使用任何端口与A通信。如:210.15.27.166:2001 -> 210.21.12.140:8000,NAT会送到A的5000端口上。

Port Restricted Cone:C无法与A通信,因为A从来没有和C通信过。而B也只能用它的210.15.27.166:2000与A的192.168.0.4:5000通信,因为A也从来没有和B的其他端口通信过。该类型NAT是端口受限的。

Symmetric NAT:上面3种类型,统称为Cone NAT,有一个共同点:只要是从同一个内部地址和端口出来的包,NAT都将它转换成同一个外部地址和端口。但是Symmetric有点不同,具体表现在: 只要是从同一个内部地址和端口出来,且到同一个外部目标地址和端口,则NAT也都将它转换成同一个外部地址和端口。但如果从同一个内部地址和端口出来,是 到另一个外部目标地址和端口,则NAT将使用不同的映射,转换成不同的端口(外部地址只有一个,故不变)。而且和Port Restricted Cone一样,只有曾经收到过内部地址发来包的外部地址,才能通过NAT映射后的地址向该内部地址发包。

现针对Symmetric NAT举例说明:

A机器连接过B机器,假使是 A(192.168.0.4:5000)-> NAT(转换后210.21.12.140:8000)-> B(210.15.27.166:2000)

如果此时A机器(192.168.0.4:5000)还想连接C机器 (210.15.27.140:2000),则NAT上产生一个新的映射,对应的转换可能为A(192.168.0.4:5000)-> NAT(转换后210.21.12.140:8001)-> C(210.15.27.140:2000)。此时,B只能用它的210.15.27.166:2000通过NAT的210.21.12.140: 8000与A的192.168.0.4:5000通信, C也只能用它的210.15.27.140:2000通过NAT的210.21.12.140:8001与A的192.168.0.4:5000通信,而 B或者C的其他端口则均不能和A的192.168.0.4:5000通信。

STUN 的简单操作过程:

发送请求。请求分为两种

1.Binding Requests, sent over UDP,

用来发现NAT的公网地址,和MAPPING后的端口

2.  Binding Response,

服务器产生Binding Response,并把得到的MAPPINGIP 和端口,返回到客户端, 客户端比较MAPPING地址是否和本机地址相同,如果是说明是本机也是公网,否则判断NAT的类型(判断方法:client uses additional STUN Binding Requests)

3.Binding Error,

4.Shared Secret Requests, sent over TLS [2] over TCP.

这个请求要求服务器返回一临时用户名和密码,用来下一步的Binding Requests/ Response,用来验证信息的完整性

5.Shared Secret Response,

6 Shared Secret Error Response。

STUN 信息结构

STUN 由以后数据结构构成:STUN头+STUN有效载荷

STUN头结构如下: 存储的值都是以网络顺序存放

字段    类型

STUN message type    Short int    消息类型

Length    Short int    有效载荷长度,不包含头长度

transaction ID    octet[16]    连接的ID值,检查Request,和Response

STUN的有效载荷

SHUN的有效载荷是一些STUN的属性构成,属性的类型由信息的类型来决定。

STUN的属性是定义好了的,属性列表(attribute)如下:

MAPPED-ADDRESS    必选    用在Binding Response,(添入MAPING IP 和PORT)

RESPONSEADDRESS    可选    用在Binding Request,指定Response,发送到哪里

如果没有指定,Response发送到MAPING IP 和 PORT

CHANGE-REQUEST    可选    用在Binding Request。用来决定,CLIENT的NAT类型是

制NAT,还是端口限制NAT,(命令服务器从不同的源端口/IP,Response请求)

CHANGED-ADDRESS    可选    用在Binding Responses告诉Client改变的端口和IP

SOURCE-ADDRESS    必选    只用在Binding Responses,标记信息的源PORT HE IP

USERNAME    可选    Shared Secret Response/ Binding Requests

PASSWORD,    必选    SharedSecret Response

ESSAGEINTEGRITY    可选    用在Binding Responses, Binding Request记录信息的完整性

ERROR-CODE        Binding Error Response and Shared Secret Error Response.

UNKNOWN-ATTRIBUTES

REFLECTED-FROM        Binding Responses.用于追溯和防止DDOS

穿透的方法和过程

stun简介的更多相关文章

  1. P2P通信标准协议(一)之STUN

    前一段时间在P2P通信原理与实现中介绍了P2P打洞的基本原理和方法,我们可以根据其原理为自己的网络程序设计一套通信规则, 当然如果这套程序只有自己在使用是没什么问题的.可是在现实生活中,我们的程序往往 ...

  2. STUN协议简析

    http://blog.csdn.net/mazidao2008/article/details/4934257 ——————————————————————————————————————————— ...

  3. STUN协议简介

    STUN简要 STUN(Simple Traversal of UDP over NATs,NAT 的UDP简单穿越)是一种网络协议.它同意位于NAT(或多重NAT)后的client找出自己的公网地址 ...

  4. WebRTC信令控制简介与STUN, TURN服务器搭建

    本文将向大家介绍两个方面的知识: WebRTC信令控制 STUN/TURN服务器的搭建 在前面的文章中已经向大家介绍了如何构建信令服务器.但构建的信令服务器是如何工作的?哪些消息需要信令服务器控制和中 ...

  5. webrtc进阶-信令篇-之三:信令、stun、turn、ice

    webRTC支持点对点通讯,但是webRTC仍然需要服务端:  . 协调通讯过程中客户端之间需要交换元数据,    如一个客户端找到另一个客户端以及通知另一个客户端开始通讯.  . 需要处理NAT(网 ...

  6. 中文翻译:pjsip教程(二)之ICE穿越打洞:Interactive Connectivity Establishment简介

    1:pjsip教程(一)之PJNATH简介 2:pjsip教程(二)之ICE穿越打洞:Interactive Connectivity Establishment简介 3:pjsip教程(三)之ICE ...

  7. 中文翻译:pjsip教程(一)之PJNATH简介

    在学习pjsip的过程中,发现只是单单的阅读英文官方文档,对于里边概念的理解还是不够透彻,并且苦于pjsip没有发现全一点的中文版本,所以想尽自己所能为建设和谐社会而贡献一份力量,文中定会有所疏漏,希 ...

  8. P2P技术简介

    P2P技术简介 NAT( Network Address Translation)穿越(俗称打洞)技术 前言: p2p已经存在于我们生活的方方面面:我们通过下载在工具(比如迅雷,bitorent,各种 ...

  9. P2P技术详解(三):P2P技术之STUN、TURN、ICE详解

    1.内容概述 在现实Internet网络环境中,大多数计算机主机都位于防火墙或NAT之后,只有少部分主机能够直接接入Internet.很多时候,我们希望网络中的两台主机能够直接进行通信,即所谓的P2P ...

随机推荐

  1. python爬虫基础13-selenium大全7/8-异常

    Selenium笔记(7)异常 本文集链接:https://www.jianshu.com/nb/25338984 完整文档 Exceptions that may happen in all the ...

  2. 谈谈你对Hibernate的理解

    答: 1. 面向对象设计的软件内部运行过程可以理解成就是在不断创建各种新对象.建立对象之间的关系,调用对象的方法来改变各个对象的状态和对象消亡的过程,不管程序运行的过程和操作怎么样,本质上都是要得到一 ...

  3. Altium Designer入门学习笔记4:PCB设计中各层的含义

    阻焊层:solder mask,是指板子上要上绿油的部分:因为它是负片输出,所以实际上有solder mask的部分实际效果并不上绿油,而是镀锡,呈银白色! 助焊层:paste mask,是机器贴片时 ...

  4. Java-basic-4-数据类型

    Number类 装箱:将内置数据类型作为包装类对象使用:拆箱:相反 public class test{ public static void main(String args[]) { // box ...

  5. ProC第一弹

    编译pro*c 的makefile例子 原来只需在makefile中追加include $(ORACLE_HOME)/precomp/lib/env_precomp.mk,其他一切按照makefile ...

  6. zoj 4054

    #define ll long long ; int t; ll ans,tmp; char s[N]; int main() { scanf("%d",&t); whil ...

  7. golang json 示例

    jsonStr, err := client.Get( deviceIdKey ).Result() if err == redis.Nil { deviceIds = []string{device ...

  8. python基础学习笔记——正则表达式

    1.什么是正则? 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则.(在Python中)它内嵌在Python中,并通过 r ...

  9. 02_ThreadLocal语法与源码分析

    文章导读: 早在JDK 1.2的版本中就提供Java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程 ...

  10. day01_11.break和continue

    1.continue 下一个(用next更加形象一点)整体的循环没有被破坏掉,而是跳到下一个循环单位中 <?php for($i=1;$i<=10;$i++){ if($i==4){ co ...