对 RFC 1155、RFC 1157 和 ASN.1 感到困惑

Confused about RFC 1155, RFC 1157 and ASN.1

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))?

原来如此!希望上面的解释让它不那么晦涩。 ;-)