33、SNMP 全面解析:从基础概念到实际应用

SNMP 全面解析:从基础概念到实际应用

1. 为什么需要 SNMP

在 20 世纪 70 年代初,计算机及其 I/O 设备体积庞大,需要专门的空调房间来放置。大多数大型公司使用独立系统完成计算任务,一旦出现问题,系统控制台会打印错误信息,前面板指示灯也会停止闪烁,很容易察觉。

然而如今,即使是小型科技公司也拥有服务器机房,里面摆满了来自不同供应商的计算机和网络设备,如交换机、路由器、打印服务器、Web 服务器、RAID 服务器等。网络打印机分布在公司各处,每张办公桌都配备了台式机或笔记本电脑,高科技公司的计算机数量往往超过员工数量。

与过去的大型计算机不同,如今网络中任何一个组件出现故障都不容易被发现。因此,IT 管理人员需要自动化工具来管理这些设备。简单的自动化可以通过自定义脚本定期执行 ping 扫描来实现,但对于大型网络,通常会依赖使用 SNMP 的网络管理系统(NMS),如惠普的 OpenView。这种系统不仅能检测设备故障,还能记录性能统计数据、保存重启历史,并记录设备发出的关于潜在问题的通知,例如数据包丢失或重传过多、连接失败、风扇转速过慢或 CPU 过热、CPU、内存或磁盘利用率过高以及系统重启等。

2. 代理和管理器

被管理的设备(如路由器、交换机、Web 主机、台式计算机、网络打印机等)都运行一个名为 SNMP 代理的服务器进程(守护程序)。该代理监听特定的 UDP 端口(通常是 161 端口,但并非总是如此),接收读取(GET)和写入(SET)命令,并负责获取请求的数据并返回。此外,该代理和设备上的其他监控软件还可以向一个或多个配置好的目标系统发送自发通知,即陷阱(traps)或告知(informs)。

管理应用程序(管理器)会轮询代理以获取信息,它们可以保存历史信息、生成报告或创建网络设备的图形化地图。一些管理应用程序只是简单的命令行工具,如 Net - SNMP 提供的 snmpwalk、snmpget 和 snmpset 命令。

3. 命名空间、语法和协议

SNMP 即简单网络管理协议,但它不仅仅是一个协议,还包括数据命名方式、数据描述语法以及网络数据交换协议。这些组件分别被称为管理信息库(MIB,命名方案)、管理信息结构(SMI,语法)和 SNMP 协议。描述 SNMP 的 RFC 文档包含了一组对管理网络设备有用的通用信息,即 MIB - 2(经过两次尝试才确定下来),后续会详细讨论 MIB - 2。

4. 管理信息库(MIB)

MIB 代表管理信息库,可将其视为虚拟数据库的分层命名方案。这是一个“虚拟”数据库,因为在代理收到读取数据请求之前,数据可能并不存在于存储设备中。当请求一个对象(可看作数据库记录中的一个字段)时,代理会从被管理系统中获取多条信息,并计算要返回的值。请求信息这一行为本身可能会触发值的创建。

虽然有一个通用的寻址方案,但我们将其划分为多个子分区,也称为 MIB。通常,人们提到 MIB 时,指的是其中一个子分区。MIB - 2 就是其中之一,此外还有许多其他 MIB 由不同组织为不同目的定义。有些由标准组织制定,有些则由私人公司定义,用于描述其网络产品提供的专有数据。

5. 对象标识符(OID)

每个 MIB 中的每个对象都有一个对象标识符(OID)。OID 是一个由十进制数字序列用点分隔的唯一名称,例如: .1.3.6.1.2.1.1.2.0 。这个名称表示对象在命名空间中的位置。第一个点代表树的根,每个数字代表树中的一个节点(分支的基点)。SNMP 中所有可命名的对象都位于这个 OID 树中,每个名称(OID)都包含从树的根到该对象的完整路径。

