西安电子科技大学网络管理大作业
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
网络管理结课大作业
第一部分‐‐基本知识问答
1、请说明网络管理中的五大功能域以及功能
答:五大功能域:配置管理、故障管理、性能管理、计费管理和安全管理配置管理:1.设置被管系统或管理对象的参数
2.初始化、启动和关闭管理对象
3.收集被管系统状态的数据,以便管理系统能够识别被管系统中状态变化的发生
4.改变被管系统或管理对象的配置
5.定义和修改管理对象间的关系
6.生成配置状态报告
故障管理:1.维护、使用和检查差错日志
2.接受差错事件的通知并作出反应
3.在系统范围内跟踪差错
4.执行诊断测试命令/动作序列
5.执行恢复动作以纠正差错
性能管理:1.从管理对象中收集并统计有关数据
2.分析当前统计数据以检测性能故障、产生性能警报、报告性能事件
3.维护和检查系统状态历史的日志,以便用于规划和分析
4.确定自然和人工状态下系统的性能
5.形成并改进性能评价准则和性能门限,改变系统操作模式以进行系统性能
管理的操作
6.对管理对象和管理对象群进行控制,以保证网络的优越性能
计费管理:1.计算网络建设及运营成本,包括设备、网络服务、人工费用等成本
2.统计网络及其所包含的资源的利用率,确定计费依据
3.将应该缴纳的费用通知用户
4.支持用户费用上限的设置
5.在必须使用多个通信实体才能完成通信时,能够把使用多个管理对象的费
用结合起来
6.保存收费账单及必要的原始数据,以备用户查询和质疑
安全管理:1.采用多层防卫手段,将受到侵扰和破坏的概率降到最低
2.提供迅速检测非法入侵者的手段,核查跟踪侵入者的活动
3.提供恢复被破坏的数据和系统的手段,尽量降低损失
4.支持身份鉴别,规定身份鉴别的过程
5.控制和维护授权设施
6.控制和维护访问权限
7.支持密钥管理
8.维护和检查安全日志
二、对比GETNEXT和GETBULK如何遍历下列MIB树(右图为设备上的实例),写出详细的通信过程和内容。
假例根节点的编号为1,A、B、T、Z编号分别为1、2、3、4,E的编号为1,C1、C2、C3编号为1、2、3,G。
当getnext,(1.2.0);response(1.3.1.1.1)=>1
当getBulk(non-repeator=1,max-repetitons=3;1.2.0;1.3.1.1.1;1.3.1.2.1;1.3.1.3.1);
response(1.3.1.1.1=>1;
1.3.1.1.2=>2;1.3.1.1.3=>3;1.3.1.1.4=>4;
1.3.1.
2.2=>100;1.
3.1.2.3=>1000;1.3.1.2.4=>10000;
1.3.1.3.2=>y;1.3.1.3.3=>z;1.3.1.3.4=>w;)
GetBulkRequest操作的基本工作过程如下:GetBulkRequest在变量绑定字段中放入一个(N+R)个变量名的清单。
对于前N个变量名,查询方式与GetNextRequest 相同。
即,对清单中的每个变量名,返回它的下一个变量名和它的值,如果没有后继变量,则返回原变量名和一个endOfMibView的值。
GetBulkRequest PDU有两个其他PDU所没有的字段,non-repeaters和max-repetitions。
non-repeaters字段指出只返回一个后继变量的变量数。
max-repetitions字段指出其他的变量应返回的最大的后继变量数。
为了说明算法,我们定义:L = 变量绑定字段中的变量名数量
N = 只返回一个后继变量的变量名数
R = 返回多个后继变量的变量名数
M = 最大返回的后继变量数
在上述变量之间存在以下关系:
N = MAX [MIN(non-reperters, L),0]
M = MAX [max-repetitions,0]
R = L - N
如果N大于0,则前N个变量与GetNextRequest一样被应答。
如果R大于0并且M大于0,则对应后面的R个变量,返回M个后继变量。
即,对于每个变量:
·获得给定变量的后继变量的值;
·获得下一个后继变量的值;
·反复执行上一步,直至获得M个对象实例。
如果在上面的过程中的某一点,已经没有后继变量,则返回endOfMibView 值,在变量名处,返回最后一个后继变量,如果没有后继变量,则返回请求中的变量名。
利用这个规则,能够产生的name-value对的数量是N+(M×R)。
后面的(M ×R)对在应答PDU中的顺序可描述为:
for i : = 1 to M do
for r : = 1 to R do
retrieve i-th successor of (N+r)-th variable
即,返回的后继变量是一行一行的,而不是先返回第一个变量的所有后继变量,再返回第二个变量的所有后继变量,等等。
三、SNMPv2针对SNMPv1不足的改进有哪些具体内容?
答:具体地说,SNMPv2对SNMPv1的增强分为:1、管理信息结构;2、协议操作;3、管理器和管理器(M2M)之间通信的能力。
SNMPv2的SMI再几个方面扩展了SNMPv1的SMI。
首先,用于定义对象类型的宏扩
展了几类新的数据类型,并增强了对象的操作能力,一个最显著的变化时增强了对表对象的行创建和删除的约定,这个约定是受RMON的启发增加的。
在协议操作上的变化是增加了两个新的PDU类型,即GetBulkRequest和InformRequest,其中GetBulkRequest允许管理器更有效地检索大量的数据,它特别适合于检索一个表对象的多行内容,当需要用一个请求原语提取大量数据(如读取某个表的内容)时就可以调用它以提高效率。
SNMPv2也引进管理进程和管理进程之间的通信进行状况报告,为此增加了一条原语InformRequest,并把GetResponse简化成更加合理的名称Response。
Trap报文则已改为SNMPv2-Trap,并与所有的协议PDU具有相同的格式。
另外,SNMPv2还定义了两个MIB库,一个是SNMPv2 MIB,它包含了SNMPv2协议操作的基本流量信息,也包含与SNMPv2的管理器或代理的配置相关的其他信息,相当于SNMPv1的MIB-2的SNMP组的内容。
另一个是Manager-to-Manager(M2M)MIB,它提供了对分布式管理结构的支持,其功能类似于RMON MIB,它可用于中间管理器向上级管理器报告中间管理器或其下属的代理系统的活动情况。
第二部分‐‐MIB 设计文档
SCORE-MIB DEFINITIONS ::= BEGIN
IMPORTS
enterprises, Counter
FROM RFC1155-SMI
OBJECT-TYPE
FROM RFC-1212;
zhaojiawei OBJECT IDENTIFIER ::= { enterprises 50000 }
String ::= OCTET STRING
score OBJECT IDENTIFIER ::= { zhaojiawei 1 }
nms OBJECT IDENTIFIER ::= { score 1 }
——课程名称
courseName OBJECT-TYPE
SYNTAX String (SIZE (0..255))
ACCESS read-only
STATUS mandatory
DESCRIPTION
"The course name."
::= { nms 1 }
——教师姓名
teacherName OBJECT-TYPE
SYNTAX String (SIZE (0..255))
ACCESS read-only
DESCRIPTION
"The teacher name."
::= { nms 2 }
——成绩表(Table)
scoreTable OBJECT-TYPE
SYNTAX SEQUENCE OF ScoreEntry ACCESS not-accessible
STATUS mandatory
DESCRIPTION
"Score table."
::= { nms 3 }
——定义ScoreEntry这个数据类型scoreEntry OBJECT-TYPE
SYNTAX ScoreEntry
ACCESS not-accessible
STATUS mandatory
DESCRIPTION
"Score entry."
INDEX { studentNo }
::= { scoreTable 1 }
ScoreEntry ::=
SEQUENCE {
studentNo
String,
studentName
String,
studentGender
INTEGER,
studentScore
INTEGER
}
studentNo OBJECT-TYPE
SYNTAX String (SIZE(0..10)) ACCESS read-only
STATUS mandatory
DESCRIPTION
"Student number."
::= { scoreEntry 1 }
studentName OBJECT-TYPE
SYNTAX String (SIZE(0..10))
STATUS mandatory
DESCRIPTION
"Student name."
::= { scoreEntry 2 }
studentGender OBJECT-TYPE
SYNTAX INTEGER {male(1), female(2)} ACCESS read-only
STATUS mandatory
DESCRIPTION
"Student gender."
::= { scoreEntry 3 }
studentScore OBJECT-TYPE
SYNTAX INTEGER (0..100)
ACCESS read-write
STATUS mandatory
DESCRIPTION
"Student score."
::= { scoreEntry 4 }
——scoreStat
scoreStat OBJECT IDENTIFIER ::= { nms 4 }
scoreAverage OBJECT-TYPE
SYNTAX String
ACCESS read-write
STATUS mandatory
DESCRIPTION
"Score average."
::= { scoreStat 1 }
countUnderSixty OBJECT-TYPE
SYNTAX Counter
ACCESS read-write
STATUS mandatory
DESCRIPTION
"Score < 60."
::= { scoreStat 2 }
countBetweenSixtyToSeventy OBJECT-TYPE
SYNTAX Counter
ACCESS read-write
STATUS mandatory
DESCRIPTION
"Score between 60-70." ::= { scoreStat 3 }
countBetweenSeventyToEighty OBJECT-TYPE SYNTAX Counter
ACCESS read-write
STATUS mandatory
DESCRIPTION
"Score between 70-80." ::= { scoreStat 4 }
countBetweenEightyToNinety OBJECT-TYPE SYNTAX Counter
ACCESS read-write
STATUS mandatory
DESCRIPTION
"Score between 80-90." ::= { scoreStat 5 }
countBetweenNinetyToHundred OBJECT-TYPE SYNTAX Counter
ACCESS read-write
STATUS mandatory
DESCRIPTION
"Score between 90-100." ::= { scoreStat 6 }
——结束
END
结果图:
遇到的困难:最开始由于不了解mib包的命名规则,命名成了学号导致mib包无法导入,最后上网检索知道不能以数字开头,然后便讲学号改成了zhaojiawei
第三部分‐‐发挥部分
基于Linux环境的简单网络管理协议的实现
一、程序实现
1、系统结构与实现
管理结构示意图
Manager为LINUX操作系统平台(放置编写的简单的SNMP应用软件),Agent为具有SNMP代理的设备。
在Manager端利用C语言和SNMP协议编写一个简单的应用程序(可以发送GET GET-NEXT SET等命令),对放在网络各处的安装了SNMP代理的设备进行查询。
在SNMP协议中,Manager端和Agent端的通信是通过SNMP协议数据单元实现的它们之间可以有三种类型的交互:
Manager端执行GET或GET—NEXT操作从代理Agent获得信息;
Manager端执行SET操作对代理Agent的属性进行设置:
代理Agent端向Manager端发送陷阱异步通知信息告诉管理者关于自己的一些事件。
2、SNMP相关协议和编码格式
一、管理信息库(MIB)
管理信息库(MIB)规定了网络代理所保存的数据项目、数据类型,以及在每个数据项目中允许的操作,通过对这些数据项目的存取访问来实现网络管理的5大功能:配置管理、性能管理、失效管理、计费管理、安全管理
Internet标准的管理信息库(MIB)是数形结构的数据库, 其结构见图
MIB-I 的树形结构
MIB对象定义:
DEFINITIONS::=BEGIN
IMPORTS
mgmt, OBJECT-TYPE, NetworkAddress, IpAddress,Counter, Gauge, TimeTicks mib OBJECT IDENTIFIER::={mgmt 1}
system OBJECT IDENTIFIER::={mgmt 2}
interface OBJECT IDENTIFIER::={mgmt 3}
at OBJECT IDENTIFIER::={mgmt 4}
ip OBJECT IDENTIFIER::={mgmt 5}
icmp OBJECT IDENTIFIER::={mgmt 6}
tcp OBJECT IDENTIFIER::={mgmt 7}
udp OBJECT IDENTIFIER::={mgmt 8}
egp OBJECT IDENTIFIER::={mgmt 9}
ASN.1描述文法:
基本编码规则(BER)
类型对应的标签号
二、SNMP协议数据单元(PDU Protocol Data Unit)的格式
在SNMP中信息按照SNMP消息的形式在管理站和代理之间交换
variable-bindings
图二、SNMP格式
GetRequest PDU 的定义(其它PUD定义类似,下面省略)
GetRequest-PDU::=
IMPLICIT SEQUENCE {
request-id RequestID, --always 0
error-status ErrorStatus, --always 0
error-index ErrorIndex, --always 0
variable-bindings
VarBindList
}
其中Request-ID定义为4个8位段整数(用于使响应和查询相匹配),Error status和Error index 是请求中为0的单个8位段整数。
VarBindlist 为对象表示列表,ASN.1 规定VarBindlist 是一系列成对的对象和数值
SNMPv1操作原语类型的ASN.1表示
操作原语类型ASN.1表示
GetRequest 0xA0 (160)
GetNextRequset 0xA1 (161)
GetRqsponse 0xA2 (162)
SetRequest 0xA3 (163)
Trap 0xA4 (164)
SNMP报文格式定义
SNMP报文由2部分组成,即协议头(Protocol Header)和数据区域(Data area) 协议头由协议“版本”和SNMP community(团体字)组成。
数据区域由若干协议数据单元PDU组成,每个PDU由一个“请求”(网络管理者发送)或一个“响应”(网络代理发送)组成。
报文
SNMP报文格式
SNMP报文格式的ASN.1表示法:
SNMP DEFINITIONS::=BFGIN
Message::=SEQUENCE {
version -- version-1 for this RFC
INTEGER { version-1(0) },
community -- community name
OCTET STRING,
data -- e.g., PDUs if trivial
ANY -- authentication is begin used
PDUs::= CHOICE {get-request
GetRequest-PDU,
get-next-request
GetNextRequest-PDU
get-response
GetResponse-PDU,
set-request-PDU,
SetRequest-PDU,
trap
Trap-PDU
}
END
3、SNMP Get-Request操作的实现
下面给出用GNU C++在REDHAT 6.0操作系统中实现SNMP消息操作的例子。
SNMP 库函数的源代码和头文件来自。
编译后生成libdsnmp.a作为snmp程序的函数调用库用于各种snmp命令集的程序编写,下面以Get-Request 命令为例给出Get-Request命令的源程序(编译和运行环境为Linux ,Kernel 为2.2.5.-1 gcc, g++ - GNU project C and C++ Compiler (v2.7) )该源代码已被编译通过,可在LINUX的命令环境下查询装有SNMP 代理服务的设备的MIB信息。
/* SNMP GET-REQUEST的C++实现
用法:snmpget IP地址团体名查询对象OID */
#include <sys/types.h>
#include <netinet/in.h>
#include <stdio.h>
#include "snmp.h"
#include "snmp_impl.h"
#include "asn1.h"
#include "snmp_api.h"
#include "snmp_client.h"
extern int errno;
int snmp_dump_packet = 0;
main(argc, argv)
int argc;
char *argv[];
{
struct snmp_session session, *ss;
struct snmp_pdu *pdu, *response;
struct variable_list *vars;
int arg;
char *gateway = NULL;
char *community = NULL;
int count, current_name = 0;
char *names[128];
oid name[MAX_NAME_LEN];
int name_length;
int status;
init_mib();
/*
* usage: snmpget gateway-name community-name
*/
/*命令和参数的读取和分析*/
for(arg = 1; arg < argc; arg++){
if (argv[arg][0] == '-'){
switch(argv[arg][1]){
case 'd':
snmp_dump_packet++;
break;
default:
printf("invalid option: -%c\n", argv[arg][1]);
break;
}
continue;
}
if (gateway == NULL){
gateway = argv[arg];
} else if (community == NULL){
community = argv[arg];
} else {
names[current_name++] = argv[arg];
}
}
if (!(gateway && community && current_name > 0)){
printf("usage: snmpget [-d] gateway-name community-name object-identifier [object-identifier ...]\n");
exit(1);
}
/*构造会话信息*/
bzero((char *)&session, sizeof(struct snmp_session));
session.peername = gateway;
munity = (u_char *)community;
munity_len = strlen((char *)community);
session.retries = SNMP_DEFAULT_RETRIES;
session.timeout = SNMP_DEFAULT_TIMEOUT;
session.authenticator = NULL;
snmp_synch_setup(&session);
/*打开会话*/
ss = snmp_open(&session);
if (ss == NULL){
printf("Couldn't open snmp\n");
exit(-1);
}
/*构造PDU*/
pdu = snmp_pdu_create(GET_REQ_MSG);
for(count = 0; count < current_name; count++){
name_length = MAX_NAME_LEN;
if (!read_objid(names[count], name, &name_length)){
printf("Invalid object identifier: %s\n", names[count]);
}
snmp_add_null_var(pdu, name, name_length);
}
retry:
/*发送会话信息并等待响应信息*/
status = snmp_synch_response(ss, pdu, &response);
if (status == STAT_SUCCESS){
if (response->errstat == SNMP_ERR_NOERROR){
for(vars = response->variables; vars; vars = vars->next_variable)
print_variable(vars->name, vars->name_length, vars);
} else {
printf("Error in packet.\nReason: %s\n", snmp_errstring(response->errstat));
if (response->errstat == SNMP_ERR_NOSUCHNAME){
printf("This name doesn't exist: ");
for(count=1,vars= response->variables; vars && count != response->errindex;
vars = vars->next_variable, count++)
;
if (vars)
print_objid(vars->name, vars->name_length);
printf("\n");
}
if ((pdu = snmp_fix_pdu(response, GET_REQ_MSG)) != NULL)
goto retry;
}
} else if (status == STA T_TIMEOUT){
printf("No Response from %s\n", gateway);
} else { /* status == STA T_ERROR */
printf("An error occurred, Quitting\n");
}
/*清除PDU 关闭对话*/
if (response)
snmp_free_pdu(response);
snmp_close(ss);
}。