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)则不能使用。

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打洞失败。

clipboard.png

3.2.3 ERROR-CODE/错误码

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

clipboard.png

阅读 6.6k
94 声望
4 粉丝
0 条评论
94 声望
4 粉丝
文章目录
宣传栏