STUN存在的目的就是进行NAT穿越
STUN是典型的客户端/服务端模式.客户端发送请求, 服务端进行响应.
RFC STUN规范
-
RFC3489/STUN : Simple Traversal of UDP Through NAT, 简单的UDP NAT穿越, 路由器对UDP的限制比较多, 所以穿越的失败率比较高.
-
RFC5389/STUN : Session Traversal Utilities for NAT, 在UDP的基础上同时包含了TCP协议.
STUN协议
- 包括20字节的STUN header
- body中可以有0个或多个Attribute
RFC3489/STUN header
-
其中2个字节(16bit)类型
-
2个字节消息长度, 不包括消息头本身的长度
-
16个字节(128bit)事务ID, 请求与响应事务ID相同
RFC5389/STUN header格式
从以上格式中看出 5389与3489规范 stun header格式的区别有:
-
5389最低两位一定是00, 以区分复用同一个端口时STUN协议
-
事务ID是96位, 另外的32为单独划分出来当做magic cookie
-
后面的14位中的其中2位用于分类, 即C0和C1, 可以表示4中状态: 请求、指示、成功应答、错误应答
-
12位用于定义请求/指示
STUN Message Type
-
0b00 : 表示是一个请求
-
0b01 : 表示时一个指示
-
0b10 : 表示是请求成功的响应
-
0b11 : 表示是请求失败的响应
从上图中可以得出:
-
右侧位低字节数据, 是后发送过来的
-
左侧是高字节数据, 是先发送过来的
大小端
-
大端模式 : 数据的高字节保存在内存的低地址中
-
小端模式 : 数据的高字节保存在内存的高地址中, 存储顺序与内存的增长顺序是一致的, 即低字节数据放在低地址中, 高字节的数据放在高地址中,inter的机器都是小端模式
-
网络字节顺序 : 采用大端排序模式 , 网络传输时 先传输100 再传20 最后传3.
STUN消息类型
-
0x0001 : 绑定消息
-
0x0101 : 绑定响应
-
0x0111 : 绑定错误
-
0x0002 : 私密请求 (5389规范中被弃用, 在body中表示)
-
0x0102 : 私密响应 (5389规范中被弃用, 在body中表示)
-
0x0112 : 私密错误 (5389规范中被弃用, 在body中表示)
Transaction ID
-
4字节, 32位, 固定值0x2112A442. 通过它可以判断客户端是否可以识别某些属性,也就是说如果是这个固定值那就是5389规范, 否则就是3489规范.
-
12字节, 96位, 标识同一个事务的请求和响应, 通过这个标识 对发送和接收的请求和响应进行匹配
STUN Message Body
-
消息头后有0或多个属性
-
每个属性进行TLV编码: Type, length, Value
RFC 3489定义的属性