这类似于 Unix 文件系统,文件路径从根开始,由斜杠(/)分隔的多个命名节点(目录)组成,最后是文件名。例如,Unix 文件系统中的文件路径 /usr/local/bin/myprog ,如果用点代替斜杠分隔目录,路径将变为 .usr.local.bin.myprog

假设存在以下目录名和数字的映射表:
| 目录 | 编号 |
| — | — |
| usr | 1 |
| local | 3 |
| bin | 6 |
| myprog | 1 |

使用数字代替名称后,路径将变为 .1.3.6.1

互联网号码分配机构(IANA)负责为企业节点下的公司和组织分配编号,这些公司和组织有权管理其自己子树中的 OID。我们最感兴趣的树部分位于 .1.3.6.1 .iso.org.dod.internet )下,其下有 mgmt.mib - 2 .1.3.6.1.2.1 )子树和 private.enterprises .1.3.6.1.4.1 )子树。MIB - 2 是前面提到的通用对象集,所有可通过 SNMP 管理的网络设备都支持它。企业 OID 是组织注册其私有 MIB 的地方。

以下是一个简单的 mermaid 流程图,展示 OID 的层级结构:

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;

    A([根节点]):::startend --> B(iso):::process
    A --> C(org):::process
    A --> D(dod):::process
    A --> E(internet):::process
    E --> F(mgmt):::process
    F --> G(mib-2):::process
    E --> H(private):::process
    H --> I(enterprises):::process
6. MIB - 2

MIB - 2 在 RFC 1213 中定义,描述了一组对管理网络设备有帮助的核心信息。它被组织成以下十个组,并非所有网络设备都支持所有组,但通常可以找到大部分组:
- System :包含如 sysDescr (操作系统、硬件、网络软件等的可打印描述)、 sysContact (通常是管理该系统人员的电子邮件地址)、 sysLocation (系统位置的可打印描述)和 sysObjectID (可用于确定设备类型的 OID)等对象。
- Interfaces :是一个描述系统可用网络接口的表,包含每个接口的速度和接口活动(输入和输出字节数)信息。通过定期轮询输入和输出字节数,可以了解接口带宽的使用百分比,有助于监控网络中路由器的容量。
- AT :地址转换组,MIB - 2 弃用了该组,仅为与实现 MIB - 1 的设备兼容而保留。除非对 SNMP 历史有特殊兴趣,否则可以忽略该组。
- IP :包含与 IP(网络)层相关的信息,如 ipAddrTable (IP 地址表),描述系统可用接口的 IP 地址。
- ICMP :包含各种互联网控制消息协议(ICMP)统计信息。
- TCP :包含各种 TCP 层统计信息,如 tcpConnTable (TCP 连接表),描述该系统与网络中其他系统之间的当前 TCP 连接。该表常用于网络发现,一旦知道该系统的地址,就可以找出与之通信的其他系统的地址。
- UDP :包含各种用户数据报协议(UDP)数据报统计信息。
- EGP :包含支持外部网关协议(EGP)的系统的 EGP 统计信息。
- Transmission :包含与管理传输介质相关的信息。
- SNMP :包含与 SNMP 协议本身相关的各种统计信息。

7. 管理信息结构(SMI)

MIB 使用由管理信息结构(SMI)定义的语法进行描述,SMI 是抽象语法标记法一号(ASN.1)的子集。ASN.1 的创建是为了以独立于机器架构的方式描述数据(例如,不考虑字节序或字长)。SNMP SMI 采用了 ASN.1 中可定义的对象类型的子集,并简化了表示法。

要了解如何描述 MIB,只需知道如何读写用于描述 MIB 的表示法即可。通过最少的表示法定义和示例说明,就能很好地掌握这一点。创建新的 MIB 很大程度上可以通过从其他 MIB 中复制粘贴来完成。

以下是一个使用 SMI 语法描述的对象定义示例:

