IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> TCP/IP详解 卷1:协议 学习笔记 第二十五章 SNMP:简单网络管理协议 -> 正文阅读

[网络协议]TCP/IP详解 卷1:协议 学习笔记 第二十五章 SNMP:简单网络管理协议

随着网络技术的发展,网络数量越来越多,网络中的设备来自不同厂家,如何管理这个设备变得十分重要。

基于TCP/IP的网络管理包含两个部分:网络管理站(也叫管理进程,manager)和被管理的网络单元(也叫被管设备,包括路由器、X终端、终端服务器、打印机等运行TCP/IP协议的设备)。

被管理设备端中与管理相关的软件叫做代理程序或代理进程。管理站一般是带有彩色监视器的工作站,可以显示所有被管理设备的状态(如是否掉线、各种连接上的流量状况等)。

管理进程和代理进程间通信方式有两种:一是管理进程向代理进程发出请求,询问一个具体的参数值或要求改变代理进程的某参数值;二是代理进程主动向管理进程报告有某些重要的事件发生。

基于TCP/IP的网络管理包含三个部分:
1.一个管理信息库(MIB,Management Information Base),其中包含所有代理进程的所有可被查询和修改的参数。RFC 1213定义了第二版的MIB,叫做MIB-Ⅱ。
2.关于MIB的一套公用的结构和表示符号,称其为管理信息结构(SMI,Structure of Management Information)。如SMI定义计数器是一个非负整数,范围是0~4294967295,当达到最大值时,又从0开始计数。
3.管理进程和代理进程之间的通信协议,叫做简单网络管理协议(SNMP,Simple Network Management Protocol)。尽管运输层可以使用很多协议,但用得最多的还是UDP,所以可能发生数据报丢失的情况,需要超时和重传机制。

SNMP定义了5种报文:
1.get-request操作:从代理进程处提取一个或多个参数值。
2.get-next-request操作:从代理进程处提取一个或多个参数的下一个参数值。
3.set-request操作:设置代理进程的一个或多个参数值。
4.get-response操作:返回一个或多个参数值,由代理进程发出,是前三个操作的响应操作。
5.trap操作:代理进程主动发出,通知管理进程某些事件的发生。

在这里插入图片描述
代理进程和管理进程的熟知端口号不同,因此一个系统可以同时为管理进程和代理进程。

在这里插入图片描述
上图中只标注了UDP和IP首部长度,这是由于SNMP报文编码采用了ASN.1和BER,使得SNMP的长度取决于变量的类型和值。

版本字段为0,该字段的值是通过SNMP版本号减去1得到的,0代表SNMP v1。

共同体字段是一个字符串,是管理进程和代理进程之间的口令,是明文格式,默认值为public。

PDU(协议数据单元,Protocol Data Unit)类型字段取值:
在这里插入图片描述
对于get、get-next、set操作,请求标识字段由管理进程设置,然后由代理进程在get-response中返回,用于管理进程将查询和响应进行匹配。类似的字段在其他UDP应用中也有,如DNS的标识字段)。这个字段允许管理进程对一个或多个代理进程发出多个请求,并从返回的众多应答中进行分类。

差错状态字段由代理进程标注,指明有差错发生,它的取值如下:
在这里插入图片描述
差错索引字段是一个整数偏移量,代理进程用它指明差错发生在哪个参数,只有在发生noSuchName、readOnly、badValue差错时才进行标注。

在get、get-next、set的请求数据报中,包含变量名称和变量值的一张表,对于get和get-next操作,变量值部分不需填写。

SNMP中的数据类型:
1.INTEGER:一个变量虽然定义为整型,但也有多种形式,有些整型变量没有范围限制,有些整型变量定义为特定的数值(如IP的转发标志就只有允许转发的1和不允许转发的2两种),有些整型变量定义为一个特定的范围(如UDP和TCP的端口号从0~65535)。
2.OCTER STRING:0或多个8bit字节,每个字节值在0~255之间。不以NULL结尾。这种数据类型和下一种数据类型的BER编码,字符串的字节个数要超过字符串本身的长度。
3.DisplayString:0或多个8bit字节,每个字节必须是ASCII码。MIB-Ⅱ中,该类型变量不能超过255个字符。
4.OBJECT IDENTIFIER。
5.NULL:表示相关变量没有值,如在get或get-next中,变量的值就是NULL。
6.IpAddress:4字节长度的OCTER STRING,以网络序表示的IP地址,每个字节代表IP地址的一个字段。
7.PhyAddress:OCTER STRING类型,代表物理地址(如以太网物理地址为6字节长度)。
8.Counter:非负整数,可从0递增到232-1(4294976295),达到最大值后归零。
9.Gauge:非负整数,取值范围为0~4294976295,可增可减,达到最大值后锁定,直到复位。如MIB中的tcpCurrEstab变量就是这种类型,它表示目前在ESTABLISHED或CLOSE_WAIT状态的TCP连接数。
10.TimeTicks:时间计数器,以0.01秒为单位递增,不同变量可以有不同的递增幅度,所以在定义这种变量的时候要指定递增幅度。如MIB中的sysUpTime变量就是这种类型,表示代理进程从启动开始到现在的时间长度,以多少个0.01秒的数目来表示。
11.SEQUENCE:包含0个或多个元素,每一个元素又是另一个ASN.1数据类型。如MIB中的UdpEntry变量就是这种类型,它表示代理进程目前在使用的UDP数量,此变量中包含两个元素:一是IpAddress类型变量udpLocalAddress,表示IP地址;二是INTEGER类型的udpLocalPort,范围是0~65535,表示端口号。
12.SEQUENCE OF:这是向量的定义。类似SEQUENCE,但其中所有元素的类型是相同的。如果元素类型是类似整数类型的简单数据类型,那么它就是一个一维向量;如果其中的元素类型是SEQUENCE,可将它看作一个二维数组或表。
在这里插入图片描述
对象标识是一种数据类型,它表示一种授权的命名对象,授权的含义为这些标识不是随便分配的,而是由权威机构进行管理和分配的。

