WebRTC 传输的基本知识-STUN

275 阅读3分钟

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定义的属性