千兆位以太网交换机嵌入式RMON代理的设计与实现
发布时间:2006-10-14 7:11:35   收集提供:gaoqian
梁晓江 黄本雄 黄载禄 杨立峰 华中科技大学电信系
  摘要:远程网络监控(RMON)是对SNMP最重要的增强。本文介绍了在Nucleus嵌入式实时操作系统下,一个千兆位交换机RMON代理的实现。在讨论了交换机网络管理软件的结构基础上,对RMON代理的软硬件平台进行了简单介绍,并对RMON代理的统计、历史、事件、警报四组功能实现的任务流程进行详细讨论。

  关键词:网络管理 远程网络监控 嵌入式代理

  目前,计算机网络中使用最广泛的网络管理协议是简单网络管理协议SNMP。远程网络监控RMON是对SNMP最重要的增强。它采用典型的客户机/服务器模型,客户端为网络管理者(管理站),RMON代理则扮演服务器的角色。管理站对RMON代理进行数据收集配置;代理收集本网段的数据,并将重要信息和事件报告给管理站。

  RMON代理的实现有两种方式:

  1、使用一个具有完整的软硬件系统的独立设备作为远程监视器;

  2、嵌入到网络中的关键设备如集线器、交换机中,称为嵌入式代理。嵌入式代理作为系统功能的一部分,使用专用于监视功能的处理器和内存资源。

  当前计算机网络的规模越来越大,应用越来越广泛,对于网络可管理性的要求也就越来越高。网络管理者必须对网络的活动有全面、及时的掌握。于是,在网络重要节点布置能够智能地采集数据的RMON代理是非常重要的。现在越来越多的网络设备中加入嵌入式RMON代理模块,用以对网络管理提供强大的支持。

  以下就千兆位以太网交换机中的嵌入式RMON代理的设计与实现进行讨论。

  一、系统接口

  本文设计的嵌入式RMON代理是千兆位交换机网络管理软件的一个模块,它需要自下而上分层次地和以下模块协同工作。

  1、以太网底层驱动

  RMON代理的工作基本上是对网段上数据包的监测。网络底层的工作由端口控制芯片完成,通过底层驱动程序为上层软件提供两种接口:获取数据包和获取以太网统计计数。

  2、SNMP,UDP,IP

  RMON只是对SNMP的增强,一个基本的SNMP代理及SNMP下的各层协议都是必不可少的。RMON与SNMP通过MIB进行交互,管理站对RMON代理的配置和对代收集的数据的获取都是通过SNMP完成的。当某些异常情况发生时,代理需要主动向管理站报告,因此SNMP还要提供发送SNMP陷阱(Trap)消息的接口。

  3、管理信息库

  为实现RMON功能,管理信息库应包含MIBII所定义的各个对象。RMON所使用的MIB对象必须是SNMP能够识别的,管理信息库为SNMP和RMON提供读写的接口。

  二、底层硬件支持与操作系统

  RFC1757定义了RMON的九组功能及相应的MIB结构。本文设计的嵌入式RMON代理实现统计、历史、警报和事件四组功能,是利用Galileo Techniology的千兆位以太网交换端口控制芯片GT-48320A,在嵌入式操作系统Nucleus Plus上开发的。

  GT-48320A提供对RMON这基本四组功能的支持,在它的以太网维护有一套32位MIB计数器,对经过该端口的以太网汉量进行统计。这些计数器在GT-48320A的只读寄存器PortCounterBlock中,地址为0x0100-0x0163。可以根据地址通过芯片定义的LW-Wire消息向GT-48320A发出读取计数器请求,GT-48320A以Block-Write消息将所请求的计数器值返回。获取计数器值的具体操作由底层驱动程序实现。GT-48320A提供两种读取数据模式,通过芯片寄存器Global-Control的MIBCrMode位(Global-Control<23>)设定:该位置0时,数据被读取后就被清零;置1时,数据被读取后不清除。考虑到计数器容量的限制,我们采用清零方式。这样,定时读取这些计数器的值,将它们累积起来,就可以得到实现统计、历史、事件、警报四组功能所需的数据。

  Nucleus Plus是专门为嵌入式系统的开发而设计的多任务实时操作系统。除提供具有抢先机制的任务调度外,Nucleus Plus还提供任务间通信、任务同步、定时和内存管理。Nucleus Plus通常作为一个C的库,在它上面开发的实时应用程序与该库链接,生成的对象下载到目标主机中成为嵌入式系统。从软件开发的角度来看,Nucleus Plus减少了任务的相互依赖,增强了模块性,缩短了开发时间,十分适合作为嵌入式RMON代理的操作系统平台。

  RMON代理的各组功能由若干Nucleus任务构成。各任务及其需要使用的系统资源,如事件组和消息队列等都在应用程序初始化时创建。

  三、RMON各组功能的实现

  1、统计组

  统计组的功能是维护代理监视的每一子网的基本统计信息,需要定时获取端口芯片寄存器的统计计数值。因此,统计组需用使用一个定时器和一个Nucleus事件组。定时器周期为读寄存器的周期。定时器计时到期时,执行定时器完成函数,使用系统函数NU-Set-Events()向事件组发送一个事件,通知统计任务开始对这一周期的数据进行采集。

  统计组任务执行以下操作:

  在任务初始化时,要将寄存器Global-Control置0,并执行一次对所有计数器的读操作以将它们清零。任务初始化时还要创建所需的定时器,创建定时器的系统函数为NU-CreateTimer()。然后循环执行以下操作:

  (1)调用系统的NU-Retrieve-Events()函数,从事件组接收事件。如果没有事件,任务将阻塞于该操作。

  (2)读取MIB统计表每一行的etherStatsDataSource值,获知要监视哪些端口。

  (3)调用底层驱动接口函数,读入所需的被监视端口寄存器中MIB计数器的值。

  (4)将数据累加写入MIB相应的统计组变量中。

  由于GT-48320A的MIB计数器为32位,因此统计以太网流量的计数器只能统计232字节,即32Gbit。对于一个千兆位端口,若端口流量达到1Gbit/s,该计数器在32秒后就会溢出。因此可以将读取MIB计数器的间隔缺省值取为30秒。

  2、历史组

  历史组的功能是周期性地对以太网一个或多个端口的统计样本进行采样,得到各时间段内的网络信息,并将这些历史统计保存起来。

  RFC1757中定义历史组的MIB,由两个表组成:历史控制表,其每一行定义一个对特定端口以特定采样间隔进行采样的功能;历史数据表,其用于记录采样得到的数据,每一样本被收集后,储存于历史数据表新的一行中。历史数据表采用环行桶结构,当已经保存的历史数据的行数达到最大值后,新的数据将覆盖最老的一行。   在具体实现中,管理站通过SNMP在历史控制表中设置所需的历史采样功能,RMON代理要做的工作便是根据历史控制表完成统计数据的采样,并将结果保存于历史数据表中。

  使用如下数据结构的链表作为历史参数表,保存已定义的每一历史统计任务的有关信息。