对象标识是一个整数序列,以点·分隔,这些整数构成一个树型结构。对象标识从树的顶部开始,顶部没有标识,以root表示:
在这里插入图片描述
如上图,所有MIB变量的类型都从1.3.6.1.2.1开始。树上的每个结点还有一个文字名,它主要为了人们阅读方便,实际应用中,即管理进程和代理进程进行数据报交互时,MIB变量名是以对象标识来标识的。标识1.3.6.1.4.1是给厂家自定义而预留的。

如上图,MIB的对象标识被划分为若干组,以下是udp组的结构:
在这里插入图片描述
udp组中包含4个简单变量和由2个简单变量组成的表格,以下是4个简单变量的描述:
在这里插入图片描述
上图中,R/W列为空,表示该变量是只读的,如果该变量可读可写,则用·表示;数据类型如果是INTEGER且有范围限制,则用其上下限来表示。这两点在后面的图中也是这样。

以下是2个简单变量组成的表格的描述:
在这里插入图片描述
以下三个计数器是有相互关系的:
在这里插入图片描述
上图表明udpInDatagram不包括udpInError和udpNoPorts且分组的所有数据路径都是被计数的。

当查询和设置变量的值时,必须对MIB的变量进行标识,只有叶子结点是可操作的。SNMP没法处理表格的一整行或一整列。

简单变量的标识直接在其对象标识后面添加.0即可。

如有以下表格:
在这里插入图片描述
对以上表格中的6个变量会进行MBI字典式排序,这个排序是按对象标识的字典顺序进行的,以上表格排序前:
在这里插入图片描述
经过排序后:
在这里插入图片描述

这种字典排序有两个结果:
1.一个给定变量的所有实例都是相邻的,这暗示表格操作的顺序是先列后行。
2.表格中对行的排序与表格中的值有关。

从代理进程处进行查询的软件属于ISODE(ISO开发环境,ISO Development Environment)系统,叫做snmpi。

从一个路由器处取两个udp组的简单变量值:
在这里插入图片描述
snmpi的-a选项表示要通信的代理进程名,-c选项表示SNMP的共同体名。代理进程允许管理进程用只读共同体名对变量进行读操作,用读写共同体名对变量进行读写操作。

上图中的get命令会使用get-request报文段。

以上过程的tcpdump输出:
在这里插入图片描述
对这两个变量的查询请求是封装在一个UDP数据报中的,响应也在一个UDP数据报中。tcpdump显示的变量是以其对象标识的形式显示的,这是在SNMP报文中实际传输的内容。我们必须指定这两个变量的实例是0。

get-next操作是基于MIB的字典式排序的,下面的例子中,首先向代理进程询问UDP后的下一个对象标识(不是一个叶子对象,没有指定任何实例),代理进程将返回UDP组中的第1个对象,然后我们继续向代理进程取该对象的下一个对象标识,此时第2个对象将被返回:
在这里插入图片描述
该方式可从MIB树的顶点开始,对代理进程一步步地进行查询,就可得到代理进程处所有的变量值和标识,它的另一个用处就是对表格进行遍历。

遍历udpTable,由于udpTable不是叶子对象,我们不能指定一个实例,但我们可以使用next命令返回表格中的对象,然后以返回的结果为基础进行下一步操作,返回顺序是先列后行,如遍历图25-13中的表:
在这里插入图片描述
如上图,当返回的变量名是表格之外的变量时,就获取完了表格中的内容。

MIB中的system(系统标识)组只包含以下7个简单变量:
在这里插入图片描述
如上图,system组中的对象标识符变量在internet.private.enterprises组中。此外,根据sysService变量的取值4和8,它支持网络层(如选路)和运输层的应用。

MIB中的interface(接口)组中只定义了一个简单变量:
在这里插入图片描述
此外interface组中还有一个表格变量,其中有22列,表格中每行定义了接口的一些特征参数:
在这里插入图片描述

