【问题标题】:Confused about RFC 1155, RFC 1157 and ASN.1对 RFC 1155、RFC 1157 和 ASN.1 感到困惑
【发布时间】:2017-07-28 22:12:30
【问题描述】:
  • RFC 1155 - 第 3.2.1 节,第7:四种 ASN.1 原语类型 INTEGEROCTET STRINGOBJECT IDENTIFIERNULL
  • RFC 1155 - 第 6 节,第18:IpAdrressIMPLICIT OCTET STRING (SIZE (4))
  • RFC 1155 - 第 6 节,第18:NetworkAddressIpAddress
  • RFC 1157 - 第 4.1.6 节,第26:agent-addrNetworkAddress,这是 IpAddress

ASN.1 BER 将OCTET STRING 表示为0x04。 TRAP-PDU 值agent-addr 的数据类型是 0x40(在 Wireshark 中可以看到)。

为什么agent-addr的数据类型不是IMPLICIT OCTET STRING (SIZE (4))

【问题讨论】:

  • “隐式”并不意味着agent-addr 应该是OCTET STRINGIpAddressCounterGaugeTimeTicksOpaque 都有自己的数据类型值。

标签: snmp net-snmp asn.1


【解决方案1】:

四种 ASN.1 基本类型 INTEGER、OCTET STRING、OBJECT IDENTIFIER 和 NULL

他们说他们只从 ASN.1 类型系统中挑选了这些类型。这些是内置的标量 ASN.1 数据类型。在 BER 序列化方面,这些类型在线路上具有不同的 ID(AKA 标签)。

IpAddrress 是一个隐式八位字节字符串(大小 (4))

ASN.1 允许您通过更改标签和(可选地)对值范围施加额外约束来从任何其他类型创建新类型。更改标签有两种方法:

  • 通过覆盖基本类型的标记(AKA IMPLICIT 标记)
  • 通过将新标签附加到基本类型的现有标签(AKA EXPLICIT 标记)

所以在这里他们通过在APPLICATION 名称空间中用标签#0 替换它的标签来子类型OCTET STRING 类型。算术上,这个新标签会变成0 | 0x40

此外,它们对值范围强制执行大小限制——SIZE (4) 例如值必须有四个八位字节。

NetworkAddress 是一个 IpAddress。 agent-addr 是一个 NetworkAddress,它是一个 IpAddress

嗯,是的,也不是。 ;-)

ASN.1 有一个CHOICE 伪类型,它在网络上不可见(默认情况下没有自己的标签),但在网络上它可以变成它“嵌入”的类型之一。设计者可能计划在未来支持更多不同的网络地址,因此他们将IpAddress 包装在NetworkAddress 容器中。

ASN.1 BER 将 OCTET STRING 表示为 0x04。 TRAP-PDU 值 agent-addr 的数据类型为 0x40(见 Wireshark)。

没错:您看到OCTET STRING 的子类型具有IMPLICIT APPLICATION 0 标记,即0x40 | 0

顺便说一句,使用IMPLICIT 标记,该类型的原始标记会丢失,因此在线路上看不到任何基本OCTET STRING 类型的残余。

为什么agent-addr的数据类型不是IMPLICIT OCTET STRING (SIZE (4))?

确实如此!希望上面的解释使它不那么晦涩难懂。 ;-)

【讨论】:

    猜你喜欢
    • 2021-11-28
    • 1970-01-01
    • 2013-03-29
    • 2014-11-02
    • 1970-01-01
    • 2014-03-18
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多