SNMP协议中OID的编码规则
前言
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的编码规则相关推荐
- HTTP协议中的chunked编码解析
" HTTP协议中的chunked传输编码全接触." 在HTTP协议中,服务器发往客户端的数据中,通常都包括HTTP头和HTTP体,当存在HTTP体的时候,HTTP体的长度通常是由 ...
- java chunked编码解码_HTTP协议中的CHUNKED编码解析
HTTP协议中的TRANFER-ENCODING:CHUNKED编码解析 通常情况下,Transfer-Encoding域的值应当为chunked,表明采用chunked编码方式来进行报文体的传输.c ...
- 蓝牙协议中的SBC编码
一.从信息的传输说起  上图是一个典型的蓝牙耳机应用场景.手机上的音频信息经过编码以后通过蓝牙协议被蓝牙耳机接收,经过解码以后,蓝牙耳机成功获取手机上的音频信息,然后再转化为振动被人耳识别.这是一个 ...
- http协议中content-length 以及chunked编码分析
转载请注明出处 http://blog.csdn.net/yankai0219/article/details/8269922 0.序 1.http/1.1协议中与chunked编码的相关字段 1)E ...
- oid隐形码_OID编码规则 | 学步园
对象标识符(OBJECT IDENTIFIER, OID)的编码规则 对象标识符类型 对象标识符(OBJECT IDENTIFIER, OID)类型用层次的形式来表示标准规范.标识符树通过一个点分的十 ...
- snmp协议及常见问题分析
SNMP:"简单网络管理协议",用于网络管理的协议.SNMP用于网络设备的管理.SNMP的工作方式:管理员需要向设备获取数据,所以SNMP提供了get操作:管理员需要向设备执行设置 ...
- SNMP协议控制AP7921设备电源端口
SNMP协议控制施耐德AP7921 SNMP基础知识点 1)写在前面: SNMP简单概述 1)什么是Snmp 2)SNMP 和 UDP 3)Snmp版本 SNMP的实现结构 SNMP有关的基本概念 1 ...
- 系统监控之SNMP协议理解
使用Mycat分布式数据库中间件时需要对各个性能指标进行监控,官方已经提供了一个监控软件,于是讨论起来监控是怎么具体可能有哪些实现,虽然知道已经有很多的监控软件可以使用,比如zabbix,但是今天听同 ...
- 通过snmp协议自动化获取服务器硬件信息-python
前言 最近有个需求,就是在新机器上架的时候,获取硬件信息,用来核对新采购的服务器是否和购买的配置一致.其中包含cpu.内存,硬盘,Raid卡.网卡等硬件信息.由于新机器可能没有装操作系统,考虑到公司使 ...
最新文章
- adb: unable to connect for root: more than one device/emulator
- class没有发布到tomcat_SpringBoot内置tomcat启动原理
- Android在listview添加checkbox实现单选多选操作问题
- Android 代码设置调试等待
- sql 高级 (五)(create index(创建索引) drop)
- 别让双手闲下来,来做一些练手项目吧
- 一个类加载的谜团解决了
- JavaIO流加解密,AES对字符串加解密
- c语言如何输入矩阵_如何在 COMSOL 软件中调试外部材料
- 值类型和引用类型的区别,应该很全的。
- Android Studio(3)---Android Studio的配置
- 墨条不如墨汁黑是怎么回事?
- Perceptual Losses for Real-Time Style Transfer and Super-Resolution 运行程序
- 华为机试-字符串通配符
- 18.看板方法---精益的一种经济学模型
- android连接打印机打印pdf文件,如何在Android设备上打印PDF文件
- 一加6android9玩飞车掉,解锁新速度:一加6T深度评测
- SM2258XT+B17A测试(焊接+开卡+测速+跑圈)
- sql server 2008服务无法启动的原因和解决办法
- 饥荒控制台输入没用_《饥荒》控制台正确使用教程 如何使用控制台