(轉)SNMP

SNMP目的:提供了統一的、跨平臺的設備管理;
SNMP管理的設備包括:主機,路由器、交換機、打印機、HUB等

基於TCP/IP的網絡管理包含3個組成部分:
SNMP協議: manager和管理代理之間的通信協議、大多采用UDP
MIB:即管理信息庫,就是所有代理進程包含的、並且能夠被管理進程進行查詢和設置的信息的集合。
SMI:即管理信息結構,對MIB進行規範的標準,比如定義MIB中的變量類型、格式等;功能和作用:給對象命名;定義可在對象中存儲的數據類型;給出如何對在網絡上傳輸的數據進行編碼的方法



1.SNMP協議
SNMP的五種消息類型
SNMPv1中定義了五種消息類型:Get-Request、Get-Response、Get-Next-Request、Set-Request、Trap。
1) get-request操作:從代理進程處提取一個或多個參數值。
2) get-next-request操作:從代理進程處提取一個或多個參數的下一個參數值;
3) set-request操作:設置代理進程的一個或多個參數值。
4) get-response操作:返回的一個或多個參數值。這個操作是由代理進程發出的。它是前面3中操作的響應操作。
5) trap 操作:代理進程主動發出的報文,通知管理進程有某些事情發生。


SNMPv2增加了報文格式:
1).GETBULK REQUEST - a faster iterator used to retrieve sequences of management information.
2).INFORM - similar to a TRAP but the receiver must respond with an acknowledgement RESPONSE message.
3).REPORT - definable by an administrative framework.

SNMP管理站用Get-Request消息從擁有SNMP代理的網絡設備中檢索信息,而SNMP代理則用Get-Response消息響應。Get-Next-Request用於和Get-Request組合起來查詢特定的表對象中的列元素。SNMP管理站用Set-Request 可以對網絡設備進行遠程配置(包括設備名、設備屬性、刪除設備或使某一個設備屬性有效/無效等)。SNMP代理使用Trap向SNMP管理站主要發送報告消息,一般用於描述某一事件的發生,比如接口故障(網線斷開),重啓動等。

SNMPv2報文格式如下:


2.MIB
包含管理設備及其管理對象的樹型結構的信息庫。每個SNMP agent都有自己的MIB;管理站有一個全局MIB。MIB對象被劃分爲若干個組,如,system,interface,address、address translation,IP,ICMP,TCP,UDP,EGP 等。

當對MIB變量進行操作,如查詢和設置變量的值時,必須對M I B的每個變量進行標識。每個被管對象都必須有一個全局對象標識符;所有對象標識符在全局上構成一棵對象標識符樹;所有SNMP被管對象的標識符以1.3.6.1.2.1開始,即iso.org.dod.internet.mgmt.mib。如下實例:


注:只有葉子結點是可操作的


3.SMI
SMI使用了ASN.1的基本定義,並且新增了幾個ASN.1中沒有的類型。SMI包括兩個簡單與結構兩種數據類型,其中,簡單數據類型7種(前3種爲ANS.1定義,後4種爲新增),結構數據類型2種。簡單數據類型有整形,串,IP地址,計數類型,等;結構化類型是簡單類型的組合,一種以類似struct形式的不同簡單類型組合,稱爲sequence;一類是sequence of,類似array形式,相同類型組合。編碼的時候採用BER編碼法: 每一個數據塊被編碼成三元組(標記、長度、值)。


1993年發佈了SNMPv2,擴充:
1) 在SNMPv2中定義了一個新的分組類型get-bulk-request,它高效率地從代理進程讀取大塊數據。
2) 另的一個新的分組類型是inform-request,它使一個管理進程可以向另一個管理進程發送信息。
3) 定義了兩個新的MIB,它們是:SNMPv2 MIB和SNMPv2-M2M MIB(管理進程到管理進程的MIB)。
4) SNMPv2的安全性比SNMPv1大有提高。在SNMPv1中,從管理進程到代理進程的共同體名稱是以明文方式傳送的。而SNMPv2可以提供鑑別和加密。


