可以测试snmp后 我们就可以抓包看看snmp包的结构 下面是一个Get-Next-Request包
NMP 使用 **ASN.1(抽象语法标记)** 和 **BER(基本编码规则)** 定义数据类型。每个字段由 **类型(Type)**、**长度(Length)** 和 **值(Value)** 三部分组成。以下是常见的类型及其对应的编码值:
#### **(1) 通用类型(Universal Types)**
| 类型标识符(十六进制) | 类型名称 | 说明 |
|------------------------|--------------------|----------------------------------------------------------------------|
| `0x02` | INTEGER | 有符号整数,范围为 -2,147,483,648 到 2,147,483,647。 |
| `0x04` | OCTET STRING | 字节字符串,通常用于存储文本或二进制数据(如社区名 `public`)。 |
| `0x06` | OBJECT IDENTIFIER | 对象标识符(OID),表示 MIB 树中的节点(如 `.1.3.6.1.2.1.1.1`)。 |
| `0x05` | NULL | 空值,表示无数据。 |
#### **(2) 通用结构类型(Constructed Types)**
| 类型标识符(十六进制) | 类型名称 | 说明 |
|------------------------|--------------------|----------------------------------------------------------------------|
| `0x30` | SEQUENCE | 用于封装复杂结构(如整个 SNMP 报文或变量绑定列表)。 |
| `0x31` | SEQUENCE OF | 用于表格或列表结构(如多个变量绑定项)。 |
#### **(3) 应用类型(Application-Specific Types)**
| 类型标识符(十六进制) | 类型名称 | 说明 |
|------------------------|------------------|----------------------------------------------------------------------|
| `0x40` | IpAddress | 32 位 IP 地址(4 字节),网络字节序。 |
| `0x41` | Counter | 32 位计数器(从 0 递增至最大值后归零,最大值为 4,294,967,295)。 |
| `0x42` | Gauge | 32 位非负整数,可增减但不会超过最大值(2^32 - 1)。 |
| `0x43` | TimeTicks | 以 0.01 秒为单位的时间戳(如 `sysUpTime`)。 |
| `0x44` | Opaque | 任意编码格式的数据(如浮点数或私有数据)。 |
| `0x46` | Counter64(SNMPv2)| 64 位计数器(SNMPv2 新增,解决 32 位计数器溢出问题)。 |
---
### **2. PDU 操作类型(SNMP 操作码)**
SNMP 报文中包含 **PDU(Protocol Data Unit)类型**,用于标识请求或响应的操作。不同版本(如 SNMPv1/SNMPv2c)支持的 PDU 类型略有差异。
#### **(1) SNMPv1 PDU 类型**
| 操作码(十进制) | PDU 类型 | 说明 |
|------------------|---------------------|----------------------------------------------------------------------|
| 0 | GetRequest | 从代理获取一个或多个变量的值。 |
| 1 | GetNextRequest | 获取字典序中下一个变量的值(用于遍历 MIB 树)。 |
| 2 | GetResponse | 代理返回 Get/Set 请求的响应。 |
| 3 | SetRequest | 设置代理的一个或多个变量的值。 |
| 4 | Trap | 代理主动发送的告警信息(无需确认)。 |
#### **(2) SNMPv2c PDU 类型**
| 操作码(十进制) | PDU 类型 | 说明 |
|------------------|---------------------|----------------------------------------------------------------------|
| 0 | GetRequest | 同 SNMPv1。 |
| 1 | GetNextRequest | 同 SNMPv1。 |
| 2 | GetResponse | 同 SNMPv1。 |
| 3 | SetRequest | 同 SNMPv1。 |
| 4 | Trap | 同 SNMPv1,但 SNMPv2c 的 Trap 格式更丰富。 |
| 5 | GetBulkRequest | 批量获取数据(SNMPv2c 新增,解决 GetNextRequest 效率问题)。 |
| 6 | InformRequest | 代理主动发送的告警信息,并要求 NMS 确认(SNMPv2c 新增)。 |
### **3. 错误状态码(Error Status)**
在 SNMP 报文中,**GetResponse** 或 **SetRequest** 可能返回错误状态码:
| 错误码(十进制) | 错误名称 | 说明 |
|------------------|------------------|----------------------------------------------------------------------|
| 0 | noError | 操作成功。 |
| 1 | tooBig | 响应数据过大,无法装入一个 SNMP 报文。 |
| 2 | noSuchName | 请求的变量不存在。 |
| 3 | badValue | Set 操作的值无效或语法错误。 |
| 4 | readOnly | 尝试修改只读变量。 |
| 5 | genErr | 其他未分类的错误。 |
---
### **4. Trap 类型(SNMPv1)**
| Trap 类型(十进制) | 名称 | 说明 |
|---------------------|------------------|----------------------------------------------------------------------|
| 0 | coldStart | 设备冷启动(配置可能变化)。 |
| 1 | warmStart | 设备热启动(配置未变化)。 |
| 2 | linkDown | 接口从工作状态变为故障状态。 |
| 3 | linkUp | 接口从故障状态变为工作状态。 |
| 4 | authenticationFailure | 收到无效社区名的 SNMP 报文。 |
| 5 | egpNeighborLoss | EGP 邻居丢失(已过时)。 |
| 6 | enterpriseSpecific | 自定义企业 Trap(需配合 enterprise 字段)。 |
---
这里有一点需要注意的是
在 SNMP 报文中,**PDU 类型** 的标识符(`Type` 字段)由 **上下文特定类(Context-Specific Class)** 和 **标签号(Tag Number)** 共同决定。以下是针对 `A1 1A` 的具体分析:
---
### **1. BER 编码的 Type 字段结构**
- **上下文特定类** 的标识符格式为:
- **高四位**:`10xx`(二进制),表示上下文特定类。
- **低四位**:`0001`(二进制),表示标签号(Tag Number)。
- **示例**:`0xA1`(十六进制)= `1010 0001`(二进制)。
- **高四位 `1010`**:表示上下文特定类(Context-Specific Class)。
- **低四位 `0001`**:表示标签号为 `1`。
---
### **2. SNMPv2c 的 PDU 类型与标签映射**
在 SNMPv2c 中,PDU 类型与上下文特定类的标签号对应如下:
| **PDU 类型** | **标签号** | **Type 字段(十六进制)** |
|--------------------|------------|---------------------------|
| `GetRequest` | 0 | `A0`(`1010 0000`) |
| `GetNextRequest` | 1 | `A1`(`1010 0001`) |
| `GetResponse` | 2 | `A2`(`1010 0010`) |
| `SetRequest` | 3 | `A3`(`1010 0011`) |
| `Trap` | 4 | `A4`(`1010 0100`) |
| `GetBulkRequest` | 5 | `A5`(`1010 0101`) |
| `InformRequest` | 6 | `A6`(`1010 0110`) |