网络管理课程设计(BER编解码,报文构造与解析)_第1页
网络管理课程设计(BER编解码,报文构造与解析)_第2页
网络管理课程设计(BER编解码,报文构造与解析)_第3页
网络管理课程设计(BER编解码,报文构造与解析)_第4页
网络管理课程设计(BER编解码,报文构造与解析)_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计算机网络管理课程设计引言简单网络管理协议(SNMP)首先是由Internet工程任务组织(Internet Engineering Task Force)(IETF)的研究小组为了解决Internet上的路由器管理问题而提出的。 SNMP被设计成与协议无关,所以它可以在IP,IPX,AppleTalk,OSI以及其他用到的传输协议上被使用。它具有简单性,易于扩展性的特点。SNMP是一系列协议组和规范(见下表),它们提供了一种从网络上的设备中收集网络管理信息的方法。SNMP也为设备向网络管理工作站报告问题和错误提供了一种方法。名字说明MIB管理信息库SMI管理信息的结构和标识SNMP简单网络管

2、理协议从被管理设备中收集数据有两种方法:一种是只轮询(polling-only)的方法,另一种是基于中断(interrupt-based)的方法。Snmp发展到现在共有三个版本,本课程设计是基于snmpv1版本。2.设计任务及思想2.1任务:设计一个Manager。Manager可以向华为网络设备发送get和set报文,并获得有效操作结果,实现版本为SNMPv1.开发工具:VC+(Win32)内容: Socket网络通信、 BER编码、BER解码、SNMP报文构造、SNMP报文解析、用户输入/输出。2.2思想:根据snmp协议,分析抓包软件抓出的结果。Manager在进行操作时,先对要发送的报

3、文进行构造,然后对要发送的报文各数据类型依据asn.1进行编码再发送。agent接收到报文后,进行报文解析,再解码。看manager的要求是什么,然后回应一个报文,即response报文,manager即对回应的报文进行解析解码,整个过程由socket通信完成,snmp报文封装在udp中发送。3设计过程2.1 BER编码和解码Ber编码是整个设计过程中的极为重要的部分,一个报文有很多段组成,每段的数据类型都不尽相同。对每一种数据类型都要进行编码,即编成tlv。计算机只认识0和1;在编码时,我们考虑把它编成一个字节一个字节的形式发送,便于解析处理。下面列出常用的几种数据类型的编码以及代码:整型:

4、要考虑多种情况。 void Integer_TLV(unsigned char *TLV,int &len,int value) unsignedchar * tlv;tlv=TLV; tlv0=INTEGER;/TLV_Tstack s; if (value=0) if(value128 convert(s,value,2); int length=(s.top-s.base)%8);if(length=0)/ int num_8=(s.top-s.base)/8;tlv1=num_8+1;/TLV_Llen=2+num_8+1;tlv2=0;/valuefor(int k=num_8;k=

5、1;-k) int sum_8=0;int local=k*8-1;int lastlocal=0; for(int j=0;j8;j+) int ee=0;Pop(s,ee); sum_8+=pow(ee*2,local-); lastlocal=ee; if(lastlocal=0) tlvnum_8+3-k=sum_8-1; else tlvnum_8+3-k=sum_8; else int sum=0;int LENGTH=(s.top-s.base)/8; /tlv.V=new unsigned charLENGTH+1; int firstlastlocal=0; for(int

6、i=0;i=1;-k1) int sum_8_bit=0;int local_8=k1*8-1; int lastlocal=0; for(int j=0;j8;j+) int ee_bit=0;Pop(s,ee_bit); sum_8_bit+=pow(ee_bit*2,local_8-);lastlocal=ee_bit; if(lastlocal=0) tlvnum_8_bit+3-k1=sum_8_bit-1; else tlvnum_8_bit+3-k1=sum_8_bit; else 字符型:比较简单,直接编成asc码就行了。标识符:void Objectidentifier_TL

