網(wǎng)絡(luò)管理課程設(shè)計(jì)(BER編解碼,報(bào)文構(gòu)造與解析)_第1頁
網(wǎng)絡(luò)管理課程設(shè)計(jì)(BER編解碼,報(bào)文構(gòu)造與解析)_第2頁
網(wǎng)絡(luò)管理課程設(shè)計(jì)(BER編解碼,報(bào)文構(gòu)造與解析)_第3頁
網(wǎng)絡(luò)管理課程設(shè)計(jì)(BER編解碼,報(bào)文構(gòu)造與解析)_第4頁
網(wǎng)絡(luò)管理課程設(shè)計(jì)(BER編解碼,報(bào)文構(gòu)造與解析)_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、計(jì)算機(jī)網(wǎng)絡(luò)管理課程設(shè)計(jì)引言簡單網(wǎng)絡(luò)管理協(xié)議(SNMP)首先是由Internet工程任務(wù)組織(Internet Engineering Task Force)(IETF)的研究小組為了解決Internet上的路由器管理問題而提出的。 SNMP被設(shè)計(jì)成與協(xié)議無關(guān),所以它可以在IP,IPX,AppleTalk,OSI以及其他用到的傳輸協(xié)議上被使用。它具有簡單性,易于擴(kuò)展性的特點(diǎn)。SNMP是一系列協(xié)議組和規(guī)范(見下表),它們提供了一種從網(wǎng)絡(luò)上的設(shè)備中收集網(wǎng)絡(luò)管理信息的方法。SNMP也為設(shè)備向網(wǎng)絡(luò)管理工作站報(bào)告問題和錯(cuò)誤提供了一種方法。名字說明MIB管理信息庫SMI管理信息的結(jié)構(gòu)和標(biāo)識SNMP簡單網(wǎng)絡(luò)管

2、理協(xié)議從被管理設(shè)備中收集數(shù)據(jù)有兩種方法:一種是只輪詢(polling-only)的方法,另一種是基于中斷(interrupt-based)的方法。Snmp發(fā)展到現(xiàn)在共有三個(gè)版本,本課程設(shè)計(jì)是基于snmpv1版本。2.設(shè)計(jì)任務(wù)及思想2.1任務(wù):設(shè)計(jì)一個(gè)Manager。Manager可以向華為網(wǎng)絡(luò)設(shè)備發(fā)送get和set報(bào)文,并獲得有效操作結(jié)果,實(shí)現(xiàn)版本為SNMPv1.開發(fā)工具:VC+(Win32)內(nèi)容: Socket網(wǎng)絡(luò)通信、 BER編碼、BER解碼、SNMP報(bào)文構(gòu)造、SNMP報(bào)文解析、用戶輸入/輸出。2.2思想:根據(jù)snmp協(xié)議,分析抓包軟件抓出的結(jié)果。Manager在進(jìn)行操作時(shí),先對要發(fā)送的報(bào)

3、文進(jìn)行構(gòu)造,然后對要發(fā)送的報(bào)文各數(shù)據(jù)類型依據(jù)asn.1進(jìn)行編碼再發(fā)送。agent接收到報(bào)文后,進(jìn)行報(bào)文解析,再解碼??磎anager的要求是什么,然后回應(yīng)一個(gè)報(bào)文,即response報(bào)文,manager即對回應(yīng)的報(bào)文進(jìn)行解析解碼,整個(gè)過程由socket通信完成,snmp報(bào)文封裝在udp中發(fā)送。3設(shè)計(jì)過程2.1 BER編碼和解碼Ber編碼是整個(gè)設(shè)計(jì)過程中的極為重要的部分,一個(gè)報(bào)文有很多段組成,每段的數(shù)據(jù)類型都不盡相同。對每一種數(shù)據(jù)類型都要進(jìn)行編碼,即編成tlv。計(jì)算機(jī)只認(rèn)識0和1;在編碼時(shí),我們考慮把它編成一個(gè)字節(jié)一個(gè)字節(jié)的形式發(fā)送,便于解析處理。下面列出常用的幾種數(shù)據(jù)類型的編碼以及代碼:整型:

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碼就行了。標(biāo)識符: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地址:與標(biāo)識符類似,只要把各部分分離出來編碼即可。舉個(gè)編碼的例子如下: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解碼過程是編碼過程的逆過程,相對而言,要簡單一點(diǎn)。因?yàn)樵诰幋a時(shí),我們編成一個(gè)個(gè)字節(jié)形式,除了字符型用asc碼編碼,其他都表示成十進(jìn)制數(shù)的形式2.2報(bào)文構(gòu)造和解析

