我在运行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=0
和length=128
解析的值实际上是消息的结尾和服务器软件名称
80-22-00-04-4E-6F-6E-65
属性8022
定义为属性SOFTWARE
,长度为0x0004
,值4E-6F-6E-65
为文字None
因此服务器返回所有正确的值和所有正确的长度,但似乎字符串被填充为UTF-16可分割长度。所以这似乎是一个编码问题,但我不知道它是服务器中的软件错误,服务器上的配置问题,还是我客户端的问题。我知道这是开源的,我可以深入研究源代码,但我希望有一些人能够深入了解这一点。
答案 0 :(得分:0)
嗯......当你没有对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个字符域时,应该读取并丢弃剩余的字节。