天天看點

SNMP 封包格式

   SNMP采用的是UDP協定,也是采用C/S模型,不過在SNMP會話中,通常不稱為用戶端,伺服器,而是叫管理程序,代理程序,可以認為管理程序是用戶端,代理程序是伺服器。

   SNMP 規定了 5 種協定資料單元 PDU (也就是 SNMP 封包),用來在管理程序和代理之間的交換。

  • get-request 操作:從代理程序處提取一個或多個參數值。
  • get-next-request 操作:從代理程序處提取緊跟目前參數值的下一個參數值。
  • set-request 操作:設定代理程序的一個或多個參數值。
  • get-response 操作:傳回的一個或多個參數值。這個操作是由代理程序發出的,它是前面三種操作的響應操作。
  • trap 操作:代理程序主動發出的封包,通知管理程序有某些事情發生。

      前面的 3 種操作是由管理程序向代理程序發出的, 後面的 2 個操作是代理程序發給管理程序的, 為了簡化起見, 前面 3 個操作今後叫做 get、 get-next 和 set 操作。 下圖描述了 SNMP的這 5 種封包操作。請注意,在代理程序端是用熟知端口 161 倆接收 get 或 set 封包,而在管理程序端是用熟知端口 162 來接收 trap 封包。

SNMP 封包格式

     下圖是封裝成 UDP 資料報的 5 種操作的 SNMP 封包格式。 可見一個 SNMP 封包共有三個部分組成,即公共 SNMP 首部、get/set 首部 trap 首部、變量綁定。

SNMP 封包格式

(1)公共 SNMP 首部,共三個字段:

  •  版本

寫入版本字段的是版本号減 1,對于 SNMP(即 SNMPV1)則應寫入 0。

  • 共同體(community)

共同體就是一個字元串, 作為管理程序和代理程序之間的明文密碼,常用的是 6 個字元“public” 。

  • PDU 類型

根據 PDU 的類型,填入 0~4 中的一個數字,其對應關系如表 2 所示意圖。

SNMP 封包格式

(2)get/set 首部

  • 請求辨別符(request ID)

這是由管理程序設定的一個整數值。代理程序在發送 get-response 封包時也要傳回此請求辨別符。 管理程序可同時向許多代理發出 get 封包, 這些封包都使用 UDP 傳送, 先發送的有可能後到達。設定了請求辨別符可使管理程序能夠識别傳回的響應封包對于哪一個請求封包。

  • 差錯狀态(error status)

由代理程序回答時填入 0~5 中的一個數字,見表 3 的描述。

SNMP 封包格式
  •  差錯索引(error index)

當出現 noSuchName、badValue 或 readOnly 的差錯時,由代理程序在回答時設定的一個整數,它指明有差錯的變量在變量清單中的偏移。

  (3)trap 首部

  •  企業(enterprise)

填入 trap 封包的網絡裝置的對象辨別符。此對象辨別符肯定是在圖 3 的對象命名樹上的 enterprise 結點{1.3.6.1.4.1}下面的一棵子樹上。

  • trap 類型

此字段正式的名稱是 generic-trap,共分為表 4 中的 7 種。

SNMP 封包格式

 當使用上述類型 2、3、5 時,在封包後面變量部分的第一個變量應辨別響應的接口。

  •  特定代碼(specific-code)

指明代理自定義的時間(若 trap 類型為 6),否則為 0。

  •  時間戳(timestamp)

指明自代理程序初始化到 trap 報告的事件發生所經曆的時間,機關為 10ms。例如時間戳為 1908 表明在代理初始化後 1908ms 發生了該時間。

(4)變量綁定(variable-bindings)

指明一個或多個變量的名和對應的值。在 get 或 get-next 封包中,變量的值應忽略。

SNMP并不采用簡單的二進制格式,上面隻說明了SNMP的封包格式,但并沒有說明字段是如何進行編碼的,實際上SNMP字段編碼還是比較複雜的。不同的字段和值有類型區分,一些字段組合起來構成一種新的類型SEQUENCE,類似于C語言的結構體.采用的編碼規範BER點選打開接,也是需要認真消化了解的。snmp具體如何編碼請看下一篇部落格

繼續閱讀