struct HISTORY-TEMP
{
struct HISTORY-TEMP * next;
UNSIGNED history-indes; / * 该历史序号 * /
UNSIGNED sample-indes; / * 上次采样序号 * /
UNWIGNED buckets-requested; / * 该历史请求保存多少行采样 * /
UNSIGNED time-start; / * 记录采样间隔开始时间(秒) * /
UNSIGNED octets; / * 记录采样间隔开始时的统计数据 * /
UNSIGNED pkts;
UNSIGNED broadcastpkts;
UNSIGNED multicastpkts;
UNSIGNED crcerror;
UNSIGNED undersizepkts;
UNSIGNED oversizepkts;
UNSIGNED fragment;
UNSIGNED jabbers;
UNSIGNED collisions;
UNSIGNED timer; / * 该历史所用定时器 * /
};
  历史组由两个任务组成:历史控制任务和历史监视任务。当SNMP代理接受管理站请求执行了对MIB的操作后,产生一个事件,由该事件激活历史控制任务,历史控制任务完成以下循环操作:

  (1)获取事件。如果没有事件,阻塞于该操作。

  (2)检查控制表是否有新的历史统计任务加入。如果有,需要为该新的历史统计任务进行参数设置和保存,并建立一个定时器。定时周期为历史控制表中HistoryControlInterval的值。定时完了数向历史组消息队列发一消息,消息值为该历史的索引值。

  (3)检查历史控制表已定义的历史中historyXontrolBucketsRequested是否被管理站修改。发果有,需要对环行桶的大小进行调整。

  (4)检查历史控制表中是否有已定义的历史统计被管理站删除。如果有,按如下顺序对该历史统计进行删除:删除历史数据表中相应的数据行,删除定时器,删除参数表中相应的节点。

  历史组监视任务执行以下循环操作:

  (1)从消息队列接收定时器的消息,如果没有消息,阻塞于该操作。接收消息的系统函数为NUReceive-From-Queue()。

  (2)从消息内容获知要监视的端口,从该端口读取统计组中所需的十项数据,与参数表保存的上一次读取的数据相减得到差值,并由下式计算etherHistoryUtilization:

  Utilization=Pkts*(9.6+6.4)+(Octets*.8)/Interval*10,000

  其中Interval为一个采样周期(秒数)。

  (3)将以上结果写到历史数据表的相应位置,然后用本次读到的统计数据替换参数表中的原有数据,供下一周期使用。读取当前时间,将原时间记录time-strart替换。

  3、事件组

  由事件组决定当监测变量超限时,是采用记录日志,还是产生SNMP陷阱消息。该组与警报组一起实现,没有专门的事件组任务。

  4、警报组

  利用警报组和事件组,可以实现对网络的预警管理。网络管理者可以根据网络的应用需要对网络中比较敏感的参数设置门限,例如利用率、出错率等。当门限被越过时,代理就会将情况记录下来,或向注册的管理站发送一个SNMP陷阱(trap)消息,通知管理站,网络某项参数出现异常,需要进一步的处理。

  RFC1757中定义警报组的MIB是由一个警报表组成。管理站对一个报警任务的定义,就通过设置该表完成。警报组的工作就是周期性检查管理站指定的参数,将它们与给定的门限比较。比较的方式有两种:用绝对值进行比较,或用差值进行比较。如果超过了门限,则会产生一个事件,并根据事件组的设定决定进行日志记录还是向管理站报告。

  警报组也需要使用一个链表作为状态参数表,用于保存一些中间结果。其数据结构如下:

