【问题标题】:Coturn string values only accepted when length is divisible by 4仅当长度可被 4 整除时才接受 Coturn 字符串值
【发布时间】:2017-05-15 15:08:37
【问题描述】:

我在运行 Ubuntu 16.04.2 LTS 的 Azure 虚拟机上运行 coturn 服务器。我正在用 c# 实现一个 TURN 客户端,我正在努力解决我假设的问题,或者是我的服务器配置中的问题、服务器软件中的错误,或者我的客户端中的编码问题。

当我从服务器收到REALM 时,我首先注意到了这个问题。领域名称是 9 个字符,但我不断从服务器获得 3 个额外的 NULL 字符。在尝试更改我发送的软件版本时,我的怀疑得到了证实。如果长度不能被 4 整除,服务器将不会发回任何内容(我现在相信它会按照适当的 STUN/TURN 规范默默地丢弃消息,该规范规定丢弃未知属性)。

根据规范,我将字符串编码为UTF-8(存储字符串类型 TLV 属性的示例)

private void StoreString(AttributeType key, string v, byte[] msg, ref int offset)
{
    byte[] stringBytes = Encoding.UTF8.GetBytes(v);

    // Attribute header
    StoreAttributeType(key, msg, ref offset);
    msg[offset++] = (byte)(stringBytes.Length >> 8);
    msg[offset++] = (byte)(stringBytes.Length & 0xFF);

    Array.Copy(stringBytes, 0, msg, offset, stringBytes.Length);
    offset += stringBytes.Length;
}

原始字节:

01-13-00-40-21-12-A4-42-57-9E-20-40-86-81-34-F9-B0-64-C1-E4-00-09-00-10-00-00-04-01-55-6E-61-75-74-68-6F-72-69-7A-65-64-00-15-00-10-39-64-38-35-62-66-61-66-62-63-34-36-30-62-31-66-00-14-00-09-74-65-73-74-72-65-61-6C-6D-00-00-00-80-22-00-04-4E-6F-6E-65

我使用规范解析并得到

Type: AllocateErrorResponse, Length: 64, ID: 42a41221-9e57-4020-8681-34f9b064c1e4
Attributes:
- Type: ErrorCode, Value: Code: Unauthorized, Reason: Unauthorized
- Type: Nonce, Value: 9d85bfafbc460b1f
- Type: Realm, Value: testrealm

Attribute parsing not implemented for 0
- Length: 128, Value: 22-00-04-4E-6F-6E-65

它尝试用type=0length=128解析的值实际上是消息的结尾和服务器软件名称

80-22-00-04-4E-6F-6E-65

属性8022定义为属性SOFTWARE,长度为0x0004,值4E-6F-6E-65为文本None

所以服务器返回所有正确的值和所有正确的长度,但似乎字符串被填充为 UTF-16 可分割长度。所以这似乎是一个编码问题,但我不知道它是服务器中的软件错误、服务器上的配置问题还是我的客户端中的问题。我知道这都是开源的,我可以深入研究源代码,但我希望有人能在我走得那么远之前有所了解。

【问题讨论】:

    标签: c# utf-8 turn coturn


    【解决方案1】:

    嗯...这就是当您没有足够关注 RFC 时会发生的情况...

    RFC 5389
    
    15.  STUN Attributes
    
        After the STUN header are zero or more attributes.  Each attribute
        MUST be TLV encoded, with a 16-bit type, 16-bit length, and value.
        Each STUN attribute MUST end on a 32-bit boundary.  As mentioned
        above, all fields in an attribute are transmitted most significant
        bit first.
    

    所以看起来关键是每个 STUN 属性必须以 32 位边界结束。因此,在读取我的 9 个字符域时,应该读取并丢弃剩余的字节。

    【讨论】:

      猜你喜欢
      • 2012-06-09
      • 2016-01-04
      • 1970-01-01
      • 2019-09-02
      • 2014-03-20
      • 1970-01-01
      • 1970-01-01
      • 2014-09-28
      • 1970-01-01
      相关资源
      最近更新 更多