7、V(unsigned char *TLV,int &len,string value) string strdod=.;string smallstr; /bool strover=false; /char strl50;int j=0; for(int i=4;ivalue.length();i+)/(int)value.length .2.1 string str=value.substr(i,1);/value.c_str() if(!strcmp(str.c_str(),strdod.c_str()/ /strover=true; continue; /compare(value.su

8、bstr(i,1) else /if(strover) smallstr+=str; unsignedchar * tlv;tlv=TLV; tlv0=OBER ;/.1.0 TLV_Ttlv1=1+smallstr.length();/TLV_l len=2+1+smallstr.length();tlv2=43;/+smallstr; TLV_V for(int l=0;lsmallstr.length();l+)tlvl+3=atoi(smallstr.substr(l,1).c_str();/ Ip地址:与标识符类似,只要把各部分分离出来编码即可。举个编码的例子如下:Snmp vers

9、ion =1Comminutiy =public Command = get requestRequest ID =8Error status =0 (no error)Error index =0Object = Value =null编成:48 40 2 1 0 4 6 112 117 98 108 105 99 160 27 2 1 8 2 1 0 2 1 0 48 14 48 10 6 8 43 6 1 2 11 1 0 5 0解码过程是编码过程的逆过程,相对而言,要简单一点。因为在编码时,我们编成一个个字节形式,除了字符型用asc码编码,其他都表示成十进制数的形式2.2报文构造和解析

10、 整个报文的结构如下图,构造报文时,我们依据提示分别输入各个部分的数据,然后编码发送,报文构造即算完成。报文的解析又是构造的逆过程,即分离出报文的各个部分,以便解码。对应上面编码的例子,我们对其编码进行解析如下图:注:此处用十六进制,具体实现时,我们编成十进制,便于直接察看。其中,围在方框内的是Tag字节,标有下划线的是长度字节,圆框里的是value部分编码。2.3socket通信与输入输出利用即套接字建立通信,发送编码好的报文给网关。主要是以下的三个函数。bool InitWinsock();void Cennect();void WaitTrap();至于输入输出,我们由于时间关系,没有能

11、做出界面,虽然没有界面,对用户的操作带来不便,但是,我们每一步的操作都给了提示,操作还是很容易上手的。 4.设计结果程序运行结果如下图:我们实现了可以一次输入多个变量名,然后返回多个value的值。并对其解析。Public ,private 等。抓包截图如下:我们实现了,getRequest,getnextRequest,setRequest 及manager收到的报文,trap报文很遗憾没有实现。以下抓包抓的是set报文,为了方便起见,因为只是调试,我们把value字段的值定为25。5.评价和总结经过三天时间的紧张设计,熬了两个通宵,小组成员齐心协力,终于比较圆满的完成了课程设计的任务,实现

12、了主要功能。测试时,我们向网关发送报文,能收到其回应的报文并对其进行解析。由于时间的原因,设计上还存在缺陷,没有完成其全部功能,有些遗憾,对于报文的解析,特别是对超过一个字节的整数编码的解析还存在一些小问题。总的说来,完成情况良好,整个过程中,收获颇丰。不仅重新学习了被遗忘的c语言,团队分工协作的能力,吃苦耐劳的精神都有提升。6参考文献vc+开发基于snmp的网络管理软件武孟军 徐袭 任相臣编著 人民邮电出版社 2007年1月网络管理(第2版)郭军编著 北京邮电大学出版社 2003年9月 附录:主要程序代码报文构造代码如下:void BindSequenceOf_TLV(unsigned ch

13、ar *return_tlv_bind,int &return_tlv_bind_len,message MSG)/name value name value for(int i=0;i6;i+)/ /get return_tlv_bind unsigned char return_tlv50;int return_tlv_len=0; unsigned char tlv_name10; int tlv_name_len=0; unsigned char tlv_value10; int tlv_value_len=0;/for else Sequence_TLV(return_tlv,ret

14、urn_tlv_len,tlv_name,tlv_name_len); Null_TLV(tlv_value,tlv_value_len,25); else Null_TLV(tlv_value,tlv_value_len,-1); Sequence_TLV(return_tlv,return_tlv_len,tlv_value,tlv_value_len); SequenceOf_TLV(return_tlv_bind,return_tlv_bind_len,return_tlv,return_tlv_len); void PduSequence_TLV(unsigned char *ret

15、urn_tlv_Pdu,int &return_tlv_Pdu_len,message MSG)/pdutype id 0 0 bind /,TLV &return_tlv_bind case 0: return_tlv_Pdu0=160;break;/A0H 10100000 request case 1: return_tlv_Pdu0=161;break;/A1H 10100001 next_request case 2: return_tlv_Pdu0=163;break;/A3H 10100011 set_request case 3: return_tlv_Pdu0=162;bre

16、ak;/A2H 10100010 response case 4: return_tlv_Pdu0=164;break;/A4H 10100100 default: break; unsigned char TLV_request_id5;int TLV_request_id_len=0; unsigned char TLV_error_status5;int TLV_error_status_len=0; unsigned char TLV_error_index5;int TLV_error_index_len=0; unsigned char return_tlv_bind50;int

17、return_tlv_bind_len=0;/ BindSequenceOf_TLV(return_tlv_bind,return_tlv_bind_len,MSG);/varBind* variable_bindings; Pdu_Sequence_TLV(return_tlv_Pdu,return_tlv_Pdu_len,return_tlv_bind,return_tlv_bind_len);void MessSequence_TLV(unsigned char *return_tlv_message,int &return_tlv_message_len,message MSG)/ve

18、rsion community snmppdu ,TLV &return_tlv_Pdu unsigned char TLV_version10;int TLV_version_len=0; unsigned char TLV_community10;int TLV_community_len=0; Integer_TLV(TLV_version,TLV_version_len,MSG.version);/version Sequence_TLV(return_tlv_message,return_tlv_message_len,TLV_version,TLV_version_len); Oc

19、tetString_TLV(TLV_community,TLV_community_len,MSG.community);/community Sequence_TLV(return_tlv_message,return_tlv_message_len,TLV_community,TLV_community_len); unsigned char return_tlv_Pdu150;int return_tlv_Pdu_len=0; PduSequence_TLV(return_tlv_Pdu,return_tlv_Pdu_len,MSG);/PDUs pdu; Sequence_TLV(re

20、turn_tlv_message,return_tlv_message_len,return_tlv_Pdu,return_tlv_Pdu_len);void createmessage(char *Buffer,char *pdutype,int &leng_buffer)using std:cout;using std:cin;using std:endl; unsigned char return_tlv_message300; int return_tlv_message_len=0;message MSG;int i=0; coutchoose input the community

21、MSG.community;coutchoose input the name ,maxsize: 6input;while(input!=send) cininput;MSG.version=0;/MSG.community=public; MessSequence_TLV(return_tlv_message,return_tlv_message_len,MSG);leng_buffer=return_tlv_message_len; for(int l=0;lreturn_tlv_message_len;l+) cout(int)return_tlv_messagel ; Bufferl

22、=return_tlv_messagel;/(int) /cout(int)Bufferl ; coutendl; coutendl; 解析和解码代码如下:void strcpyTLV( char temp_INTEGER, char get_pdu,int k,int len)/字符串拷贝,拷贝value 部分 int begin=k; for(int p=0;plen;p+) temp_INTEGERp=get_pdubegin+; temp_INTEGERlen=0;void prinout( char temp_INTEGER,bool change_line)/输出整数value部分

23、if(change_line)std:cout(int)temp_INTEGER0endl;else std:cout(int)temp_INTEGER0; void printout_OBJE( char temp_name,int len)/输出标识符std:cout1.3.;int i=1;while(ilen) std:cout(int)temp_namei+.;std:coutendl; void Dcode_version( char temp_INTEGER,int len)/version解析std:coutversion: INTEGER len ;prinout(temp_

24、INTEGER,true); void Dcode_OCTETSTRING( char temp_OCTETSTRING,int len)/community解析 std:coutcommunity: OCTETSTRING len temp_OCTETSTRINGendl; void Dcode_PDUTYPE(int Tlv_T)/pdutype解析 std:coutpdutype: Tlv_T endl; void Dcode_resid( char temp_INTEGER,int len)/requestid解析 for(int g=0;glen;g+) temp_INTEGERg=

25、(len-1-g)*8; int sum=temp_INTEGER0;for(int h=1;hlen;h+) sum|=temp_INTEGERh;std:coutrequestid: INTEGER len sumendl; void Dcode_errorstatus(char temp_INTEGER,int len)/errorstatus解析 std:couterrorstatus: INTEGER len ; prinout(temp_INTEGER,false); switch (temp_INTEGER0) case 0:std:cout NoErrorendl;break;

26、 case 1:std:cout TooBigendl;break; case 2:std:cout NoSuchnameendl;break;case 3:std:cout BadValueendl;break;case 4:std:cout ReadOnlyendl;break; case 5:std:cout genErrendl;break;default:break; void Dcode_errorindex( char temp_INTEGER,int len)/errorindex解析 std:couterrorindex: INTEGER len ; prinout(temp

27、_INTEGER,false); if(temp_INTEGER0!=0) std:cout The(int)temp_INTEGER0name is wrongendl; else std:coutendl;void Dcode_name( char temp_name,int total_name,int len)/标识符解析 std:coutname: OBER len ; printout_OBJE(temp_name,len); void Dcode_value_INTEGER( char temp_INTEGER,int total_name,int len)/value解析 st

28、d:coutvalue: INTEGER len ; prinout(temp_INTEGER,true); void Dcode_Null(int len)/Null类型解析 std:coutvalue: Null len endl; void Dcode_IpAddress( char temp_ipaddress,int len)/ipaddress解析 std:coutIpaddress: IpAddress len; for(int mm=0;mmlen;mm+) std:couttemp_ipaddressmm.; void Decode_pdu(char get_pdu)/主函数

29、 std:coutparasing type len value endl; int total_length=get_pdu1;/长度int total_INTEGER=0;int total_name=0;int len=0;int len1=0;int len2=0;int len3=0;int len4=0;/定义各length值int len7=0;int len6=0;int len5=0;int len8=0;int i=2;while(itotal_length+2) int Tlv_T=0;Tlv_T=(int)get_pdui;switch (Tlv_T) case INT

30、EGER :/ 2 +total_INTEGER;if(total_INTEGER=1)/vertionlen=(int)get_pdui+1; char temp_INTEGER10;/strcpyTLV(temp_INTEGER,get_pdu,i+2,len); Dcode_version(temp_INTEGER,len);i=i+len+1;/i=i+len+1+1;else if(total_INTEGER=2)/requestId len1=(int)get_pdui+1; char temp_INTEGER100;/ strcpyTLV(temp_INTEGER,get_pdu

31、,i+2,len1); Dcode_resid(temp_INTEGER,len1); i=i+len1+1; else if(total_INTEGER=3)/errorstatus len2=(int)get_pdui+1; char temp_INTEGER5;/ strcpyTLV(temp_INTEGER,get_pdu,i+2,len2); Dcode_errorstatus(temp_INTEGER,len2); i=i+len2+1;else if(total_INTEGER=4)/errorIndex len3=(int)get_pdui+1; char temp_INTEGER5;/ strcpyTLV(temp_INTEGER,get_pdu,i+2,len3); Dc

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论