




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、計算機網(wǎng)絡(luò)管理課程設(shè)計引言簡單網(wǎng)絡(luò)管理協(xié)議(SNMP)首先是由Internet工程任務(wù)組織(Internet Engineering Task Force)(IETF)的研究小組為了解決Internet上的路由器管理問題而提出的。 SNMP被設(shè)計成與協(xié)議無關(guān),所以它可以在IP,IPX,AppleTalk,OSI以及其他用到的傳輸協(xié)議上被使用。它具有簡單性,易于擴展性的特點。SNMP是一系列協(xié)議組和規(guī)范(見下表),它們提供了一種從網(wǎng)絡(luò)上的設(shè)備中收集網(wǎng)絡(luò)管理信息的方法。SNMP也為設(shè)備向網(wǎng)絡(luò)管理工作站報告問題和錯誤提供了一種方法。名字說明MIB管理信息庫SMI管理信息的結(jié)構(gòu)和標識SNMP簡單網(wǎng)絡(luò)管
2、理協(xié)議從被管理設(shè)備中收集數(shù)據(jù)有兩種方法:一種是只輪詢(polling-only)的方法,另一種是基于中斷(interrupt-based)的方法。Snmp發(fā)展到現(xiàn)在共有三個版本,本課程設(shè)計是基于snmpv1版本。2.設(shè)計任務(wù)及思想2.1任務(wù):設(shè)計一個Manager。Manager可以向華為網(wǎng)絡(luò)設(shè)備發(fā)送get和set報文,并獲得有效操作結(jié)果,實現(xiàn)版本為SNMPv1.開發(fā)工具:VC+(Win32)內(nèi)容: Socket網(wǎng)絡(luò)通信、 BER編碼、BER解碼、SNMP報文構(gòu)造、SNMP報文解析、用戶輸入/輸出。2.2思想:根據(jù)snmp協(xié)議,分析抓包軟件抓出的結(jié)果。Manager在進行操作時,先對要發(fā)送的報
3、文進行構(gòu)造,然后對要發(fā)送的報文各數(shù)據(jù)類型依據(jù)asn.1進行編碼再發(fā)送。agent接收到報文后,進行報文解析,再解碼。看manager的要求是什么,然后回應(yīng)一個報文,即response報文,manager即對回應(yīng)的報文進行解析解碼,整個過程由socket通信完成,snmp報文封裝在udp中發(fā)送。3設(shè)計過程2.1 BER編碼和解碼Ber編碼是整個設(shè)計過程中的極為重要的部分,一個報文有很多段組成,每段的數(shù)據(jù)類型都不盡相同。對每一種數(shù)據(jù)類型都要進行編碼,即編成tlv。計算機只認識0和1;在編碼時,我們考慮把它編成一個字節(jié)一個字節(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碼就行了。標識符: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解碼過程是編碼過程的逆過程,相對而言,要簡單一點。因為在編碼時,我們編成一個個字節(jié)形式,除了字符型用asc碼編碼,其他都表示成十進制數(shù)的形式2.2報文構(gòu)造和解析
10、 整個報文的結(jié)構(gòu)如下圖,構(gòu)造報文時,我們依據(jù)提示分別輸入各個部分的數(shù)據(jù),然后編碼發(fā)送,報文構(gòu)造即算完成。報文的解析又是構(gòu)造的逆過程,即分離出報文的各個部分,以便解碼。對應(yīng)上面編碼的例子,我們對其編碼進行解析如下圖:注:此處用十六進制,具體實現(xiàn)時,我們編成十進制,便于直接察看。其中,圍在方框內(nèi)的是Tag字節(jié),標有下劃線的是長度字節(jié),圓框里的是value部分編碼。2.3socket通信與輸入輸出利用即套接字建立通信,發(fā)送編碼好的報文給網(wǎng)關(guān)。主要是以下的三個函數(shù)。bool InitWinsock();void Cennect();void WaitTrap();至于輸入輸出,我們由于時間關(guān)系,沒有能
11、做出界面,雖然沒有界面,對用戶的操作帶來不便,但是,我們每一步的操作都給了提示,操作還是很容易上手的。 4.設(shè)計結(jié)果程序運行結(jié)果如下圖:我們實現(xiàn)了可以一次輸入多個變量名,然后返回多個value的值。并對其解析。Public ,private 等。抓包截圖如下:我們實現(xiàn)了,getRequest,getnextRequest,setRequest 及manager收到的報文,trap報文很遺憾沒有實現(xiàn)。以下抓包抓的是set報文,為了方便起見,因為只是調(diào)試,我們把value字段的值定為25。5.評價和總結(jié)經(jīng)過三天時間的緊張設(shè)計,熬了兩個通宵,小組成員齊心協(xié)力,終于比較圓滿的完成了課程設(shè)計的任務(wù),實現(xiàn)
12、了主要功能。測試時,我們向網(wǎng)關(guān)發(fā)送報文,能收到其回應(yīng)的報文并對其進行解析。由于時間的原因,設(shè)計上還存在缺陷,沒有完成其全部功能,有些遺憾,對于報文的解析,特別是對超過一個字節(jié)的整數(shù)編碼的解析還存在一些小問題。總的說來,完成情況良好,整個過程中,收獲頗豐。不僅重新學習了被遺忘的c語言,團隊分工協(xié)作的能力,吃苦耐勞的精神都有提升。6參考文獻vc+開發(fā)基于snmp的網(wǎng)絡(luò)管理軟件武孟軍 徐襲 任相臣編著 人民郵電出版社 2007年1月網(wǎng)絡(luò)管理(第2版)郭軍編著 北京郵電大學出版社 2003年9月 附錄:主要程序代碼報文構(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)/輸出標識符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)/主函數(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)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版商鋪出租簡單合同書范例
- 聘用導演合同范例二零二五年
- 二零二五擔保業(yè)務(wù)專題要點.x
- 2025至2030全球與中國坍落度筒行業(yè)需求規(guī)模及發(fā)展態(tài)勢研究報告
- 區(qū)塊鏈技術(shù)入門打造企業(yè)新未來
- 公共衛(wèi)生管理中的數(shù)據(jù)驅(qū)動決策流程
- 全科醫(yī)生治療范圍
- 區(qū)塊鏈在醫(yī)療信息保護中的應(yīng)用探討
- 區(qū)塊鏈在環(huán)保領(lǐng)域的應(yīng)用與挑戰(zhàn)
- 中學教師述職報告開頭(6篇)
- 中華民族節(jié)日文化知到課后答案智慧樹章節(jié)測試答案2025年春云南大學
- 《政府采購管理研究的國內(nèi)外文獻綜述》5500字
- 糖尿病護理查房提出問題
- 回收設(shè)施布局與優(yōu)化-深度研究
- 2024年國網(wǎng)浙江省電力有限公司招聘考試真題
- 微專題2 質(zhì)量守恒定律的應(yīng)用(解析版)
- 分析化學考試題(附參考答案)
- 森林無人機滅火技術(shù)集成-深度研究
- 股份轉(zhuǎn)讓協(xié)議模板
- 利他思維培訓課件
- 2025年北京鐵路局集團招聘筆試參考題庫含答案解析
評論
0/150
提交評論