RFC 2271定義的SNMPv3體系結構,體現了模塊化的設計思想,可以簡單地實現功能的增加和修改。其特點:
1) 適應性強:適用於多種操作環境,既可以管理最簡單的網絡,實現基本的管理功能,又能夠提供強大的網絡管理功能,滿足複雜網絡的管理需求
2) 擴充性好:可以根據需要增加模塊
3) 安全性好:具有多種安全處理模塊
與SNMPv1和SNMPv2相比,SNMPv3增加了三個新的安全機制:身份驗證,加密和訪問控制。



除SNMP外,OSI還定義了一種網絡管理協議CMIP。其命運與OSI模型一樣。



http://www.anheng.com.cn/news/2926.html
http://en.wikipedia.org/wiki/Simple_Network_Management_Protocol
http://www.cnpaf.net/class/SNMP/
http://net-snmp.cn/


寫完了瀏覽了一下四年前(嚴格來說是三年半)寫的超簡單的SNMP報文封裝與解析程序,發現自己在c語言功底還是不錯,竟然到處都在用指針,許多地方還用了位運算,有點意外。而印象中那時候對指針的認識並非特別的深刻,而且還存在許多誤區。現在覺得自己對c語言認識還比較深刻,也許,再過段時間,又會發現現在的認識是比較膚淺的了。希望這樣子~~是個好事情,說明認識在上升,自己在進步。

感覺以前的這些代碼有幾個地方做的非常不好:

1.抽象:完全沒有抽象的;像通過標記,長度和數據值生成網絡傳輸的數據項時,其過程都是一致的,可以放到一個函數裏面去,而我寫了多個極爲類似的函數來完成;造成重複代碼與重複流程;

2.可讀性:有一些注意了,但還不是很好;

3.代碼風格:感覺有點亂;而且一個函數寫的很長;

4.出錯處理:啊。。好像沒看到出錯處理;

char *oid_construct(char *buffer,int length,int *value)
{
char *curptr=(char *)buffer;
(*curptr)=(char)OBJECTIDENTIFIER;
curptr++;
(*curptr)=(char)length;
curptr++;
for(int i=0;i<length;i++)
(*(curptr+i))=(char)*(value+i);

return curptr;
}

void decode_PDU(char *pdu)
{
char *curptr=pdu;
int pdu_len;

curptr++;//第一字節:sequence,略過

if((*curptr&0x80)!=0) //length
{
//長度超過一個字節,目前暫無法處理
printf("Infomation:Now cannot deal with the PDU that length field over 1 Byte.\n\n");
exit(0);
}
else
pdu_len=*curptr;
printf("PDU Length:%d.\n",pdu_len);

curptr+=2;

int ver=*curptr;
printf("Version:%d\n",ver); //version information
curptr+=3;

int community_len=*curptr++;
printf("Community:");
for(int i=0;i<community_len;i++)
printf("%c",*curptr++); //community

char pdu_type=*curptr;
printf("\nPDU Type:SNMP Response packet.\n");

curptr+=2; //ignore the length after the type information
curptr++;

int id_len=*curptr++;
printf("ID:");
for(int j=0;j<id_len;j++)
printf("%x",*curptr++); //id

curptr++;

int error_status_len=*curptr++;
printf("\nError status:");
for(int k=0;k<error_status_len;k++)
printf("%x",*curptr++); //error status

curptr++;

int error_index_len=*curptr++;
printf("\nError index:");
for(int l=0;l<error_index_len;l++)
printf("%x",*curptr++); //error index

curptr++;

int var_bindings_len=*curptr++; //variable bindings headers

curptr++; //variable bindings length

curptr+=2;

int name_len=*curptr++; //name length

printf("\nName:1.3"); //name :oid
curptr++;
for(int m=1;m<name_len;m++)
{
printf(".%x",*curptr++);
}
curptr++;

int value_len=*curptr++; //value length
printf("\nValue:");
for(int n=0;n<value_len;n++)
{
printf("%c",*curptr++);
}
printf("\nPacket has been parsed completely.");
}

轉自:http://kofsky.iteye.com/blog/283235
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章