zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    BFS visit tree
    Kth Largest Element in an Array 解答
    Merge k Sorted Lists 解答
    Median of Two Sorted Arrays 解答
    Maximal Square 解答
    Best Time to Buy and Sell Stock III 解答
    Best Time to Buy and Sell Stock II 解答
    Best Time to Buy and Sell Stock 解答
    Triangle 解答
    Unique Binary Search Trees II 解答
  • 原文地址:https://www.cnblogs.com/iuyy/p/13454952.html
Copyright © 2011-2022 走看看