在学习SNMP时,我对SNMP字符串操作有一些疑问: 字符串的最大长度是多少? 如果我们对字符串具有读取权限,如何确定其大小? 该字符串基本上可以接受所有类型的字符(如#$%^&等)。如何限制它们的使用?
在SNMP中没有字符串的概念。OCTET STRING并不是一个真正的字符串(与高级编程语言如Java和C#相比),因为这种数据结构没有地方存储编码信息。这真的很可怕。最大字符串大小仅受到SNMP网络数据包大小的限制,因此您应该去TCP/IP协议寻找答案。没有任何SNMP RFC定义了最大长度。我个人认为OCTET STRING就像是一个字节数组,因此任何字符都可以存储在其中。如果您想对它们进行限制,您应该在您的SNMP代理/引擎实现中完成。当发现“无效”字符时,您可以返回一个SNMP错误。详细信息可以在RFC 3416 4.2.1或RFC 1157 4.1.5中找到。
一个 OCTET STRING 可以包含任何序列的八位字节,所以不能保证它们是可打印字符。许多其他“类型”基于 OCTET STRING,通过添加限制来实现。例如,IpAddress 就是一个仅限于四个字节的 OCTET STRING。这在 MIB 模块的 Textual Convention 定义中定义。RFC1155-SMI 包含 IpAddress 的定义。如果您正在尝试选择变量的类型(例如设计 MIB 模块时),应尽可能地限制类型,因为这更有信息价值,能帮助使用 MIB 模块的用户。特别地,如果您知道字符串应该是可打印的,请不要使用 OCTET STRING。而应该选择 SnmpAdminString(几乎所有情况下都适用)或 DisplayString(如果您绝对确定数据仅包含 ASCII 字符,没有扩展字符如重音和非罗马字符)。两者都限制为 255 个八位字节,这对于大多数网络管理目的来说是合理的。如果您想传输比这更大量的数据,那么您可能正在尝试做 SNMP 不支持的事情。
唯一的限制是SNMP使用UDP作为传输协议 - 我同意。但是,UDP的MTU为64k。 请参考https://en.wikipedia.org/wiki/User_Datagram_Protocol。 MTU = 1500适用于以太网标准数据包。 因此,在这种情况下,最大大小为64k。