C++解析SNMPメッセージ——疑似コード実装

2811 ワード

参考クリックでリンクを開く
名前の説明
SNMP——簡単なネットワーク管理プロトコル;
MIB-管理リポジトリ.管理されているリソースは、管理されているオブジェクトと呼ばれるオブジェクトとして表示されます.MIBは管理対象オブジェクトの集合である.管理対象オブジェクトの一連のプロパティを定義します.オブジェクトの名前、オブジェクトのアクセス権、オブジェクトのデータ型などです.
SMI-SNMPフレームワークで使用される情報の組織、構成、識別を定義する情報構造を管理し、MIBオブジェクトを記述し、プロトコルがどのように情報を交換するかを記述するための基礎を築いた.
SMIのデータ型:Integer,octet string,OBJECT IDENTIFIER,SEQUENCE,IpAddress,counter,Gauge,time ticks.
MIBオブジェクトの例
SNMPメッセージ
説明:0 x 2は整数、0 x 4はoct stringタイプ、0 x 30はsequenceタイプ、0 x 6はtrap oidタイプを表します.
解析プロセス
  • udpデータ受信:
  • len=recv(buf,...)
  • 解析メッセージ長:
  • ptr=buf;
    extract_header(ptr,len,0x30,&msg_len,byte_count);
    ptr+=byte_count;
  • 解析バージョン番号:
  • if(ptr[0] != ox2)
    return "         ";
    extract_version(ptr,len,&val,byte_count);
    ptr+=byte_count;
  • 解析共同体:
  • if(ptr[0] != 0x4)
    retrun "         ";
    extract_octstring(ptr,...,byte_count);
    ptr+=byte_count;
  • 解析pduタイプ、例えばシャープなpduが0 xa 7:
  • if(ptr[0] != 0xa7)
    return "         ";
    extract_pdutype(ptr,...,byte_count);
    ptr+=byte_count;
  • 解析request id:
  • if(ptr[0] != ox2)
    return "         ";
    extract_request_id(ptr,...,byte_count);
    ptr+=byte_count;
  • 解析状態コード、整数型:
  • if(ptr[0] != ox2)
    return "         ";
    extract_error_status(ptr,...,byte_count);
    ptr+byte_count;
  • 解析エラーインデックス:
  • if(ptr[0] != ox2)
    return "         ";
    extract_error_index(ptr,...,byte_count);
    ptr+=byte_count;
  • 解析variable binding:
  • if(ptr[0] != 0x30)
    return "         ";
    extract_variable_binding(ptr,...,byte_count);
    ptr+=byte_count;
  • 解析系更新時間フィールド:
  • if(ptr[0] != 0x30)
    return "         ";
    extract_update_time(ptr,...,&seq_len,byte_count);
    ptr+=byte_count;
    ptr+=seq_len;
  • 解析trap oid長さ:
  • if(ptr[0] != 0x30)
    return "         ";
    extract_trap_oidlen(ptr,...,&seq_len,byte_count);
    ptr+=byte_count;
    ptr+=seq_len;
  • 具体的なoidのkey-value値を解析し、ここで解析するのはすべて企業プライベートプロトコルであり、企業ドキュメントに従って対応するタイプを解析すればよい.例えばoct stringのmacアドレスを解析する:
  • 解析mac keyの変長フィールド:
  • if(ptr[0] != 0x30)
    return "         ";
    extract_mac_ken_len(ptr,...,&seq_len,byte_count);
    ptr+=byte_count;
    ptr+=seq_len;
  • 解析macのoid:
  • if(ptr[0] != ox6)
    return "         ";
    extract_mac_oid_len(ptr,...,&seq_len,byte_count);
    ptr+=byte_count;
    ptr+=seq_len;
  • oct stringタイプのmacアドレスを取得:
  • if(ptr[0] != 0x4)
    retrun "         ";
    extract_mac_oid_value(ptr,...,&mac_len,byte_count);

    これでmacアドレスの解析に成功し,他の企業oidフィールドの解析も同様である.