10、 整個(gè)報(bào)文的結(jié)構(gòu)如下圖,構(gòu)造報(bào)文時(shí),我們依據(jù)提示分別輸入各個(gè)部分的數(shù)據(jù),然后編碼發(fā)送,報(bào)文構(gòu)造即算完成。報(bào)文的解析又是構(gòu)造的逆過程,即分離出報(bào)文的各個(gè)部分,以便解碼。對應(yīng)上面編碼的例子,我們對其編碼進(jìn)行解析如下圖:注:此處用十六進(jìn)制,具體實(shí)現(xiàn)時(shí),我們編成十進(jìn)制,便于直接察看。其中,圍在方框內(nèi)的是Tag字節(jié),標(biāo)有下劃線的是長度字節(jié),圓框里的是value部分編碼。2.3socket通信與輸入輸出利用即套接字建立通信,發(fā)送編碼好的報(bào)文給網(wǎng)關(guān)。主要是以下的三個(gè)函數(shù)。bool InitWinsock();void Cennect();void WaitTrap();至于輸入輸出,我們由于時(shí)間關(guān)系,沒有能

11、做出界面,雖然沒有界面,對用戶的操作帶來不便,但是,我們每一步的操作都給了提示,操作還是很容易上手的。 4.設(shè)計(jì)結(jié)果程序運(yùn)行結(jié)果如下圖:我們實(shí)現(xiàn)了可以一次輸入多個(gè)變量名,然后返回多個(gè)value的值。并對其解析。Public ,private 等。抓包截圖如下:我們實(shí)現(xiàn)了,getRequest,getnextRequest,setRequest 及manager收到的報(bào)文,trap報(bào)文很遺憾沒有實(shí)現(xiàn)。以下抓包抓的是set報(bào)文,為了方便起見,因?yàn)橹皇钦{(diào)試,我們把value字段的值定為25。5.評價(jià)和總結(jié)經(jīng)過三天時(shí)間的緊張?jiān)O(shè)計(jì),熬了兩個(gè)通宵,小組成員齊心協(xié)力,終于比較圓滿的完成了課程設(shè)計(jì)的任務(wù),實(shí)現(xiàn)

12、了主要功能。測試時(shí),我們向網(wǎng)關(guān)發(fā)送報(bào)文,能收到其回應(yīng)的報(bào)文并對其進(jìn)行解析。由于時(shí)間的原因,設(shè)計(jì)上還存在缺陷,沒有完成其全部功能,有些遺憾,對于報(bào)文的解析,特別是對超過一個(gè)字節(jié)的整數(shù)編碼的解析還存在一些小問題??偟恼f來,完成情況良好,整個(gè)過程中,收獲頗豐。不僅重新學(xué)習(xí)了被遺忘的c語言,團(tuán)隊(duì)分工協(xié)作的能力,吃苦耐勞的精神都有提升。6參考文獻(xiàn)vc+開發(fā)基于snmp的網(wǎng)絡(luò)管理軟件武孟軍 徐襲 任相臣編著 人民郵電出版社 2007年1月網(wǎng)絡(luò)管理(第2版)郭軍編著 北京郵電大學(xué)出版社 2003年9月 附錄:主要程序代碼報(bào)文構(gòu)造代碼如下: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)/輸出整數(shù)value部分

23、if(change_line)std:cout(int)temp_INTEGER0endl;else std:cout(int)temp_INTEGER0; void printout_OBJE( char temp_name,int len)/輸出標(biāo)識符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)/標(biāo)識符解析 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)/主函數(shù)

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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論