网络管理课程设计BER编解码报文构造与解析.docx
- 文档编号:11084758
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:17
- 大小:103.18KB
网络管理课程设计BER编解码报文构造与解析.docx
《网络管理课程设计BER编解码报文构造与解析.docx》由会员分享,可在线阅读,更多相关《网络管理课程设计BER编解码报文构造与解析.docx(17页珍藏版)》请在冰豆网上搜索。
网络管理课程设计BER编解码报文构造与解析
计算机网络管理课程设计
1.引言
简单网络管理协议(SNMP)首先是由Internet工程任务组织(InternetEngineeringTaskForce)(IETF)的研究小组为了解决Internet上的路由器管理问题而提出的。
SNMP被设计成与协议无关,所以它可以在IP,IPX,AppleTalk,OSI以及其他用到的传输协议上被使用。
它具有简单性,易于扩展性的特点。
SNMP是一系列协议组和规范(见下表),它们提供了一种从网络上的设备中收集网络管理信息的方法。
SNMP也为设备向网络管理工作站报告问题和错误提供了一种方法。
名字
说明
MIB
管理信息库
SMI
管理信息的结构和标识
SNMP
简单网络管理协议
从被管理设备中收集数据有两种方法:
一种是只轮询(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在进行操作时,先对要发送的报文进行构造,然后对要发送的报文各数据类型依据asn.1进行编码再发送。
agent接收到报文后,进行报文解析,再解码。
看manager的要求是什么,然后回应一个报文,即response报文,manager即对回应的报文进行解析解码,整个过程由socket通信完成,snmp报文封装在udp中发送。
3设计过程
2.1BER编码和解码
Ber编码是整个设计过程中的极为重要的部分,一个报文有很多段组成,每段的数据类型都不尽相同。
对每一种数据类型都要进行编码,即编成tlv。
计算机只认识0和1;在编码时,我们考虑把它编成一个字节一个字节的形式发送,便于解析处理。
下面列出常用的几种数据类型的编码以及代码:
整型:
要考虑多种情况。
voidInteger_TLV(unsignedchar*TLV,int&len,intvalue)
{unsignedchar*tlv;tlv=TLV;
tlv[0]=INTEGER;//TLV_Tstacks;
if(value>=0)
{if(value<=127)
{tlv[1]=1;//TLV_L
tlv[2]=value;//TLV__V
len=3;}
else//>128
{convert(s,value,2);
intlength=((s.top-s.base)%8);
if(length==0)//
{intnum_8=(s.top-s.base)/8;
tlv[1]=num_8+1;//TLV_L
len=2+num_8+1;
tlv[2]=0;//value
for(intk=num_8;k>=1;--k)
{intsum_8=0;intlocal=k*8-1;intlastlocal=0;
for(intj=0;j<8;j++)
{intee=0;Pop(s,ee);
sum_8+=pow(ee*2,local--);
lastlocal=ee;
}if(lastlocal==0)
{tlv[num_8+3-k]=sum_8-1;
}else{
tlv[num_8+3-k]=sum_8;
}}}else
{
intsum=0;intLENGTH=(s.top-s.base)/8;
//tlv.V=newunsignedchar[LENGTH+1];
intfirstlastlocal=0;
for(inti=0;i { inte=0;Pop(s,e); sum+=pow(e*2,length-1-i); firstlastlocal=e; //tlv.V+=pow(Pop(s,e),length-1-i); }tlv[1]=1+LENGTH;//TLV_L len=2+1+LENGTH; if(firstlastlocal==0) {tlv[2]=sum-1;//value }else {tlv[2]=sum;//value}intnum_8_bit=(s.top-s.base)/8; for(intk1=num_8_bit;k1>=1;--k1) { intsum_8_bit=0;intlocal_8=k1*8-1; intlastlocal=0; for(intj=0;j<8;j++) {intee_bit=0;Pop(s,ee_bit); sum_8_bit+=pow(ee_bit*2,local_8--); lastlocal=ee_bit; }if(lastlocal==0) {tlv[num_8_bit+3-k1]=sum_8_bit-1; }else {tlv[num_8_bit+3-k1]=sum_8_bit; }}}}}else {}} 字符型: 比较简单,直接编成asc码就行了。 标识符: voidObjectidentifier_TLV(unsignedchar*TLV,int&len,stringvalue) {stringstrdod=".";stringsmallstr;//boolstrover=false; //charstrl[50];intj=0; for(inti=4;i {stringstr=value.substr(i,1);//value.c_str() if(! strcmp(str.c_str(),strdod.c_str()))// {//strover=true; continue; }//compare(value.substr(i,1) else{//if(strover) smallstr+=str; }}unsignedchar*tlv; tlv=TLV; tlv[0]=OBER;//1.3.6.1.0TLV_T tlv[1]=1+smallstr.length();//TLV_l len=2+1+smallstr.length(); tlv[2]=43;//+smallstr;TLV_V for(intl=0;l {tlv[l+3]=atoi(smallstr.substr(l,1).c_str());// }} Ip地址: 与标识符类似,只要把各部分分离出来编码即可。 举个编码的例子如下: Snmpversion=1 Comminutiy=public Command=getrequest RequestID=8 Errorstatus=0(noerror) Errorindex=0 Object={1.3.6.1.2.1.1.1.0}(sysDesor.0) Value=null 编成: 4840210461121179810810599160272182102104814481068436121 11050 解码过程是编码过程的逆过程,相对而言,要简单一点。 因为在编码时,我们编成一个个字节形式,除了字符型用asc码编码,其他都表示成十进制数的形式 2.2报文构造和解析 整个报文的结构如下图,构造报文时,我们依据提示分别输入各个部分的数据,然后编码发送,报文构造即算完成。 报文的解析又是构造的逆过程,即分离出报文的各个部分,以便解码。 对应上面编码的例子,我们对其编码进行解析如下图: 注: 此处用十六进制,具体实现时,我们编成十进制,便于直接察看。 其中,围在方框内的是Tag字节,标有下划线的是长度字节,圆框里的是value部分编码。 2.3socket通信与输入输出 利用socket即套接字建立通信,发送编码好的报文给网关。 主要是以下的三个函数。 boolInitWinsock();voidCennect();voidWaitTrap(); 至于输入输出,我们由于时间关系,没有能做出界面,虽然没有界面,对用户的操作带来不便,但是,我们每一步的操作都给了提示,操作还是很容易上手的。 4.设计结果 程序运行结果如下图: 我们实现了可以一次输入多个变量名,然后返回多个value的值。 并对其解析。 我们把构造的报文发向网关172.30.15.1,然后还可以自己自定义访问权限。 Public,private等。 抓包截图如下: 我们实现了,getRequest,getnextRequest,setRequest及manager收到的报文,trap报文很遗憾没有实现。 以下抓包抓的是set报文,为了方便起见,因为只是调试,我们把value字段的值定为25。 5.评价和总结 经过三天时间的紧张设计,熬了两个通宵,小组成员齐心协力,终于比较圆满的完成了课程设计的任务,实现了主要功能。 测试时,我们向网关发送报文,能收到其回应的报文并对其进行解析。 由于时间的原因,设计上还存在缺陷,没有完成其全部功能,有些遗憾,对于报文的解析,特别是对超过一个字节的整数编码的解析还存在一些小问题。 总的说来,完成情况良好,整个过程中,收获颇丰。 不仅重新学习了被遗忘的c语言,团队分工协作的能力,吃苦耐劳的精神都有提升。 6参考文献 《vc++——开发基于snmp的网络管理软件》武孟军徐袭任相臣编著人民邮电出版社2007年1月 《网络管理(第2版)》郭军编著北京邮电大学出版社2003年9月 附录: 主要程序代码 报文构造代码如下: voidBindSequenceOf_TLV(unsignedchar*return_tlv_bind,int&return_tlv_bind_len,messageMSG)//namevaluenamevalue {for(inti=0;i<6;i++)// {//getreturn_tlv_bind unsignedcharreturn_tlv[50];intreturn_tlv_len=0; unsignedchartlv_name[10];inttlv_name_len=0; unsignedchartlv_value[10];inttlv_value_len=0;//for if(MSG.pdu.variable_bindings[i].name.length()==0)continue; else {Objectidentifier_TLV(tlv_name,tlv_name_len,MSG.pdu.variable_bindings[i].name); Sequence_TLV(return_tlv,return_tlv_len,tlv_name,tlv_name_len); if(MSG.pdu.pdutype==2)//SET_REQUEST {Null_TLV(tlv_value,tlv_value_len,25); }else {Null_TLV(tlv_value,tlv_value_len,-1); }//((*(MSG.pdu.variable_bindings+i)).name); 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); }}} voidPduSequence_TLV(unsignedchar*return_tlv_Pdu,int&return_tlv_Pdu_len,messageMSG)//pdutypeid00bind//,TLV&return_tlv_bind {switch(MSG.pdu.pdutype) {case0: return_tlv_Pdu[0]=160;break;//A0H"10100000"request case1: return_tlv_Pdu[0]=161;break;//A1H"10100001"next_request case2: return_tlv_Pdu[0]=163;break;//A3H"10100011"set_request case3: return_tlv_Pdu[0]=162;break;//A2H"10100010"response case4: return_tlv_Pdu[0]=164;break;//A4H"10100100" default: break; } unsignedcharTLV_request_id[5];intTLV_request_id_len=0; unsignedcharTLV_error_status[5];intTLV_error_status_len=0; unsignedcharTLV_error_index[5];intTLV_error_index_len=0; Integer_TLV(TLV_request_id,TLV_request_id_len,MSG.pdu.request_id);Pdu_Sequence_TLV(return_tlv_Pdu,return_tlv_Pdu_len,TLV_request_id,TLV_request_id_len);Integer_TLV(TLV_error_status,TLV_error_status_len,MSG.pdu.error_status);//error_status;Pdu_Sequence_TLV(return_tlv_Pdu,return_tlv_Pdu_len,TLV_error_status,TLV_error_status_len);Integer_TLV(TLV_error_index,TLV_error_index_len,MSG.pdu.error_index);//error_index;Pdu_Sequence_TLV(return_tlv_Pdu,return_tlv_Pdu_len,TLV_error_index,TLV_error_index_len); unsignedcharreturn_tlv_bind[50];intreturn_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); }voidMessSequence_TLV(unsignedchar*return_tlv_message,int&return_tlv_message_len,messageMSG)//versioncommunitysnmppdu,TLV&return_tlv_Pdu {unsignedcharTLV_version[10];intTLV_version_len=0; unsignedcharTLV_community[10];intTLV_community_len=0; Integer_TLV(TLV_version,TLV_version_len,MSG.version);//versionSequence_TLV(return_tlv_message,return_tlv_message_len,TLV_version,TLV_version_len);OctetString_TLV(TLV_community,TLV_community_len,MSG.community);//communitySequence_TLV(return_tlv_message,return_tlv_message_len,TLV_community,TLV_community_len);unsignedcharreturn_tlv_Pdu[150];intreturn_tlv_Pdu_len=0; PduSequence_TLV(return_tlv_Pdu,return_tlv_Pdu_len,MSG);//PDUspdu;Sequence_TLV(return_tlv_message,return_tlv_message_len,return_tlv_Pdu,return_tlv_Pdu_len); }voidcreatemessage(char*Buffer,char*pdutype,int&leng_buffer) {usingstd: : cout; usingstd: : cin; usingstd: : endl; unsignedcharreturn_tlv_message[300]; intreturn_tlv_message_len=0; messageMSG; inti=0; MSG.pdu.pdutype=atoi(pdutype); cout<<"chooseinputthecommunity"< cin>>MSG.community; cout<<"chooseinputthename,maxsize: 6"< MSG.pdu.variable_bindings=newstructvarBind[6]; stringinput;//forinput cin>>input; while(input! ="send") {MSG.pdu.variable_bindings[i++].name=input; cin>>input; }MSG.version=0; //MSG.community="public"; MSG.pdu.error_index=0; MSG.pdu.error_status=0; MSG.pdu.request_id=abs(rand());//90...32767 MessSequence_TLV(return_tlv_message,return_tlv_message_len,MSG); leng_buffer=return_tlv_message_len; for(intl=0;l {cout<<(int)return_tlv_message[l]<<""; Buffer[l]=return_tlv_message[l];//(int) //cout<<(int)Buffer[l]<<""; }cout< 解析和解码代码如下: voidstrcpyTLV(chartemp_INTEGER[],charget_pdu[],intk,intlen)//字符串拷贝,拷贝value部分 {intbegin=k; for(intp=0;p {temp_INTEGER[p]=get_pdu[begin++]; }temp_INTEGER[len]=0; }voidprinout(chartemp_INTEGER[],boolchange_line)//输出整数value部分 {if(change_line) {std: : cout<<(int)temp_INTEGER[0]< }elsestd: : cout<<(int)temp_INTEGER[0];} voidprintout_OBJE(chartemp_name[],intlen)//输出标识符 {std: : cout<<"1.3.";inti=1;while(i {std: : cout<<(int)temp_name[i++]<<"."; }std: : cout< voidDcode_version(chartemp_INTEGER[],intlen)//version解析 {std: : cout<<"version: "< prinout(temp_INTEGER,true);} voidDcode_OCTETSTRING(chartemp_OCTETSTRING[],intlen)//community解析 {std: : cout<<"community: "< voidDcode_PDUTYPE(intTlv_T)//pdutype解析 {std: : cout<<"pdutype: "< voidDcode_resid(chartemp_INTEGER[],intlen)//requestid解析 {for(intg=0;g {temp_INTEGER[g]<<=(len-1-g)*8;}intsum=temp_INTEGER[0]; for(inth=1;h {sum|=temp_INTEGER[h]; }std: : cout<<"requestid: "< voidDcode_errorstatus(chartemp_INTEGER[],intlen)//errorstatus解析 {std: : cout<<"errorstatus: "<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 管理 课程设计 BER 解码 报文 构造 解析