实现SNMP v1解码器并使用一些Wireshark捕获,我可以看到有时BER的长度字段用一个字节编码,其他时间用两个字节编码。
读取BER规则,如果更有意义的位设置为1,则必须使用下一个字节扩展长度值,以表示大于255的值。
所以,如果firt字节是0x81,而下一个字节是0x9F,那么扩展的Length字段应该取0x9F值... OK
我的问题是: 如果第二个字节是0x9F,则更有意义的位再次为1。
Wireshark只占用这个长度的两个字节。
为什么在这种情况下,Length的大小只有两个字节?
长度字段限制为2个字节?
感谢。
答案 0 :(得分:4)
根据BER规则,长度字段可以是多个字节(远远超过2),
http://en.wikipedia.org/wiki/KLV
长度字段
Key的字节后面是字节 长度字段,它将告诉您跟随长度的字节数 字段并组成Value部分。编码有四种 对于长度字段:1字节,2字节,4字节和基本编码规则 (BER)。 1字节,2字节和4字节变体非常简单: 从字节中生成一个无符号整数,该整数是 后面的字节数。
BER长度编码更多一点 复杂但最灵活。如果长度为第一个字节 字段没有高位设置(0x80),然后是那个单字节 表示0到127之间的整数,表示数字 紧随其后的值字节。如果设置了高位,那么 低七位表示自己制作的字节数 一个长度的领域。
例如,如果是BER长度字段的第一个字节 是二进制10000010,表示接下来的两个字节组成 一个整数,然后表示后面有多少个Value字节。 因此,总共需要三个字节来指定长度。
“如果第二个字节是0x9F,则更有意义的位再次为1。”这是一个问题吗?只有字节中的第一个字节确定用于确定长度的后续字节数。所以你永远不需要关心第二个字节的最高位。从不。
Wireshark如何表示字节并不是非常关键。除非Wireshark显示错误的长度值,否则你不应该太注意它。
答案 1 :(得分:0)
我补充说SNMP(usually)使用UDP数据报进行传输,限制为65535字节,即0xffff。最多需要2个字节来编码长度。