【发布时间】:2015-12-15 09:52:16
【问题描述】:
我的服务使用 Web 套接字来传输数据。
我需要一种方法来编码树结构并通过 websocket 传输该树结构。我一直在阅读 TLV 和子 TLV 编码,这似乎是一个好主意,即它已经在诸如 Radius、LLDP 等协议中使用,这证明这是有效的,但是我的问题是这些协议通常在受信任的设备,即交换机/路由器之间(LLDP 除外)。我的问题是,我将传输包含子 TLV 的 TLV,这些子 TLV 确实具有随机大小/长度,并且它们没有静态定义的结构,例如,如果您查看第一个 TLV 中的概念已定义子 TLV,即
扩展 IS 可达性 TLV #22 然后你会看到这个 tlv 的结构是这样的:
/* +-------+-------+-------+-------+-------+-------+-------+-------+
* | Type | 1
* +---------------------------------------------------------------+
* | Length ID | 1
* +---------------------------------------------------------------+
* | Neighbour ID | 7
* +---------------------------------------------------------------+
* | TE Metric | 3
* +---------------------------------------------------------------+
* | SubTLVs Length | 1
* +---------------------------------------------------------------+
* | SubTLVs value | variable
* +---------------------------------------------------------------+
* : :
*/
通过结构,我的意思是我已经预定义了 7 个字节的邻居 ID,3 个字节的 Metric,1 个字节的 SubTLVs 长度,然后才出现可变部分,但至少你有一些预先定义的位并且不能更改。
现在通过阅读一些书籍(主要是 H Gredler The Complete IS-IS Routing Protocol 2005 - 第 296 页),我发现了 4 种验证这些 TLV 的技术,即
1) 最大长度检查
2) Sub-TLV 溢出检查
3) 离散长度检查
4) TLV 内容模式检查
我根本无法相信来自用户的信息,但我还有另外两个问题,即如何验证 TLV 的值在哪里 a) 随机长度/大小,即我确实有一个值可能具有的范围,即不小于 1 字节不大于 700 kb 和 b) 我不能对该值执行任何模式检查,因为它是加密的,即不是可读形式,因此不能对其执行任何模式。
因此我的问题是: 如何实现相同的目标,即在其他结构中发送树结构,即可能是键值对或类似的东西(http 正在使用这个,应该是有原因的)。
TLV 方式真的是在树结构中传输数据的最佳选择吗?我知道,如果我以二进制形式发送它,我将一枪击中两只兔子,即在发送图片等文件时,我不需要使用一些有趣的 base64 编码等,但我真正想要的是一个适用的协议L5-7(即通过 websocket)将允许以树结构的形式发送数据,接收部分将能够识别和重新组装树,而无需考虑序列化和反序列化部分。那么 TLV 的第二个最佳替代方案是什么?考虑到我一方面使用 java,另一方面使用 javasctipt。
【问题讨论】:
-
如果你已经建立了你的 TLV 消息结构,为什么不通过 websockets 发送二进制数据呢? (Websockets 会在它自己的协议中对数据进行封装和解包,但是解包后你会得到原始的二进制数据)。
-
因为我不信任来自用户的数据,即我如何才能验证这个 tlv。 IE。它将在我不知道它们的大小的其他子 tlv 中,基本上如果我会以某种方式验证它们。因此,我正在寻找 tlv 的第二好的替代品
-
嗯...我不确定实际问题可能是什么...当出现解析错误时,您不能直接挂断连接吗?
-
看到这正是我的问题,我如何识别存在解析错误。我在我的问题中提到了 4 种不同的方式来分割 TLV,但由于该值是加密的,即 tlv 的部分无法读取/模式化/或匹配它始终是一个变量值,现在你如何验证类似的东西,这是我打算使用其他一些结构的唯一原因,它允许通过 websocket 传递树,但也允许严格检查,即如果这是键值对中的回车符或换行符,即我知道每个“sub-TLV”结束。
-
基本上我想说的是,就我而言,从为 TLV 提到的这 4 种验证技术中,我最终只剩下一个,即只有长度检查,这让我感觉问题可能出现在特征中。这就是我问这个问题的原因。