snmp包分析

可以测试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`)        |

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值