注:以下图片来自慕课网,侵权可删
STUN介绍
- STUN存在的目的就是进行NAT穿越
- STUN是典型的客户端/服务器模式。客户端发送请求,服务器进行响应
RFC STUN规范
- RFC3489/STUN
Simple Traversal of UDP Through NAT 通过UDP进行NAT穿越(失败率较高) - RFC5389/STUN
Session Traversal Utilities for NAT 包括UDP和TCP两种协议进行NAT穿越
STUN协议
- (协议头)包括 20字节的 STUN header
- (协议体)Body 中可以有 0个或多个 Attribute
RFC3489/STUN header格式
- 2字节(16bit)类型
- 2字节(16bit)消息长度,不包括消息头本身这20字节
- 16字节(128bit)事物ID,请求与响应事务ID相同
RFC5389/STUN header格式
不同点:
- 5389中前两位必须是0 0
- 3489中事务ID是128位,5389中是96位,另外32位被单独划分出来用做Magic Cookie
STUN Message Type
- 前两位必须是00, 以区分复用同一端口号的不同协议是不是STUN协议
- 2位用于分类,即C0和C1
C0和C1占两位,所以它有四种类型,请求,指示,成功应答、错误应答四种类型 -
12位用于定义请求/指示
比如,1代表绑定,2代表私有消息,隐私数据等
0b00:表示是一个请求
0b01:表示一个指示
0b10:表示是请求成功的响应
0b11:表示是失败请求的响应
最后一位1代表绑定 1前面的 00代表消息 10代表响应
最后一位2代表私密 2前面的 00代表消息 10代表响应
5389中将第二种类型去掉了
大小端模式
- 大端模式:数据的高字节保存在内存的低地址中
- 小端模式:数据的高字节保存在内存的高地址中
-
网络字节顺序:采用大端排序方式
右边是后发送过来的,属于低端,低字节
Transaction ID
- 4字节, 32位, Magic Cookie,固定值 0x2112A442。(有即为5389)通过它可以判断客户端是否可以识别某些属性
- 12字节,96位, 标识同一事务的请求和响应
STUN Message Body
- 跟在消息头后,有0或多个属性
-
每个属性进行 TLV编码:Type,Length,Value