如向主机sun查询3个接口的一些变量:
在这里插入图片描述
上图中,对于SLIP链路的接口类型,报告的是点对点的专用串行链路,而非SLIP链路,且速率没有报告。

MIB的at(地址转换)组对所有系统都是必需的,但在MIB-Ⅱ中已经没有这个组,从MIB-Ⅱ开始,每个网络协议组(如IP组)都包含它们自己的网络地址转换表,如IP组的网络地址转换表是ipNetToMediaTable。

at组中只有一个由3列组成的表格变量,下图中atIfIndex列的含义应该是接口的索引:
在这里插入图片描述
可用snmpi程序中的命令dump来获取整个表格,下图向kinetics的路由器查询其整个ARP高速缓存,输出是字段是排序的整个表格内容:
在这里插入图片描述
路由器kinetics的ARP高速缓存内容如下:
在这里插入图片描述
snmpi的dump命令是通过get-next操作获取的整张表。

路由器kinetics的路由表中,接口2的物理地址是32bit的,这是由于接口2连接的是一个AppleTalk网络。

MIB的ip组中的简单变量:
在这里插入图片描述
ip组中的一个表格变量是IP地址表ipAddrTable,系统中每个IP地址对应表格中的一行,每行有5个变量,表中ipAdEntIfIndex列表示的含义应该是接口的索引:
在这里插入图片描述
IP路由表ipRouteTable也是ip组中的表格变量,该表中每行记录的索引是目的IP地址,下表中的ipRouteIfIndex列的含义应该是接口索引:
在这里插入图片描述
ip组中最后一张表就是替换at组的IP表ipNetToMediaTable:
在这里插入图片描述
MIB的icmp组包括以下变量:
在这里插入图片描述
MIB的tcp组包含以下简单变量,其中变量tcpRetransSegs的数据类型是Counter:
在这里插入图片描述
tcp组中还包括一个表格变量TCP连接表tcpConnTable,对于每一个TCP连接,都对应表格中的一条记录:
在这里插入图片描述
可通过SNMP获取MTU,首先从IP路由表中找出连接对应的端口号,然后通过端口号在接口表中找到这个接口的MTU:
在这里插入图片描述
从域名服务器返回的第1个IP地址总是和客户有相同的子网掩码,虽然其他IP也能正常工作,但效率比较低。

路由器gemini是一个多接口主机,有两个以太网接口,首先确认两个接口都可Telnet登录:
在这里插入图片描述
在这里插入图片描述
使用traceroute命令查看这两个地址选路方面的不同:
在这里插入图片描述
可见如果采用属于140.252.3子网的地址,会多额外一跳。以下是系统的连接关系图:
在这里插入图片描述
由上图,主机gemini和路由器swnrt都连接了两个网段:140.252.3和140.252.1。

路由器netb采用了ARP代理,使得sun工作站好像是直接连接到140.252.1子网上。

上图中,用虚线画出了当Telnet到140.252.3.54时的路径,返回的数据报没有从原路返回。

在主机sun上用get命令取netb上140.252.3.0的下一跳路由器的值:
在这里插入图片描述
可见netb路由器会把分组发给swnrt路由器。

而gemini把分组回送给sun时,由于目的地址是140.252.1.29,而子网140.252.1是直接连到gemini上的,因此gemini会将分组传给netb。

现在已经定义了6种trap类型,第7种类型是由供应商自己定义的特定类型:
在这里插入图片描述
正式的SNMP规范中采用的是ASN.1(Abstract Syntax Notation 1)语法,在SNMP报文中比特的编码采用BER(Basic Encoding Rule)。

ASN.1是一种描述数据和数据特征的语言,它和数据的存储和编码无关。MIB和SNMP报文中的所有字段都是用ASN.1描述的,如ASN.1这样描述SNMP的数据类型ipAddress:
在这里插入图片描述
ASN.1这样描述MIB中的简单变量:
在这里插入图片描述
对于以上ASN.1的定义,有多种编码方式把数据编码为传输的比特流,SNMP使用的是BER,如一个简单的整数64,在BER中需要3个字节来表示,第一个字节说明这是一个整数,下个字节说明用了多少字节来存储该整数(此处是1),最后一个字节才是该整数的值。

SNMPv2中新增内容:
1.新的报文类型get-bulk-request,它高效地从代理进程读取大块数据。
2.新的报文类型inform-request,它使一个管理进程向另一个管理进程发送信息。
3.两个新MIB:SNMPv2 MIB和SNMPv2-M2M MIB(管理进程到管理进程的MIB)。
4.SNMPv2中的共同体名称可提供加密,SNMPv1中的共同体名称只能明文传送,安全性提高。

如果管理进程和代理进程使用同一个端口,则一个系统就不能同时是管理进程和代理进程,因为端口会被另一个进程占用。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-07-10 11:41:25  更:2021-07-10 11:41:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 14:43:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计