system       OBJECT IDENTIFIER ::= { mib-2 1 }
sysDescr OBJECT-TYPE
              SYNTAX  DisplayString (SIZE (0..255))
              ACCESS  read-only
              STATUS  mandatory
              DESCRIPTION
                      "A textual description of the entity. This value
                      should include the full name and version
                      identification of the system's hardware type,
                      software operating-system, and networking
                      software. It is mandatory that this only contain
                      printable ASCII characters."
              ::= { system 1 }

::= 表示“被定义为”, {mib - 2 1} 表示如果 mib - 2 .1.3.6.1.2.1 ,那么 system 就是 .1.3.6.1.2.1.1 ,因此 sysDescr .1.3.6.1.2.1.1.1 。每个定义描述了 OID 树中的一个步骤。

需要注意的是,有些对象标识符仅描述树结构中的节点,而有些则描述实际可读取的对象(叶节点),类似于文件系统中的目录和文件。实际上,当读取 sysDescr 时,必须请求 .1.3.6.1.4.1.1.1.0 ,这里结尾的零表示正在检索对象的一个实例。标量对象实例(标量是不在表中的独立对象)总是以 .0 结尾。在面向对象的术语中, .1.3.6.1.2.1.1.1 是类,而 .0 描述的是该类的一个对象实例。

如果将对象视为表结构中的字段,需要通过行索引来检索,表行号将替换零。例如, ifDescr 是一个表中的字段,表的每一行描述了机器上特定网络接口的信息。 mib - 2 下的另一个节点 interfaces 描述如下:

interfaces   OBJECT IDENTIFIER ::= { mib-2 2 }

如果检索系统前两个接口的 ifDescr 字段,可能会得到以下结果:

interfaces.ifTable.ifEntry.ifDescr.1 = lo
interfaces.ifTable.ifEntry.ifDescr.2 = eth0

与请求 sysDescr 时的结果对比:

system.sysDescr.0 = Linux localhost.localdomain 2.4.18-27.8.0 #1 Fri Mar 14 06:45:49 EST 2003 i686

ifDescr OID 末尾的 .1 .2 表示从中检索数据的表行。在 SNMP 中,表行从 1 开始编号,0 用于表示标量。

SMI 对 MIB 的描述通常分布在 MIB 文件中,这是一个文本文件,包含对通用 MIB 一部分的明确描述。有时,单个表的描述会放在单独的文件中,其他文件则包含通用对象或定义,如一组其他 MIB 文件使用的文本约定。通常,特定产品的私有 MIB 会在单个文件或少量文件中描述,并根据需要从其他文件中导入类型和约定,类似于 C 语言中使用 #include 语句。

MIB 文件既是人类对 MIB 的正式定义,也可通过编程方式解释 SNMP 响应以显示给人类。因此,MIB 文件的语法必须像任何计算机程序一样正确。有 MIB 编译器和检查器(类似于 C 语言的 lint 程序)来帮助验证 MIB 文件的正确性。

SNMP 全面解析:从基础概念到实际应用

8. SNMP 协议

虽然 SNMP 协议值得单独用一章来介绍,但通过了解它定义的协议数据单元(PDUs)及其用途,我们可以掌握大部分所需的知识。

8.1 基本命令:GET、SET、GETNEXT

SNMP 协议用于在被管理系统和管理它们的应用程序之间交换信息。被管理系统运行一个名为代理的守护程序(通常名为 snmpd),它提供从一个或多个 MIB 中读取信息或写入信息的功能。GET、SET 和 GETNEXT PDUs 分别用于读取、写入和遍历 MIB。

8.2 使用 GETNEXT 遍历 MIB

GETNEXT 允许指定一个对象,并要求代理返回 MIB 树中下一个对象的 OID 和值。遍历 MIB 意味着从 OID 树的某个点开始,通过重复使用 GETNEXT 命令遍历其下的整个子树。当返回的 OID 不在第一个 OID 定义的子树内时,遍历结束。应用程序可以通过这种方式了解被管理系统支持哪些 MIB。

