前言

SNMP协议基于UDP,代理软件(服务器)监听161端口,管理端(客户端)监听162端口。

正常请求:管理端发送请求到161端口,代理软件收到请求后将数据返回给管理端源端口。
主动上报:代理软件主动把数据发送管理端的162端口。

SNMP协议中请求数据主要是读和写操作。
每个操作会有一个目标对象,这个对象用OID来表示。
OID是用一串数字表示:比如.1.3.6.1.2.1.1.5表示设备名称。
并且父子节点之间用小数点(.)分隔,形成类似于文件夹的树形结构。


本文主要介绍OID的编码和解码规则。

编码:.1.3.6.1.2.1.1.5在UDP报文中是怎么表达的?

解码:我收到一串UDP报文,如何解析出它的OID值是多少?

设备名称 = .1.3.6.1.2.1.1.5 = 0x2B, 0x06, 0x01, 0x02, 0x01, 0x01, 0x05


编码规则:

最开始的2个数字.1.3是特殊规则,编码固定值:0x2B
其后面的每个OID节点数值都用一个或多个字节来表示。
如果这个值小于128,最简单的情况就用1个字节。
如果大于128则需要用多个字节:
对OID进行128整除,如果商大于128则继续整除,直到商小于128,则记为第1字节。
对余数重复上面的操作,将产生第2,3,4...字节,直到余数小于128,此时的余数记为最后1字节。
最后除了最后1字节外,前面的所有字节都要把最高位置1。

这个规则和UTF-8的编码规则非常像,可以参考UTF-8的编码计算方法

文字表达可能并不容易理解,下面多举几个例子就很容易理解了:

OID:.1.3.6.1.2.1.1.5

HEX:0x2B, 0x06, 0x01, 0x02, 0x01, 0x01, 0x05
所有数字都小于128,每个数字直接用1字节表示。

OID:.1.3.6.1.2.1.255.5

HEX: 0x2B, 0x06, 0x01, 0x02, 0x01, 0x81, 0x7F, 0x05
由于255大于128,需要分解为多个字节:
255 = 128 * 1 + 127(商为1,余数为127,所以用2个字节表示:0x81(高位置1), 0x7F)

OID: .1.3.6.1.2.1.255.99999

HEX: 0x2B, 0x06, 0x01, 0x02, 0x01, 0x81, 0x7F, 0x86, 0x8D, 0x1F
255 = 128 * 1 + 127(0x81, 0x7F)
99999 = 128 * 128 * 6 + 128 * 13 + 31(0x86,0x8D, 0x1F)

OID:.1.3.6.1.2.1.255.99999.4294967295

HEX:0x2B, 0x06, 0x01, 0x02, 0x01, 0x81, 0x7F, 0x86, 0x8D, 0x1F, 0x8F,0xFF,0xFF,0xFF,0x7F
4294967295是32位无符号整数的最大值了,现实中真实的OID最大还没有超过65535。

解码规则:

解码就是编码的反过程。
第1字节0x2B是固定解码为.1.3。
后续每个字节都按下面的规则:
如果当前字节最高位为0,则OID节点就是1字节本身;
如果当前字节最高位为1,则OID节点=低7位乘以128,再加上下一字节的低7位;
如果下一字节最高位还是1,则OID节点再乘128,再加上下一字节的低7位;
直到下一字节最高位为0,结束计算。

还是把上面的例子算一算:
收到的OID原始数据是:0x2B, 0x06, 0x01, 0x02, 0x01, 0x81, 0x7F, 0x86, 0x8D, 0x1F, 0x8F,0xFF,0xFF,0xFF,0x7F

0x2B, 0x06, 0x01, 0x02, 0x01这部分直接解码为:.1.3.6.1.2.1
0x81, 0x7F: 0x01 * 128 + 0x7F = 255
0x86, 0x8D, 0x1F: (0x06 * 128 + 0x0D) * 128 + 0x1F = 99999
0x8F,0xFF,0xFF,0xFF,0x7F:(((0x0F * 128 + 0x7F) * 128 + 0x7F) * 128 + 0x7F) * 128 + 0x7F = 4294967295


以上就是OID的编码和解码计算方法,和UTF8的编解码方法基本一致。

