在STUN Header 之后是零个或多个属性。 每个属性必须经过TLV编码,并具有16位类型Type,16位长度Length和一个可变长度值Value。每个STUN属性必须以32位边界结束。属性中的所有字段(Tyep、Length/Value)都首先发送最高有效位,即大端字节序。
在填充之前,Length字段表示以字节为单位的Value字段的长度。因为STUN Message在32位边界上对齐属性,即要求STUN Message的总长度是4字节的倍数,因此如果属性的Value字段长度不是4个字节的倍数,则将用1个,2个或3个字节填充Value字段,究竟填充在尾部还是头部,则有具体的属性决定,使得属性的Value字段长度是4字节的倍数。因为填充位被忽略,所以填充位可以是任何值,但一般建议是0值。
任何属性类型在STUN消息中可能会出现多次。除非另有说明,否则出现的顺序是重要的:接收者只需要处理第一次出现的情况,接收者可以忽略其它的任何重复。
为了本规范的将来修订版中需要时添加新属性,将属性空间分为两个范围。
属性的Type字段介于0x0000和0x7FFF之间的属性是需要理解的属性,这意味着STUN代理除非理解该属性,否则无法成功处理该消息属性。
类型值在0x8000和0xFFFF之间的属性是可选的理解属性,这意味着这些属性如果STUN代理不理解它们,则可以忽略它们。
STUN属性类型集由IANA维护。
本规范RFC5389定义的最初的属性:
Comprehension-required range (0x0000-0x7FFF):
0x0000: (Reserved)
0x0001: MAPPED-ADDRESS
0x0002: (Reserved; was RESPONSE-ADDRESS)
0x0003: (Reserved; was CHANGE-ADDRESS)
0x0004: (Reserved; was SOURCE-ADDRESS)
0x0005: (Reserved; was CHANGED-ADDRESS)
0x0006: USERNAME
0x0007: (Reserved; was PASSWORD)
0x0008: MESSAGE-INTEGRITY
0x0009: ERROR-CODE
0x000A: UNKNOWN-ATTRIBUTES
0x000B: (Reserved; was REFLECTED-FROM)
0x0014: REALM
0x0015: NONCE
0x0020: XOR-MAPPED-ADDRESS
Comprehension-optional range (0x8000-0xFFFF)
0x8022: SOFTWARE
0x8023: ALTERNATE-SERVER
0x8028: FINGERPRINT
MAPPED-ADDRESS属性
MAPPED-ADDRESS属性表示a reflexive transport address of the client。它由一个8位地址族和一个16位端口组成,后跟一个表示IP地址的固定长度值。
如果地址族是IPv4,则地址必须为32位。 如果地址族是IPv6,则地址必须为128位。 所有字段必须是网络字节序。
family字段可以取得值是:
0x01:IPv4
0x02:IPv6
MAPPED-ADDRESS属性的前8bits必须设置为0并且接受者必须忽略。作用是是4字节的边界对齐,该属性仅由服务器使用,以实现与RFC 3489 [RFC3489]客户端的向后兼容性。
例如:
XOR-MAPPED-ADDRESS属性
XOR-MAPPED-ADDRESS属性与MAPPED-ADDRESS属性相同,不同之处在于自反传输地址通过XOR函数进行了加密。
X-Port是通过以主机字节顺序获取映射的端口,然后将其与Magic Cookie的最高16位进行异或运算来计算的,然后将结果转换为网络字节顺序。
如果IP地址族是IPv4,则通过以主机字节顺序获取映射的IP地址,然后将其与Magic cookie进行XOR,然后将结果转换为网络字节顺序。
如果IP地址族是IPv6,则通过以主机字节顺序获取映射的IP地址,然后将其与Magic cookie和96位Transaction ID的串联进行XOR,然后将结果转换为网络字节顺序。
编码和处理属性值的前8位的规则,处理该属性的多次出现的规则以及处理地址族的规则与MAPPED-ADDRESS相同。
注意:XOR-MAPPED-ADDRESS和MAPPED-ADDRESS仅在传输地址的编码方面不同。
前者通过与魔术cookie互斥或对传输地址进行编码,后者直接将其编码为二进制。
ERROR-CODE属性
错误响应消息中使用了ERROR-CODE属性。
它包含300到699范围内的数字错误代码值以及以UTF-8 [RFC3629]编码的文本原因短语,并且其错误代码分配和语义与SIP 协议[RFC3261]和HTTP协议 [RFC2616]一致。原因短语是供用户使用的,并且可以是适合于错误代码的任何内容。定义的错误代码的建议原因短语包括在IANA注册中心中。原因短语必须是少于128个字符(可以长达763个字节)的UTF-8 [RFC3629]编码序列。
参考文档:RFC5389