2010-12-16 129 views
5

虽然我了解SNMP,我对SNMP的字符串操作一些问题:snmp字符串限制?

  • 什么是字符串的最大尺寸是多少?
  • 如果我们已经读取了字符串的权限,那么您如何确定大小?
  • 该字符串基本上可以接受所有类型的字符(如#$%^&等)。他们如何受到限制?

回答

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模块中的文本约定定义中定义。 RFC1155-SMI包含IpAddress的定义。

如果要尝试选择变量的类型(例如设计MIB模块时),应该尽量限制性地使用,因为这对于MIB模块的用户来说更具信息性。

特别是,如果您知道字符串应该可打印,请勿使用OCTET STRING。相反,请选择SnmpAdminString(几乎适用于所有用途)或DisplayString(如果您确信数据只包含ASCII字符,并且没有扩展字符,如非罗马字符,则为&非罗马字符)。两者都限制为255个八位字节,这对于大多数网络管理而言是合理的。如果你想传输比这更大的数据量,也许你正在尝试做一些SNMP设计不方便的事情。

+0

DisplayString和SnmpAdminString的定义如下:DisplayString :: = OCTET STRING 所以它只是一个OCTET STRING – 2015-03-24 14:22:10

+0

您是否有该语句的源代码?我的答案基于RFC-1213的第3.2节,它的内容是:“过去,对于一串八位字节应该包含可打印字符的情况,MIB有误解,意味着要向人显示 。作为MIB中的文本约定,引入了数据类型 'DisplayString :: = OCTET STRING' 。 'DisplayString'限于NVT ASCII 字符集,如[6]的第10-11页所定义的。“ – Jolta 2015-03-25 15:36:56

+0

没错,我说的是DisplayString和SnmpAdminString都是BER编码的,就像数据包上的OCTET STRING所以在实现层面上没有区别 – 2015-03-25 15:41:40

-2

OCTET STRING没有任何尺寸限制。这里唯一的限制是SNMP使用UDP作为传输协议。所以MTU = 1500。这是你最大的尺寸。

+2

您正在考虑以太网帧的最大大小。 UDP数据包可能在多个以太网帧中被分段。 – 2017-08-07 13:28:11

+0

确定它们会被分割,但由于UDP的不可靠性,不能保证它们将被组装。 – 2017-08-07 17:46:41

+0

是的。但是,这并不会对OCTET STRING大小施加基本的限制,只有实际的限制才能使非分段的UDP数据包可能被丢弃,除非沿着不支持的方式跳转碎片,并且你也假设UDP。 UDP不是SNMP的唯一传输方式。 SNMPv3本身指定的msgMaxSize范围是(484..2147483647)。 2147483647是一个大于1500的公平比特。 – 2017-08-07 18:03:43

-2

唯一的限制是SNMP使用UDP作为传输协议 - 我同意。但是,UDP的MTU是64k。 请参阅https://en.wikipedia.org/wiki/User_Datagram_Protocol。 MTU = 1500用于以太网标准数据包。 因此,在这种情况下,最大尺寸是64k。

+0

这似乎不是Q中三个问题中的任何一个的答案。UDP不是SNMP唯一允许的传输方式。 – Jolta 2017-08-08 08:16:13