SNMP协议中OID的编码规则相关推荐

  1. HTTP协议中的chunked编码解析

    " HTTP协议中的chunked传输编码全接触." 在HTTP协议中,服务器发往客户端的数据中,通常都包括HTTP头和HTTP体,当存在HTTP体的时候,HTTP体的长度通常是由 ...

  2. java chunked编码解码_HTTP协议中的CHUNKED编码解析

    HTTP协议中的TRANFER-ENCODING:CHUNKED编码解析 通常情况下,Transfer-Encoding域的值应当为chunked,表明采用chunked编码方式来进行报文体的传输.c ...

  3. 蓝牙协议中的SBC编码

    一.从信息的传输说起  上图是一个典型的蓝牙耳机应用场景.手机上的音频信息经过编码以后通过蓝牙协议被蓝牙耳机接收,经过解码以后,蓝牙耳机成功获取手机上的音频信息,然后再转化为振动被人耳识别.这是一个 ...

  4. http协议中content-length 以及chunked编码分析

    转载请注明出处 http://blog.csdn.net/yankai0219/article/details/8269922 0.序 1.http/1.1协议中与chunked编码的相关字段 1)E ...

  5. oid隐形码_OID编码规则 | 学步园

    对象标识符(OBJECT IDENTIFIER, OID)的编码规则 对象标识符类型 对象标识符(OBJECT IDENTIFIER, OID)类型用层次的形式来表示标准规范.标识符树通过一个点分的十 ...

  6. snmp协议及常见问题分析

    SNMP:"简单网络管理协议",用于网络管理的协议.SNMP用于网络设备的管理.SNMP的工作方式:管理员需要向设备获取数据,所以SNMP提供了get操作:管理员需要向设备执行设置 ...

  7. SNMP协议控制AP7921设备电源端口

    SNMP协议控制施耐德AP7921 SNMP基础知识点 1)写在前面: SNMP简单概述 1)什么是Snmp 2)SNMP 和 UDP 3)Snmp版本 SNMP的实现结构 SNMP有关的基本概念 1 ...

  8. 系统监控之SNMP协议理解

    使用Mycat分布式数据库中间件时需要对各个性能指标进行监控,官方已经提供了一个监控软件,于是讨论起来监控是怎么具体可能有哪些实现,虽然知道已经有很多的监控软件可以使用,比如zabbix,但是今天听同 ...

  9. 通过snmp协议自动化获取服务器硬件信息-python

    前言 最近有个需求,就是在新机器上架的时候,获取硬件信息,用来核对新采购的服务器是否和购买的配置一致.其中包含cpu.内存,硬盘,Raid卡.网卡等硬件信息.由于新机器可能没有装操作系统,考虑到公司使 ...

最新文章

  1. adb: unable to connect for root: more than one device/emulator
  2. class没有发布到tomcat_SpringBoot内置tomcat启动原理
  3. Android在listview添加checkbox实现单选多选操作问题
  4. Android 代码设置调试等待
  5. sql 高级 (五)(create index(创建索引) drop)
  6. 别让双手闲下来,来做一些练手项目吧
  7. 一个类加载的谜团解决了
  8. JavaIO流加解密,AES对字符串加解密
  9. c语言如何输入矩阵_如何在 COMSOL 软件中调试外部材料
  10. 值类型和引用类型的区别,应该很全的。
  11. Android Studio(3)---Android Studio的配置
  12. 墨条不如墨汁黑是怎么回事?
  13. Perceptual Losses for Real-Time Style Transfer and Super-Resolution 运行程序
  14. 华为机试-字符串通配符
  15. 18.看板方法---精益的一种经济学模型
  16. android连接打印机打印pdf文件,如何在Android设备上打印PDF文件
  17. 一加6android9玩飞车掉,解锁新速度:一加6T深度评测
  18. SM2258XT+B17A测试(焊接+开卡+测速+跑圈)
  19. sql server 2008服务无法启动的原因和解决办法
  20. 饥荒控制台输入没用_《饥荒》控制台正确使用教程 如何使用控制台

热门文章

  1. 实习打杂记录,xboot中使已上传文件能够下载。
  2. 你知道吗?字体会让产品有不同的气质
  3. libsodium,libvpx编译为android库
  4. 互联网公司应该怎么发展猎头业务
  5. Linux声音设备编程实例
  6. hosts文件位置?hosts文件是什么?hosts文件修复方法的详细介绍
  7. 移动硬盘不小心格式化怎么恢复数据呢?
  8. C++学习笔记:模板参数
  9. Redash -- Redash部署安装docker版
  10. 基于JavaWeb的房间平面图区域参数检测