我有使用 Web 套接字来传输数据的服务。
我需要一种方法来编码树结构并通过 websocket 传输该树结构。我一直在阅读有关 TLV 和 sub-TLV 编码的内容,这似乎是一个好主意,即它已经在诸如 Radius、LLDP 等协议中使用,这证明这是有效的,但是我的问题是这些协议通常在一个受信任的设备,即交换机/路由器之间(LLDP 除外)。我的问题是,我将传输包含子 TLV 的 TLV,这些子 TLV 确实具有随机大小/长度,并且它们没有静态定义的结构,例如,如果您查看第一个 TLV 中的概念已定义子 TLV,即
Extended IS Reachability 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 内容模式检查
我根本无法相信用户的意见,但我还有两个问题,即如何验证值为 a) 随机长度/大小的 TLV,即我确实有一个值可能具有的范围,即不小于 1 字节不大于 700 kb 和 b) 我不能对该值执行任何模式检查,因为它是加密的,即不可读形式,因此不能对其执行任何模式。
因此我的问题是:如何实现相同的目标,即在其他结构中发送树结构,即可能是键值对或类似的东西(http 正在使用这个,应该有原因)。
TLV 方式真的是在树结构中传输数据的最佳选择吗?我知道,如果我以二进制形式发送它,我将一枪击中两只兔子,即在发送图片等文件时,我不需要使用一些有趣的 base64 编码等,但我真正想要的是一个适用的协议L5-7(即通过 websocket)将允许以树结构的形式发送数据,接收部分将能够识别和重新组装树,而无需考虑序列化和反序列化部分。那么 TLV 的第二个最佳替代方案是什么?考虑到我一方面使用 java,另一方面使用 javasctipt。