RFC5389-STUN Attributes

在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

原文地址:https://www.cnblogs.com/iuyy/p/13454952.html