1:STUN消息头
消息头有20个字节组成:00 + 消息类型 + 消息体长度 + 魔术字 + 事务ID
- 前2个字节:
- 其中00占2位:固定全是0
- 消息类型占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的关键位判断进行解复用。