以下是使用 GETNEXT 遍历 MIB 的流程:

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;

    A([开始]):::startend --> B(指定起始 OID):::process
    B --> C(发送 GETNEXT 请求):::process
    C --> D{是否在子树内?}:::process
    D -- 是 --> E(获取下一个 OID 和值):::process
    E --> C
    D -- 否 --> F([结束]):::startend
8.3 陷阱和告知

被管理系统还可以自发地向配置好的目标管理节点发送信息,这一过程称为发送 SNMP 陷阱(trap)或告知(inform)。陷阱发送到目标系统,但发送者永远不知道是否到达。告知是对陷阱的改进,因为它期望从接收者那里得到回复,如果在合理时间内未收到回复,可以重试。

9. 命令行工具示例

下面来看一些使用命令行工具的示例,这些工具使用我们刚刚讨论的 SNMP PDUs 来实现其功能。这些命令是 Net - SNMP 包(http://net - snmp.sourceforge.net)的一部分。

9.1 使用 snmpget 命令

要检索上一节中显示的 sysDescr 字段,可以发出以下命令:

snmpget -c public 10.1.1.21 .1.3.6.1.2.1.1.1.0

此命令使用社区名称 public (可看作密码)从 IP 地址为 10.1.1.21 的系统请求 sysDescr 对象的实例。从名称可以猜到, snmpget 命令生成一个 SNMP GET PDU。

9.2 使用 snmpwalk 命令

现在来遍历一个子树。 snmpwalk 命令使用一系列 GETNEXT PDUs。如果发出以下命令从系统检索接口表:

snmpwalk -c public 10.1.1.21 .1.3.6.1.2.1.2

可能会得到以下结果:

interfaces.ifNumber.0 = 2
interfaces.ifTable.ifEntry.ifIndex.1 = 1
interfaces.ifTable.ifEntry.ifIndex.2 = 2
interfaces.ifTable.ifEntry.ifDescr.1 = lo
interfaces.ifTable.ifEntry.ifDescr.2 = eth0
interfaces.ifTable.ifEntry.ifType.1 = softwareLoopback(24)
interfaces.ifTable.ifEntry.ifType.2 = ethernetCsmacd(6)
interfaces.ifTable.ifEntry.ifMtu.1 = 16436
interfaces.ifTable.ifEntry.ifMtu.2 = 1500
interfaces.ifTable.ifEntry.ifSpeed.1 = Gauge32: 10000000
interfaces.ifTable.ifEntry.ifSpeed.2 = Gauge32: 100000000
interfaces.ifTable.ifEntry.ifPhysAddress.1 = 
interfaces.ifTable.ifEntry.ifPhysAddress.2 = 0:8:74:93:4d:29
interfaces.ifTable.ifEntry.ifAdminStatus.1 = up(1)
interfaces.ifTable.ifEntry.ifAdminStatus.2 = up(1)
interfaces.ifTable.ifEntry.ifOperStatus.1 = up(1)
interfaces.ifTable.ifEntry.ifOperStatus.2 = up(1)
interfaces.ifTable.ifEntry.ifInOctets.1 = Counter32: 199082
interfaces.ifTable.ifEntry.ifInOctets.2 = Counter32: 291688668
interfaces.ifTable.ifEntry.ifInUcastPkts.1 = Counter32: 3380
interfaces.ifTable.ifEntry.ifInUcastPkts.2 = Counter32: 1579204
interfaces.ifTable.ifEntry.ifInDiscards.1 = Counter32: 0
interfaces.ifTable.ifEntry.ifInDiscards.2 = Counter32: 0
interfaces.ifTable.ifEntry.ifInErrors.1 = Counter32: 0
interfaces.ifTable.ifEntry.ifInErrors.2 = Counter32: 0
interfaces.ifTable.ifEntry.ifOutOctets.1 = Counter32: 199082
interfaces.ifTable.ifEntry.ifOutOctets.2 = Counter32: 61187262
interfaces.ifTable.ifEntry.ifOutUcastPkts.1 = Counter32: 3380
interfaces.ifTable.ifEntry.ifOutUcastPkts.2 = Counter32: 682356
interfaces.ifTable.ifEntry.ifOutDiscards.1 = Counter32: 0
interfaces.ifTable.ifEntry.ifOutDiscards.2 = Counter32: 0
interfaces.ifTable.ifEntry.ifOutErrors.1 = Counter32: 0
interfaces.ifTable.ifEntry.ifOutErrors.2 = Counter32: 0
interfaces.ifTable.ifEntry.ifOutQLen.1 = Gauge32: 0
interfaces.ifTable.ifEntry.ifOutQLen.2 = Gauge32: 0
interfaces.ifTable.ifEntry.ifSpecific.1 = OID: .ccitt.zeroDotZero
interfaces.ifTable.ifEntry.ifSpecific.2 = OID: .ccitt.zeroDotZero
9. SNMP 版本

SNMP 有多个版本,包括 SNMPv1、SNMPv2 和 SNMPv3。不同版本在安全性、功能等方面有所不同,以下是简单对比:
| 版本 | 特点 |
| — | — |
| SNMPv1 | 最早的版本,功能相对简单,安全性较低,使用社区字符串进行身份验证。 |
| SNMPv2 | 在 SNMPv1 的基础上进行了改进,增加了一些新的功能,如批量获取数据等,但安全性仍然存在一定问题。 |
| SNMPv3 | 提供了更强的安全性,支持用户认证、加密等功能,适用于对安全性要求较高的场景。 |

10. SNMP 数据类型

SNMP 定义了多种数据类型,常见的有:
- DisplayString :用于表示可打印的字符串。
- Counter32 :32 位计数器,用于记录递增的值,达到最大值后会回绕。
- Gauge32 :32 位计量器,用于表示一个固定的值或在一定范围内波动的值。
- OID :对象标识符,用于唯一标识 MIB 中的对象。

11. 定义新类型

在某些情况下,可能需要定义新的数据类型。可以根据 SMI 的规则,结合现有的数据类型和语法来定义。例如,在 MIB 文件中使用特定的语法来定义新类型,类似于定义 MIB 对象的方式。

总结

SNMP 是网络管理中非常重要的协议,通过 MIB、OID 等概念,实现了对网络设备的有效管理。掌握 SNMP 的基本概念、协议操作以及相关命令行工具的使用,能够帮助我们更好地监控和管理网络。同时,了解不同版本的特点和数据类型,有助于根据实际需求选择合适的 SNMP 配置。在实际应用中,要确保 MIB 文件的正确性,以保证 SNMP 系统的稳定运行。

通过短时倒谱(Cepstrogram)计算进行时-倒频分析研究(Matlab代码实现)内容概要:本文主要介绍了一项关于短时倒谱(Cepstrogram)计算在时-倒频分析中的研究,并提供了相应的Matlab代码实现。通过短时倒谱分析方法,能够有效提取信号在时间与倒频率域的特征,适用于语音、机械振动、生物医学等领域的信号处理与故障诊断。文中阐述了倒谱分析的基本原理、短时倒谱的计算流程及其在实际工程中的应用价值,展示了如何利用Matlab进行时-倒频图的可视化与分析,帮助研究人员深入理解非平稳信号的周期性成分与谐波结构。; 适合人群:具备一定信号处理基础,熟悉Matlab编程,从事电子信息、机械工程、生物医学或通信等相关领域科研工作的研究生、工程师及科研人员。; 使用场景及目标:①掌握倒谱分析与短时倒谱的基本理论及其与傅里叶变换的关系;②学习如何用Matlab实现Cepstrogram并应用于实际信号的周期性特征提取与故障诊断;③为语音识别、机械设备状态监测、振动信号分析等研究提供技术支持与方法参考; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,先理解倒谱的基本概念再逐步实现短时倒谱分析,注意参数设置如窗长、重叠率等对结果的影响,同时可将该方法与其他时频分析方法(如STFT、小波变换)进行对比,以提升对信号特征的理解能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值