第25章 SNMP: 简单网络管理协议

25.7 一些简单的例子

在本节中,我们将介绍如何从 S N M P代理进程处获取变量的值。对代理进程进行查询的软件属于I S O D E系统,叫做s n m p i。两者在[Rose 1994]中有详细的介绍。

25.7.1 简单变量

对一个路由器取两个U D P组的简单变量值:

速读原著-TCP/IP(SNMP示例)_数据

其中,- a选项代表要和之通信的代理进程名称, - c选项表示S N M P的共同体名。所谓共同体名,就是客户进程(在这里指 s n m p i)提供、同时能被服务器进程(这里指代理进程g a t e w a y)所识别的一个口令,共同体名称是管理进程请求的权限标志。代理进程允许客户进程用只读共同体名对变量进行读操作,用读写共同体名对变量进行读和写操作。S n m p i程序的输出提示符是 s n m p i >,在后面可以键入如g e t这样的命令,该软件将把它转化为S N M P中的g e t - r e q u e s t报文。当结束时,键入 q u i t就退出(在后面的例子中,我们将省略掉q u i t的操作)。 图2 5 - 1 5显示的是对于这个例子t c p d u m p的两行输出结果。

速读原著-TCP/IP(SNMP示例)_数据_02

对这两个变量的查询请求是封装在一个 U D P数据报中的,而响应也在一个 U D P数据报中。显示的变量是以其对象标识的形式显示的,这是在 S N M P报文中实际传输的内容。我们必须指定这两个变量的实例是 0。注意,变量的名称(它的对象标识)同样也在响应中返回。在下面我们将看到对于g e t - n e x t操作这是必需的。

25.7.2 get-next操作

g e t - n e x t操作是基于 M I B的字典式排序的。在下面的例子中,首先向代理进程询问U D P后的下一个对象标识(由于不是一个叶子对象,没有指定任何实例)。代理进程将返回U D P组中的第1个对象,然后我们继续向代理进程取该对象的下一个对象标识,这时候第 2个对象将被返回。重复上面的步骤直到取出所有的对象为止。

速读原著-TCP/IP(SNMP示例)_数据库_03

这个例子解释了为什么 g e t - n e x t操作总是返回变量的名称,这是因为我们向代理进程询问下一个变量,代理进程就把变量值和名称一起返回了。

采用这种方式进行 g e t - n e x t操作,我们可以想象管理进程只要做一个简单的循环程序,就可以从M I B树的顶点开始,对代理进程一步步地进行查询,就可以得出代理进程处所有的变量值和标识。该方式的另外一个用处就是可以对表格进行遍历。

25.7.3 表格的访问

对于“先列后行”次序的U D P监听表,只要采用前面的简单查询程序一步一步地进行操作,就可以遍历整个表格。只要从询问代理进程 u d p T a b l e的下一个变量开始就可以了。由于u d p T a b l e不是叶子对象,我们不能指定一个实例,但是g e t - n e x t操作依然能够返回表格中的下一个对象。然后就可以以返回的结果为基础进行下一步的操作,代理进程也会以“先列后行”的次序返回下一个变量,这样就可以遍历整个表格。我们可以看到返回的次序和图25-14相同。

速读原著-TCP/IP(SNMP示例)_网络管理_04

但是管理进程如何知道已经到达表格的最后一行呢?既然g e t - n e x t操作返回结果中包含表格中的下一个变量的值和名称,当返回的结果是超出表格之外的下一个变量时,管理进程就可以发现变量的名称发生了较大的变化。这样就可以判断出已经到达表格的最后一行。例如在我们的例子中,当返回的是s n m p I n P k t s变量的时候就代表已经到了U D P监听表的最后一个变量了。