【发布时间】:2014-02-15 20:22:20
【问题描述】:
使用抽象语法表示法声明 IpAddress:
IpAddress ::= [APPLICATION 1] INTEGER (0..4294967295)
[APPLICATION 1] 在这段代码中是什么意思?!
【问题讨论】:
使用抽象语法表示法声明 IpAddress:
IpAddress ::= [APPLICATION 1] INTEGER (0..4294967295)
[APPLICATION 1] 在这段代码中是什么意思?!
【问题讨论】:
注意:这个问题被标记为 SNMP,但这不是 SNMP 的 IpAddress 类型的正确声明。这实际上是一个 Counter32 类型:
IP 地址 ::= [应用 0] 隐式八位组字符串(大小 (4))
Counter32 ::= [应用1] 隐式整数 (0..4294967295)
但是;
ASN.1 类型同时具有符号和在线编码。可以基于内置类型定义新类型。在您的问题中,新类型“IpAddress”被定义为内置“INTEGER”类型的有限范围(0..4294967295)派生,它没有内置范围限制。
ASN.1 编码由三部分组成:指示数据类型的单字节标记、内容长度和内容(值)本身。如果没有 [括号] 中的部分,新类型的编码将与基本类型相同——在本例中为 INTEGER,其标记值为 0x02(十六进制)。 [APPLICATION 1] 表示该值将使用不同的标记进行编码,以便您可以将其编码与 INTEGER 区分开来。
[括号]中的这部分由一个标签类和一个数字组成。该类可以是 UNIVERSAL(仅用于内置 ASN.1 类型)、APPLICATION(这意味着特定于应用程序,即 [APPLICATION 1] 到 SNMP 可能意味着与另一个协议中的 [APPLICATION 1] 完全不同的东西)、PRIVATE 用于企业- 特定的,或者可以省略(在这种情况下,它是特定于上下文的)。
Tag Class 和 Number 本质上是位标志,它们被或在一起以形成编码中的标签值。 APPLICATION = 0x40,因此 [APPLICATION 1] 表示您的问题中定义的值使用 0x41 标记字节编码。
但是,正如我上面提到的,这实际上会被 SNMP 视为 Counter32 值,而不是 IpAddress。 0x40 将是一个 IpAddress,其内容将被编码为 OCTET STRING 而不是 INTEGER。
【讨论】:
它只是意味着“应用程序范围”。此类类型在 ASN.1 中不可用,但在 SNMP(ASN.1 的应用程序)中可用。
https://www.rfc-editor.org/rfc/rfc1155
第 3.2.3 节提供了更多相关信息。
APPLICATION后面的值最终用于数据编码,用于区分类型。
您实际上输入了错误,因为IpAddress 应该使用值 0,而不是 1。
【讨论】: