SNMP字符串限制?

5

在学习SNMP时,我对SNMP字符串操作有一些疑问:

  • 字符串的最大长度是多少?
  • 如果我们对字符串具有读取权限,如何确定其大小?
  • 该字符串基本上可以接受所有类型的字符(如#$%^&等)。如何限制它们的使用?
4个回答

4
在SNMP中没有字符串的概念。OCTET STRING并不是一个真正的字符串(与高级编程语言如Java和C#相比),因为这种数据结构没有地方存储编码信息。这真的很可怕。
最大字符串大小仅受到SNMP网络数据包大小的限制,因此您应该去TCP/IP协议寻找答案。没有任何SNMP RFC定义了最大长度。
我个人认为OCTET STRING就像是一个字节数组,因此任何字符都可以存储在其中。如果您想对它们进行限制,您应该在您的SNMP代理/引擎实现中完成。当发现“无效”字符时,您可以返回一个SNMP错误。详细信息可以在RFC 3416 4.2.1或RFC 1157 4.1.5中找到。

3
一个 OCTET STRING 可以包含任何序列的八位字节,所以不能保证它们是可打印字符。
许多其他“类型”基于 OCTET STRING,通过添加限制来实现。例如,IpAddress 就是一个仅限于四个字节的 OCTET STRING。这在 MIB 模块的 Textual Convention 定义中定义。RFC1155-SMI 包含 IpAddress 的定义。
如果您正在尝试选择变量的类型(例如设计 MIB 模块时),应尽可能地限制类型,因为这更有信息价值,能帮助使用 MIB 模块的用户。
特别地,如果您知道字符串应该是可打印的,请不要使用 OCTET STRING。而应该选择 SnmpAdminString(几乎所有情况下都适用)或 DisplayString(如果您绝对确定数据仅包含 ASCII 字符,没有扩展字符如重音和非罗马字符)。两者都限制为 255 个八位字节,这对于大多数网络管理目的来说是合理的。如果您想传输比这更大量的数据,那么您可能正在尝试做 SNMP 不支持的事情。

没错。我的意思是,DisplayString和SnmpAdminString在数据包级别上都被编码为OCTET STRING。因此,在实现层面上两者之间没有区别。 - Andrew Komiagin
这也是正确的。我的回答关于类型应该如何“使用”,严格来讲,不涉及它们如何编码。特别地,一个接收无限制 OCTET STRING 的程序应当小心地处理非可打印字符。同样,一个其 MIB 声称将发送 DisplayString 的程序,必须被设计为不传输非 ASCII 字符。 - Jolta
在处理可打印内容时,我会使用DisplayString来定义MIB对象。但是你必须记住SNMP库不关心你的MIB定义,它会将其视为OCTET STRING。 - Andrew Komiagin
图书馆不需要关心MIB定义,但是你的应用程序代码一定要关心,并确保不会在DisplayString中发送非可打印数据。如果不这样做,那么你就没有正确使用SNMP。其他人将信任你的MIB声明,如果你不遵循所声明的类型,你将破坏他们的集成。(这本来应该很容易做到,为什么不呢?) - Jolta
完全同意。此外,应用程序应考虑DisplayHint。 - Andrew Komiagin
显示剩余2条评论

-2

OCTET STRING没有任何大小限制。这里唯一的限制是SNMP使用UDP作为传输协议。因此,MTU = 1500。那就是你的最大大小。


3
您正在思考以太网帧的最大大小。UDP数据包可能会被分割成多个以太网帧。 - Michael Kirkham
当然它们会被分割,但由于UDP不可靠的特性,并不能保证它们会被组装。 - Andrew Komiagin
是的。但这仍然没有对OCTET STRING大小施加基本限制,只是在条件下实际上有一个限制,使得非分段UDP数据包被丢弃的可能性同样大,除非途中有一跳不支持分段,并且您还假定了UDP。 UDP并不是SNMP的唯一传输方式。 SNMPv3本身指定msgMaxSize范围为(484..2147483647)。 2147483647比1500大得多。 - Michael Kirkham
如果要将OCTET STRING用作索引,那么其大小是有基本限制的,因为SNMP将OBJECT IDENTIFIERS限制为128个子标识符。 - Michael Kirkham
在现实生活中,99.99999%的现有SNMP代理都使用UDP作为传输协议,这是正确的。 - Andrew Komiagin
1
有相当多的IETF标准MIB定义了数据类型,其OCTET STRING SIZE大于255,有些甚至大于1500。例如ADSL2-LINE-MIB、VSDL2-LINE-MIB、SNMP-TLS-MIB以及其他一些SIZE高达1024的MIB。DOCS-IETF-BPI2-MIB的SIZE高达4096等等。 - Michael Kirkham

-2

这似乎不是Q中任何一个三个问题的答案。UDP并非SNMP唯一允许的传输方式。 - Jolta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接