STUN协议详解

1.概述

STUN(session traversal utilities for NAT),一种处理NAT传输的协议,主要作为工具来服务其他协议。它允许位于NAT(或多重NAT后的客户端找出自己的公网地址,查出自己位于那种类型的NAT之后以及NAT为某一个本地端口所绑定的internet端口),这些信息被用来两个同时处于NAT路由器之后的主机之间建立UDP通信。目的就是找到外界连接内部地址所需的信息。

2.STUN协议架构

1.请求/响应(request/response)类型,由客户端给服务器发送请求,并等待服务端返回响应,用于确定一个NAT给客户端分配的具体绑定。客户端通过事务ID将请求响应连接起来。
2.指示类型(indication transaction),由服务器或者客户端发送指示,另一方不产生响应,用于保持绑定的激活状态。事务ID通常作为debugging aid使用。

所有的STUN报文信息都包含有一个固定头部,包含了方法,类和事务ID。方法表示是具体哪一种传输类型。STUN中只定义了一种方法,即binding(绑定),其他方法可以由使用者自行扩展;Binding方法可以用于请求/响应类型和指示类型。

STUN基于客户机-服务器协议。如一个VoIP电话或者软件可能会包含一个STUN客户端。这个客户端向STUN服务器发送请求,之后,服务器就会向STUN客户端报告NAT路由器的公网IP地址以及NAT为允许传入流量传回内网而开通的端口。同时还使得STUN客户端能够确定正在使用的NAT类型——因为不同的NAT类型处理传入的UDP分组的方式不同。

3 STUN报文格式

        包括20字节的STUN header

        BODY中可以有0个或多个attribute

3.1 STUN HEADER

        

最高2为0,以区分复用同一端口时STUN协议

2位用于分类,C0和C1

12位用域定义 请求/指示

STUN MESSAGE TYPE (16位,包括前面置零的2位)定义了STUN的消息类型:

 0x0001:捆绑请求
0x0101:捆绑响应
0x0111:捆绑错误响应
0x0002:共享私密请求
0x0102:共享私密响应
0x0112:共享私密错误响应

 

Magic Cookie:32位字段包含固定值0x2112A442

transaction ID,96位的事务ID标识符,用于随机请求和响应,标识同一个式服务的请求和响应。

3.2 STUN BODY

消息头后有0或多个属性

每个属性进行TLV编码:Type,Length,Value

 

0x0014: REALM

0x0015:NONCE

0x0020:XOR-MAPPED-ADDRESS

0x8022:SOFTWARE

0X8023:ALTERNATE-SERVER

0X8024:FINGERPRINT

在ICE中,包含STUN中用到的几个属性,具体如下所示:

0x0024 PRIORITY

0x0025 USE-CANDIDATE

0x8029 ICE-CONTROLLED

0x802A ICE-CONTROLLING

 6 和 7 是最关键的用于验证

3.2.1 MAPPED-ADDRESS/映射地址

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

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

3.2.3 ERROR-CODE/错误码

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

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值