WEBRTC穿透技术探讨之STUN协议详解

1. STUN协议概述

  STUN(Session Traversal Utilities for NAT/NAT环境下的会话传输工具),是一种处理NAT传输的协议,主要做为工具来服务其余协议。它容许位于NAT(或者多重NAT后的客户端找出本身的公网地址,查出本身位于哪一种类型的NAT以后以及NAT为某一个本地端口所绑定的Internet端端口。这些信息被用来在两个同时处于NAT路由器以后的主机之间创建UDP通讯。目的就是找到外界链接内部地址所需的信息。服务器

2. STUN协议的架构

  STUN协议是一个C/S架构的协议,支持两种传输类型:
1.请求/响应(request/response)类型,由客户端给服务器发送请求,并等待服务端返回响应,用于肯定一个NAT给客户端分配的具体绑定。客户端经过事务ID将请求响应链接起来。
2.指示类型(indication transaction),由服务器或者客户端发送指示,另外一方不产生响应,用于保持绑定的激活状态。事务ID一般做为debugging aid使用。
  全部的STUN报文信息都包含有一个固定头部,包含了方法,类和事务ID。方法表示是具体哪种传输类型。STUN中只定义了一种方法,即binging(绑定),其余方法能够由使用者自行扩展;Binding方法能够用于请求/响应类型和指示类型。
  STUN基于客户机-服务器协议。如一个VoIP电话或者软件可能会包含一个STUN客户端。这个客户端向STUN服务器发送请求,以后,服务器就会向STUN客户端报告NAT路由器的公网IP地址以及NAT为容许传入流量传回内网而开通的端口。同时还使得STUN客户端可以肯定正在使用的NAT类型——由于不一样的NAT类型处理传入的UDP分组的方式不一样。四种主要网络类型中有三种是能够使用的:彻底圆锥型NAT、受限圆锥型NAT和端口受限圆锥型NAT。但大型公司网络中常常采用的对称型NAT(又称为双向NAT)则不能使用。cookie

3. STUN报文格式

3.1 STUN报头格式

  STUN报文和大多数网络类型的格式同样,是以大端编码(big-endian)的,即最高有效位在左边。全部的STUN报文都是以20字节的头部开始,后面跟着若干个属性。下面来详细说说。
  STUN头部包含了STUN消息类型,magic cookie,事务ID和消息长度,以下:网络

clipboard.png
  最高的两位必须为0,当STUN和其余协议复用的时候,用来区分STUN包和其余数据包。
  STUN Message Type(16位,包括前面置零的2位) 定义了STUN的消息类型:
0x0001:捆绑请求
0x0101:捆绑响应
0x0111:捆绑错误响应
0x0002:共享私密请求
0x0102:共享私密响应
0x0112:共享私密错误响应
  Message Type(后14位)又能够进一步分解为如下结构:架构

clipboard.png

  1.其中M11到M0表示方法的12位编码。STUN目前只定义了一个方法,即bindingO(绑定),其余的方法能够由使用者自行拓展;Binding方法能够用于请求/响应类型和指示类型。
  2.C1-C0表示类编码,分别标识报文的reqest(0b00),indicatioon(0b01),success response(0b10),error response(0b11),每个不一样的方法都有可能对应不一样的类别。
  Message Length 16位消息大小的字节数,但不包括20字节的头部。全部的STUN属性都是四字节对齐的
  Magic Cookie:32位字段包含固定值0x2112A442
  Stransaction ID,96位的事务ID标识符,用于随机请求和响应,请求其相应的全部响应具备相同的标识符。工具

3.2 STUN报文常见属性

3.2.1 MAPPED-ADDRESS/映射地址

  MAPPED-ADDRSS同时也是class STUN的一个属性,之因此还存在也是为了前向兼容。其包含了NAT客户端的反射地址。
  Family位IP类型,即IPV4(0x01)或IPV6(0x02)
  port位端口
  address为32位或128位的IP地址。编码

clipboard.png

3.2.2 XOR-MAPPED-ADDRESS/异或映射地址

  XOR-MAPPED-ADDRESS和MAPPED-ADDRESS基本相同,不一样点是反射地址部分通过一次异或(XOR)处理。
  X-port字段:是将NAT的映射端口以小端形式与magic cookie的高16位进行异或,再将结果转换成大段形式而获得的,X-Address也是相似。之因此要通过这么一次转换,是由于在实践中发现不少NAT会修改payload中自身公网IP的32位数据,从而致使NAT打洞失败。spa

clipboard.png

3.2.3 ERROR-CODE/错误码

  ERROR-CODE属性用于error response报文中。其中包含了300-699表示的错误码,以及一个UTF-8格式的文字出错信息(Reason phrase)。debug

clipboard.png

相关文章
相关标签/搜索