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

时间:2017-07-28 22:12:30

标签: snmp net-snmp asn.1

  • RFC 1155 - 第3.2.1节,p。 7:四种ASN.1基元类型 INTEGEROCTET STRINGOBJECT IDENTIFIERNULL
  • RFC 1155 - 第6节,p。 18:IpAdrressIMPLICIT OCTET STRING (SIZE (4))
  • RFC 1155 - 第6节,p。 18:NetworkAddressIpAddress
  • RFC 1157 - 第4.1.6节,p。 26:agent-addrNetworkAddressIpAddress

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

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

1 个答案:

答案 0 :(得分:3)

  

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

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

  

IpAdrress是一个隐含的OCTET STRING(SIZE(4))

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

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

因此,他们通过在OCTET STRING名称空间中使用标记#0替换其标记来对APPLICATION类型进行子类型化。算术上,这个新标签将成为0 | 0x40

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

  

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

嗯,是的,不是。 ; - )

ASN.1有​​一个CHOICE伪类型,它在线上是不可见的(默认情况下没有自己的标签)但是在线上它可以变成其中一种类型"嵌入&# 34 ;.设计人员可能计划在将来支持更多不同的网络地址,以便IpAddress容器包裹NetworkAddress

  

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

这是正确的:您看到OCTET STRING的子类型IMPLICIT APPLICATION 0标记为0x40 | 0

BTW,使用IMPLICIT标记时,该类型的原始标记会丢失,因此不会在网络上看到任何基本OCTET STRING类型的残余。

  

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

实际上是!希望上面的解释使它不那么模糊。 ; - )