struct ALARM_TEMP
{
struct ALARM_TEMP * next;
UNSIGNED alarm_index; / * 该警报序号 * /
UNSIGNED samlpe_type; / * 以绝对值(0)比较还是以差值(1)比较 * /
UNSIGNED alarm_status; / * 警报所处状态:上升(1)或下降(2)。初值为0 * /
UNSIGNED sample0; / * 上次采样值,用于计算差值。初值为0 * /
NU_TIMER timer; / * 该警报所用定时器 * /
};

  警报组由两个任务组成:一个警报控制任务,一个警报监视任务。

  当SNMP代理执行了对MIB的操作后,会产生一个事件,由该事件激活警报控制任务。

  警报控制任务执行以下操作:

  (1)获取事件。如果没有事件,阻塞于该操作。

  (2)通过状态参数表与警报表比较,检查是否有新的警报任务中入。若有,要对这个新的警报任务进行初始化,首先获取该警报的监视对象alarm Variable,检查其标识符是否存在于MIB中,并且其值是否由ASN.1的INTEGER类型表示,否则无法进行监视。然后在警报状态参数表中为新警报增加一个节点,并为该警报创建一个定时器:若alarmSampleType值为1,则定时间隔为设定的采样间隔alarmInterval;若alarmSampleType值为2,则定时间隔为设定的采样间隔alarmInterval/2。定时到期函数向警报组消息队列发一消息,消息值为该警报的索引值alarmIndex。最后读取MIB中被监视对象的值,将其保存到alarmValue中,并检查该当前值是否产生警报。

  (3)检查是否有已定义的警报被删除。若有,删除相应的定时器,然后删除警报状态参数表中相应的节点。

  警报监视任务执行以下循环:

  (1)从警报消息队列接收定时器的消息,从消息中得到警报索引;

  (2)由索引在警报表中得到监视的端口及监视的对象标识符,由该标识符读取MIB中的值sample;

  (3)检查是否产生警报;

  (4)将此次读到的值保存到alarmValue中。

  下面介绍如何检查是否产生了警报机制:

  (1)由MIB中警报组的对象alarmStartupAlarm和alarm-status的值共同决定能产生什么警报。

  * alarmStartupAlarm为由管理站设定的警报类型,在监视过程中不变。值为1时,允许上升警报;为2时,允许下降警报;为0时,两种警报都允许。

  * alarm-status指示警报所处状态,初值为0,两种警报都允许产生。当产生一个上升警报时,将alarm-status值设为2,只允许下降警报;当产生一个下降警报时,将alarm-status值设为1,只允许上升警报。这样是为了避免因为抖动而使同样的警报反复发生。

  (2)由alarmSampleType决定是以采样绝对值还是以差值来与阀值比较:

  * 如果使用采样绝对值,在只允许上升警报时,将采样值sample与MIB中上升警报门限alarmRisingThreshold比较,若大于门限,产生上升警报;只允许下降警报时,将采样值与下降警报门限alarmFallingThreshold比较,若小于门限,产生下降警报;两种警报都允许时,两种比较都要进行。

  * 如果使用采样差值,由sample-samlpe0得到差值。再按与上面同样方法进行比较。比较完成后,将当前的alarmValue值赋给参数表中的sample0。

  当检查到一个警报发生时,根据警报表中的事件索引在事件组MIB中找到相应事件的定义,决定进行日志的记录还是发送SNMP trap消息。

  四、结束语

  在交换式环境下,为了能够连续监视流量,需要在每个交换端口上嵌入RMON的基本四组(统计、历史、警报和事件组)功能。有了这关键的四组RMON功能,对网络连续实时的监视、历史流量统计以及警报和预警功能就都可以实现了。由于对流量的统计计数已经可以由ASIC实现,将RMON基本的四组功能嵌入交换机,仅占用交换机中很小的资源。而RMON其他的功能组(如数据包的过滤和捕获)需要更高的CPU的内存资源。将这样的功能组放到一个功能更强大,但成本更高的外置式可移动RMON监视器上,可以获得更高的性价比。本文介绍的以太网交换机嵌入式RMON代理,实现RMON的基本四组功能。当然在有需求及系统资源允许,底层硬件支持的情况下,将RMON所有的九组功能都嵌入交换机,也是可以实现的。并且RMON技术也在不断发展完善中,RMONII以及SMON技术的出现都大大加强了RMON所提供的网络监视功能。设计者应根据不同的网络应用的需要,选择将RMON合适的功能嵌入网络设备中。

  摘自《数据通信》2000年第84期
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50