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

  • 相关阅读:
    NPOIHelper
    NPOI.dll 用法:单元格、样式、字体、颜色、行高、宽度 读写excel
    SQL中的循环、for循环、游标
    .net mvc datatables中orderby动态排序
    MVC中给TextBoxFor设置默认值和属性
    定义实体系列-@JsonIgnoreProperties注解
    微信公众号登录与微信开放平台登录区别
    http-Post请求,Post Body中的数据量过大时出现的问题
    .net core Linux 安装部署
    二、微信公众号开发-获取微信用户信息(.net版)
  • 原文地址:https://www.cnblogs.com/iuyy/p/13454952.html
Copyright © 2011-2022 走看看