【stun系列03】对于stun协议头的理解

1:STUN消息头

  消息头有20个字节组成:00 + 消息类型  + 消息体长度 + 魔术字 + 事务ID

  • 前2个字节:
  1.   其中00占2位:固定全是0
  2.   消息类型占14位:其中根据消息头的前两个字节和C1C0划分为0x000:请求,0x001:指示,0x010:成功响应,0x011:错误响应。则消息方法只有Binding(0x01)

    根据消息类型和方法交集 可以分为,Binding请求(0x00 01),Binding成功响应(0x01 01),Binding失败响应(0x01 11),Binding指示(0x00 11)。其中指示消息用的很少,可以不需要管。

  • 消息体长度占16位:是消息体部分的总长度,由于4字节对齐特性,长度字段最后2位也全是0
  • 魔术字占32位:4个字节,是固定值0x2112A442
  • 事务ID占96位:12个字节,是由客户端随机生成的12字节随机值

  自此,消息头如何生成和填充已经确定

2:常用的请求的TLV属性生成规则

  TLV属性是:属性type + 属性长度 + 属性值

2.1:USERNAME

  属性type:两个字节,为0x0006

  属性长度:两个字节,是属性值的长度,即后续填充的value的长度

  属性值:可变长度的,用户名的内容+填充字段(填充完保证4字节对齐)

2.2:FINGERPRINT

  属性类型:0x8028

  属性长度:固定是4字节,因为值是经过4字节异或的。

  属性值:0x5354554e异或CRC(内容) 待定

2.3:MESSAGE-INTEGRITY

  属性类型:0x0008

  属性长度:固定20个字节

  属性值:短期认证:HMAC-SHA1计算的password值。计算方法:HMAC_SHA1(PASSWORD)

      长期认证:MD5(username ":" realm ":" SASLprep(password))

2.4:ICE-CONTROLED

  属性类型:0x8029

  属性长度:固定是8字节

  属性值:Tie breaker: 待定

2.5:ICE-CONTROLLING

  属性类型:0x802a

  属性长度:固定是8字节

  属性值:Tie breaker: 待定

2.6:XOR-MAPPED-ADDRESS

  属性类型:0x0020

  属性长度:IPV4:8字节;IPV6:20字节

  属性值:8位的固定值0 + 8位的协议簇类型 + 16位的端口号 + 地址异或

    协议簇类型为:1:IPV4;2:IPV6

    端口号:略 

    地址:{IPV4是4字节} 异或 {魔术字(magic cookie)}

       {IPV6是16字节} 异或 {魔术字(magic cookie) + 事务ID}

 

3:如果端口复

  需要根据stun的关键位判断进行解复用。

上一篇:(转)WebRTC信令控制与STUN/TURN服务器搭建


下一篇:docker pause 命令使用