ASN.1 和 SMI 有什么区别?

What is the difference between ASN.1 and SMI?

据我了解:

ASN.1的使用范围很广,而SMI是ASN.1的一个子集,专门用于SNMP。

这是正确的吗?如果不是,有什么区别?

这正是课本上的内容。阅读 IETF RFC 1155 和 2578 了解更多详情。

ASN.1 是标准化符号。从 RFC 2578 看来,SMI 使用该表示法,就像我目前使用英语语法来构造这些句子一样。例如,在第 2 节中,他们给出:

SNMPv2-SMI DEFINITIONS ::= BEGIN
   -- the path to the root
   org            OBJECT IDENTIFIER ::= { iso 3 }  --  "iso" = 1

本文遵循用于定义 ASN.1 模块 ("SNMPv2-SMI") 的 ASN.1 语法,模块中的第一个定义是 ASN.1 值 ("org"),具有特定的 ASN.1 类型 ("OBJECT IDENTIFIER").

此外,RFC 2578 对可能使用的 ASN.1 表示法进行了限制。例如,在 3.1 中,他们限制 ASN.1 标识符使用连字符,否则这是允许的。这就像说在Whosebug post中,我们将根据英语语法使用句子,但不允许使用过去时的句子。

旁注:RFC 2578 使用 ASN.1 1988。存在更新版本的 ASN.1 标准,并且删除了 1988 标准中的一些符号(特别是宏)。

不幸的是,尽管 ASN.1 委员会多年来一直试图让 IETF 将实际的 ASN.1 用于 SNMP,但负责 SNMP 的小组以各种方式偏离了 ASN.1,这使得它不可能用于完全处理 SNMP MIB 的通用 ASN.1 工具。他们不仅使用撤回的 ASN.1 MACRO 符号,而且使用它的方式甚至仍然支持过时的 ASN.1 MACRO 符号的 ASN.1 工具也无法正确处理 MIB 定义。您需要专门为 SNMP MIB 创建的特殊工具来完全解析和正确处理它们。