对 RFC 1155、RFC 1157 和 ASN.1 感到困惑
Confused about RFC 1155, RFC 1157 and ASN.1
- RFC 1155 - 第 3.2.1 节,p. 7:四种 ASN.1 原始类型
INTEGER
、OCTET
STRING
、OBJECT IDENTIFIER
和 NULL
。
- RFC 1155 - 第 6 节,p. 18:
IpAdrress
是一个 IMPLICIT OCTET STRING (SIZE (4))
.
- RFC 1155 - 第 6 节,p. 18:
NetworkAddress
是一个 IpAddress
.
- RFC 1157 - 第 4.1.6 节,p. 26:
agent-addr
是 NetworkAddress
是 IpAddress
ASN.1 BER 将 OCTET STRING
表示为 0x04
。 TRAP-PDU值的数据类型agent-addr
是0x40(在Wireshark中看到)。
为什么agent-addr
的数据类型不是IMPLICIT OCTET STRING (SIZE (4))
?
Four ASN.1 primitive types INTEGER, OCTET STRING, OBJECT IDENTIFIER, and NULL
他们说他们从 ASN.1 类型系统中挑选了这些类型。这些是内置的标量 ASN.1 数据类型。当谈到 BER 序列化时,这些类型在线路上具有不同的 ID(AKA 标签)。
IpAdrress is an IMPLICIT OCTET STRING (SIZE (4))
ASN.1 允许您通过更改标记和(可选)对值范围施加额外约束来从任何其他类型创建新类型。有两种更改标签的方法:
- 通过覆盖基本类型的标签(又名
IMPLICIT
标签)
- 通过将新标签附加到基本类型的现有标签(也称为显式标签)
因此,他们在这里通过在 APPLICATION
名称 space 中将其标记替换为标记 #0
来对 OCTET STRING
类型进行子类型化。从算术上讲,这个新标签将变为 0 | 0x40
.
此外,它们对值范围强制执行大小限制 -- SIZE (4)
例如值必须有四个八位字节。
NetworkAddress is an IpAddress.
An agent-addr is a NetworkAddress which is an IpAddress
好吧,是也不是。 ;-)
ASN.1 有一个 CHOICE
伪类型,它在网络上是不可见的(默认情况下没有自己的标签)但是在网络上它可以变成它 "embeds".设计者可能计划在未来支持更多不同的网络地址,因此他们将 IpAddress
包装在 NetworkAddress
容器中。
ASN.1 BER represent an OCTET STRING as 0x04. The data type of the TRAP-PDU value agent-addr is 0x40 (seen in Wireshark).
正确:您看到 OCTET STRING
的子类型具有 IMPLICIT APPLICATION 0
标记,即 0x40 | 0
。
顺便说一句,使用 IMPLICIT
标记后,该类型的原始标记丢失了,因此看不到线路上任何基础 OCTET STRING
类型的残余。
Why is the data type of agent-addr not IMPLICIT OCTET STRING (SIZE (4))?
原来如此!希望上面的解释让它不那么晦涩。 ;-)
- RFC 1155 - 第 3.2.1 节,p. 7:四种 ASN.1 原始类型
INTEGER
、OCTET
STRING
、OBJECT IDENTIFIER
和NULL
。 - RFC 1155 - 第 6 节,p. 18:
IpAdrress
是一个IMPLICIT OCTET STRING (SIZE (4))
. - RFC 1155 - 第 6 节,p. 18:
NetworkAddress
是一个IpAddress
. - RFC 1157 - 第 4.1.6 节,p. 26:
agent-addr
是NetworkAddress
是IpAddress
ASN.1 BER 将 OCTET STRING
表示为 0x04
。 TRAP-PDU值的数据类型agent-addr
是0x40(在Wireshark中看到)。
为什么agent-addr
的数据类型不是IMPLICIT OCTET STRING (SIZE (4))
?
Four ASN.1 primitive types INTEGER, OCTET STRING, OBJECT IDENTIFIER, and NULL
他们说他们从 ASN.1 类型系统中挑选了这些类型。这些是内置的标量 ASN.1 数据类型。当谈到 BER 序列化时,这些类型在线路上具有不同的 ID(AKA 标签)。
IpAdrress is an IMPLICIT OCTET STRING (SIZE (4))
ASN.1 允许您通过更改标记和(可选)对值范围施加额外约束来从任何其他类型创建新类型。有两种更改标签的方法:
- 通过覆盖基本类型的标签(又名
IMPLICIT
标签) - 通过将新标签附加到基本类型的现有标签(也称为显式标签)
因此,他们在这里通过在 APPLICATION
名称 space 中将其标记替换为标记 #0
来对 OCTET STRING
类型进行子类型化。从算术上讲,这个新标签将变为 0 | 0x40
.
此外,它们对值范围强制执行大小限制 -- SIZE (4)
例如值必须有四个八位字节。
NetworkAddress is an IpAddress. An agent-addr is a NetworkAddress which is an IpAddress
好吧,是也不是。 ;-)
ASN.1 有一个 CHOICE
伪类型,它在网络上是不可见的(默认情况下没有自己的标签)但是在网络上它可以变成它 "embeds".设计者可能计划在未来支持更多不同的网络地址,因此他们将 IpAddress
包装在 NetworkAddress
容器中。
ASN.1 BER represent an OCTET STRING as 0x04. The data type of the TRAP-PDU value agent-addr is 0x40 (seen in Wireshark).
正确:您看到 OCTET STRING
的子类型具有 IMPLICIT APPLICATION 0
标记,即 0x40 | 0
。
顺便说一句,使用 IMPLICIT
标记后,该类型的原始标记丢失了,因此看不到线路上任何基础 OCTET STRING
类型的残余。
Why is the data type of agent-addr not IMPLICIT OCTET STRING (SIZE (4))?
原来如此!希望上面的解释让它不那么晦涩。 ;-)