TCP/IP 协议栈分层教学文档

目录


一、引言

1.1 协议分层解决什么问题

计算机网络要完成数据通信,需要解决寻址、可靠传输、路由选择、数据表示等一整组问题。若把这些功能揉进一个协议,任何一处设计变更都会牵动全局。分层模型的思路是把这些问题按职责拆开,每一层只向上层提供确定的服务,只依赖相邻下层提供的接口。

分层带来三项直接好处:

好处 说明
职责解耦 替换某一层的实现不影响其他层,例如把 TCP 换成 UDP,上层应用逻辑无需改动
实现复用 多个应用协议共享同一套下层实现,例如 HTTP 与 SNMP 共用 IP
故障定位 报文未到达可逐层排查:应用层未收到则查上层,链路层不通则查下层

代价是每层添加首部带来额外开销,以及相邻层之间的接口需要额外设计。

"某个协议工作在第几层"这一问题,本质上是在问:该协议定义的报文格式属于哪一层的协议规范,由哪一层的实现负责收发。 判定方法见 1.3。

1.2 从 OSI 七层模型到 TCP/IP 四层模型

OSI 模型由国际标准化组织提出,是七层的参考模型。它把应用层的职责细分为应用层、表示层、会话层三层,理论结构完整,但没有对应到一套实际运行的协议族。

TCP/IP 模型是互联网实际采用的划分,层数更少,层与层之间的界线划在协议实现之上。下图给出两者的对应关系。

flowchart TB subgraph OSI[OSI 七层参考模型] direction TB O1[应用层] O2[表示层] O3[会话层] O4[传输层] O5[网络层] O6[数据链路层] O7[物理层] end subgraph TCP[四层模型] direction TB T1[应用层] T2[传输层] T3[网际层] T4[网络接口层] end O1 --> T1 O2 --> T1 O3 --> T1 O4 --> T2 O5 --> T3 O6 --> T4 O7 --> T4

收敛规则有三条:

规则 说明
三层合并 OSI 的应用层、表示层、会话层合并为 TCP/IP 的应用层
名称替换 OSI 的网络层在 TCP/IP 模型中称为网际层,两者是同一层
两层合并 OSI 的数据链路层与物理层合并为网络接口层

合并的工程原因在于实际的 TCP/IP 协议族没有严格区分表示与会话的职责:TLS 承担了部分表示层的功能,连接复用与状态管理承担了部分会话层的功能,强行分开只会增加接口复杂度。

1.3 判定协议所属层次的三条依据

遇到"某协议工作在第几层"的问题时,按下列三条依据依次检查,三条一致即可确定层次。

依据 检查内容 指向应用层的判据
依据一 报文格式 该协议定义的报文结构属于哪一类数据单元 报文由版本号、团体名、操作单元等应用语义字段构成,不是传输层首部结构
依据二 收发主体 该协议由操作系统的哪一部分实现 由用户态进程收发,不属于内核提供的传输功能
依据三 依赖的服务层 该协议借助哪一层完成端到端传输 借助 UDP 完成传输,只说明它依赖传输层服务

第三条最容易被误读。使用某层的服务与属于该层是两件不同的事。 判定归属要看依据一与依据二,依据三只能说明依赖关系。

以 SNMP 为例,三条依据的验证过程如下:

flowchart TD A[判定 SNMP 所在层次] --> B[依据一 检查报文格式] B --> B1[报文含版本号 团体名 操作单元 属应用层报文结构] A --> C[依据二 检查收发主体] C --> C1[由用户态进程 snmpd 收发 不在内核中] A --> D[依据三 检查依赖的服务层] D --> D1[借助 UDP 完成端到端传输] B1 --> E[三条依据一致 判定为应用层] C1 --> E D1 --> E

二、TCP/IP 四层模型

本章是全文的主干。第三章以 SNMP 为例展开应用层协议内部的组织方式,第四章的示例也以跨层的完整路径为主。

2.1 四层模型的划分

四层模型与数据封装左为层的划分 右为一份应用层报文逐层封装后的实际形态TCP/IP 四层模型应用层SNMP · HTTP · DNS · SMTP报文传输层TCP · UDP报文段 用户数据报网际层IP · ICMP分组网络接口层Ethernet · PPP帧物理层双绞线 · 光纤 · 无线比特应用层协议借用下层服务以 SNMP 报文为例的封装结果帧含目的 MAC 与源 MACIP 分组含目的 IP 与生存时间UDP 用户数据报含目的端口 161 与源端口SNMP 报文version整数 指定协议版本community字符串 团体名 兼作简易认证PDU 报文数据单元承载操作类型与数据request-id请求标识 用于匹配响应error-status错误状态 正常时为 0error-index错误下标 正常时为 0封装方向数据单元逐层增大 传输路径自顶向下各层首部的作用端口号定位进程 IP 定位主机 MAC 定位下一跳 ×

上表列出四层模型自上而下的四层及其职责。四层之间是相邻服务关系,上层调用下层提供的接口,不需要了解下层的实现细节。

层次 英文名称 OSI 对应层 核心职责
应用层 Application Layer 五、六、七层 规定应用进程之间交换信息的格式与语义
传输层 Transport Layer 第四层 提供进程到进程的端到端传输与复用
网际层 Internet Layer 第三层 提供主机到主机的分组转发与寻址
网络接口层 Network Interface Layer 第一、二层 在具体网络介质上传输比特流

应用层是本章的重点。 它不负责数据如何送达,而是规定数据本身的内容与含义。同一份应用层报文可以搭载在 TCP 上,也可以搭载在 UDP 上,协议本身不关心这一点。

2.2 四层模型与五层模型的对照

不少教材把网络接口层拆分为数据链路层与物理层,形成五层划分。两种划分的内容一致,区别只在粒度。

TCP/IP 四层 五层划分 数据单元 典型协议
应用层 应用层 报文 SNMP HTTP DNS SMTP
传输层 传输层 报文段 用户数据报 TCP UDP
网际层 网络层 分组 IP ICMP IGMP
网络接口层 数据链路层 帧 Ethernet PPP VLAN
网络接口层 物理层 比特 双绞线 光纤 无线信道

阅读文献时若遇到"网络接口层"与"数据链路层"混用,前者是四层模型中的层,后者是五层模型中网络接口层的组成部分,两者的上下边界一致。多数试题的选项中出现"数据链路层",说明采用的是五层划分。

2.3 各层的职责与数据单元

判断一个协议归属哪一层,最直接的办法是看它定义的数据单元类型。

层次 主要职责 数据单元 封装动作 寻址标识
应用层 定义应用进程之间交换什么内容 报文 Message 不添加本层协议首部 协议自定义字段
传输层 把数据交给目标主机上的目标进程 报文段 Segment 用户数据报 Datagram 添加 TCP 或 UDP 首部 端口号
网际层 跨多个网络把数据送到目标主机 分组 Packet 添加 IP 首部 IP 地址
数据链路层 在单条链路上传输数据 帧 Frame 添加帧首部与帧尾 MAC 地址
物理层 在介质上传输信号 比特 Bit 添加编码与同步位 无

数据单元是分层最直观的标识。 封装过程中数据单元自上而下逐层变大:应用层报文被装进传输层数据单元,再被装进网际层分组,再被装进链路层帧,最后变成比特流。

2.4 封装与解封装

封装是上层数据被下层加上本层首部的过程。发送端自顶向下逐层封装,接收端自底向上逐层解封装,剥离掉各层首部后把数据交给上一层。

上图右侧以一份应用层报文为例展示了封装结果。自内向外四层依次是应用层报文、UDP 用户数据报、IP 分组与帧。

各层首部的作用,是让接收端在每一层都能做出正确判断:

首部所在层 关键字段 接收端用它做什么
传输层 目的端口号 判断交给本机哪个进程
网际层 目的 IP 地址 判断交给本机还是需要转发
数据链路层 目的 MAC 地址 判断交给本链路上的哪台设备

各层首部解决的是不同层次的问题,因此不能互相替代。 目的 IP 地址指向最终主机,途中每一跳路由器的链路层首部都会重新生成;目的端口号从最初产生后始终不变。

2.5 各层的典型协议

层次 典型协议 功能
应用层 SNMP HTTP HTTPS FTP SMTP DNS DHCP Telnet SSH NTP 规定应用进程之间交换什么内容
传输层 TCP UDP 提供进程到进程的端到端传输
网际层 IP ICMP IGMP IPsec 寻址与分组转发
数据链路层 Ethernet PPP VLAN Wi-Fi 在链路上传输帧
物理层 以太网物理规范 双绞线 光纤 无线信道 在介质上传输比特

每一层的协议数量分布很不均衡:传输层只有 TCP 与 UDP 两种,其余各层的协议数量都远多于这两种。这一分布是判定协议层次时最有力的一条经验:凡是需要 TCP 或 UDP 承载的协议,必定位于传输层之上。

2.6 各层的寻址方式

端到端通信需要逐层配合定位目标,三层寻址标识的作用范围各不相同。

层次 寻址标识 长度 作用域 典型形式
数据链路层 MAC 地址 48 位 单条链路 00:1A:2B:3C:4D:5E
网际层 IP 地址 32 位 整个网络 192.168.1.1
传输层 端口号 16 位 单台主机 161

作用域是关键差别。一个 IP 分组在经过路由器转发时,链路层的帧首部与帧尾会被重新生成,只有网际层的 IP 首部保持不变。MAC 地址只在本链路内有效,IP 地址贯穿整个传输路径,端口号则只在终点主机上有效。

2.7 端口号与传输层寻址

端口号是传输层唯一的寻址标识,占 16 位,取值范围 0 到 65535。按分配方式分为三段:

端口范围 名称 分配方式
0 到 1023 知名端口或系统端口 由 IANA 统一分配,绑定后需要特权
1024 到 49151 注册端口 向 IANA 登记后使用
49152 到 65535 动态端口或私有端口 由操作系统在连接建立时临时分配

一个应用层服务通常约定一个或两个固定端口号,客户端把目的端口设为该值,服务端即可判断数据应当交给哪个进程。常见约定如下:

应用层服务 传输层协议 端口号
FTP 控制连接 TCP 21
SSH TCP 22
Telnet TCP 23
SMTP TCP 25
DNS UDP 53
HTTP TCP 80
DHCP 服务器与客户端 UDP 67 与 68
NTP UDP 123
SNMP 请求与告警 UDP 161 与 162
HTTPS TCP 443

三点需要注意:

  1. 端口号属于传输层的地址空间。 TCP 与 UDP 用端口号把数据交给本机的目标进程,应用层协议借用这一机制定位服务进程。端口号的所有权不改变应用层协议的层次归属。
  2. 同一端口号在不同传输层协议中可以复用。 53 号端口在 UDP 上属于 DNS,在 TCP 上属于与 DNS over TLS 相关的服务,两者是不同协议的监听端口。
  3. 响应通常从临时端口发出。 服务端监听固定端口,收到请求后以一个临时端口作为源端口回应,因此响应报文的源端口与目的端口通常对调。

三、应用层协议实例 SNMP

3.1 SNMP 概述

SNMP(Simple Network Management Protocol,简单网络管理协议)是用于网络设备管理的应用层协议,第一版由 IETF 于 1988 年发布。

它解决的核心问题是:如何让一个位置集中监视和控制大量分散的设备。 网络中的路由器、交换机、服务器、打印机各自有大量运行状态和配置参数,逐台登录查看既低效又不可行。SNMP 的做法是在被管设备上运行一个代理进程,由代理进程代管设备状态,管理站通过查询与告警两类报文统一访问这些状态。

SNMP 的三个基本特征:

特征 说明
请求响应为主 管理站发起查询,代理返回结果,属于轮询模型
告警为辅 代理在检测到异常时主动上报 Trap,弥补轮询的时间延迟
基于 UDP 不建立连接,报文简短,开销低

3.2 SNMP 的层次归属

SNMP 是应用层协议。 按 1.3 的三条依据逐条验证:

依据 SNMP 的实际情况 结论
报文格式 报文首部含版本号与团体名,PDU 含请求标识与变量绑定表,全为应用语义字段 属应用层报文结构
收发主体 由用户态进程 snmpd 收发,不属于内核提供的传输功能 不属传输层
依赖的服务层 借助 UDP 完成端到端传输 仅说明依赖传输层

第三条不能用作判定依据。 传输层协议只有 TCP 与 UDP 两种,因此凡使用这两个协议的协议必定位于传输层之上;反过来说,使用 UDP 推不出属于传输层。

传输层的选项对应 TCP 与 UDP,SNMP 只是把它们当作可选的传输服务。

3.3 SNMP 的体系结构

SNMP 管理体系结构管理站与代理之间通过 SNMP 报文交换信息 代理负责访问被管对象的 MIB管理站Manager 也称 NMS 网络管理站管理应用面向管理员的图形界面与告警处理SNMP 实体构造请求报文 解析响应报文代理进程接口与本机代理进程交互的接口代理Agent 运行在被管设备上SNMP 实体接收请求报文 构造响应报文MIB 管理信息库被管对象取值的集合代理进程接口读取并设置设备实际状态Get GetNext GetBulk Set 请求管理站发出 经 UDP 161 到达代理Response 响应 与 Trap 告警代理发出 响应回 161 Trap 发往 162被管对象接口状态 计数器 路由表 进程信息交互以轮询为主 Trap 为辅管理站定期发起查询 代理在异常时主动上报告警 ×

SNMP 体系由四类角色构成:

角色 中文名 所在位置 职责
Manager 管理站 网络管理中心 发起查询、接收告警、向管理员呈现
Agent 代理 每台被管设备上 接收请求、访问本地状态、返回结果
MIB 管理信息库 代理进程内部 组织被管对象及其取值的命名空间
Managed Object 被管对象 设备实际资源 接口状态、计数器、路由表、进程信息等

两端的 SNMP 实体是对等实体,负责构造与解析报文;两端的代理进程接口负责与本机操作系统交互;代理一侧的 MIB 是被管对象的逻辑视图。

交互以轮询为主、Trap 为辅。这一配合方式解决了纯轮询的两个问题:轮询间隔内的异常无法及时发现,以及为大量设备高频轮询本身构成负担。

3.4 SNMP 的报文格式

SNMP 报文采用 ASN.1 定义结构,采用 BER(基本编码规则)序列化。用 ASN.1 描述如下:

Message ::= SEQUENCE {
    version      INTEGER { version-1(0), version-2c(1), version-3(3) },
    community    OCTET STRING,
    data         PDUs
}

PDU ::= SEQUENCE {
    request-id         INTEGER,
    error-status       INTEGER,
    error-index        INTEGER,
    variable-bindings  VarBindList
}

VarBind ::= SEQUENCE {
    name   OBJECT IDENTIFIER,
    value  ObjectSyntax
}

各字段含义如下:

字段 所属 作用
version 报文首部 指出协议版本,取值 0 为 v1,1 为 v2c,3 为 v3
community 报文首部 团体名,v1 与 v2c 中兼作简易认证,v3 中不再使用
request-id PDU 请求标识,响应中原样带回,供管理站匹配请求与响应
error-status PDU 错误状态,0 表示正常,非 0 表示错误类别
error-index PDU 错误下标,指向变量绑定表中出错的条目序号
variable-bindings PDU 变量绑定表,由若干"名称与取值"的对组成

变量绑定表是 SNMP 的数据承载方式,一个请求可以携带多个变量绑定,因此一次 GetRequest 可以同时读取多个对象。响应的处理方式是逐项检查:SetRequest 中若某一项取值合法则写入,非法则整个操作回滚。

v1 的常见错误码包括 noSuchName(对象不存在)、badValue(取值不合法)、noAccess(无访问权限)、wrongType(语法类型不符)。

3.5 SNMP 的操作类型

flowchart LR M[管理站] -->|Get GetNext GetBulk Set 请求 经 UDP 161| A[代理] A -->|GetResponse 响应 经 UDP 161| M A -->|Trap 与 Inform 告警 经 UDP 162| M

SNMPv1 定义了五种基本操作:

操作 方向 作用 典型用途
GetRequest 管理站到代理 读取变量绑定表中各对象的取值 读取设备名称、运行时间
GetNextRequest 管理站到代理 读取字典序中排在当前对象之后的下一个对象 逐项遍历整棵 MIB 子树
SetRequest 管理站到代理 设置对象的取值 修改设备名称、启用或关闭接口
GetResponse 代理到管理站 返回读取结果,或返回写入成功与错误码 响应前三类请求
Trap 代理到管理站 设备主动上报异常或事件 链路断开、指标越限

其中前四种构成严格的请求响应对,Trap 不需要管理站预先请求。

SNMPv2c 补充了三种操作:

操作 作用
GetBulkRequest 一次请求多个连续对象,替代连续发送 GetNextRequest,大幅减少报文数
GetBulkResponse GetBulkRequest 的响应
InformRequest 需要管理站确认的告警,代理发出后会等待响应,Trap 则不会

GetBulk 是 v2c 最重要的改进。使用 GetNext 遍历一个有 200 个对象的表需要 200 次往返,使用 GetBulk 只需一次请求加上一次响应。

3.6 MIB 与对象标识符

MIB 对象标识符的树状结构对象标识符是树中节点到根的路径 每一段为该节点在其父节点下的编号根节点固定为 1 从根到任一节点的路径唯一确定该对象的 OID1iso13org1.36dod1.3.61internet1.3.6.12mgmt1.3.6.1.21mib-21.3.6.1.2.11system1.3.6.1.2.1.12interfaces1.3.6.1.2.1.24private1.3.6.1.41enterprise1.3.6.1.4.1常用前缀 1.3.6.1.2.1 为 mgmt.mib-2 收录标准 MIB 1.3.6.1.4.1 为 private.enterprise 由厂商自行扩展标量对象的 OID 末尾追加 0 表示唯一实例 例如 sysName 的完整 OID 为 1.3.6.1.2.1.1.5.0 ×

MIB(Management Information Base,管理信息库)是 SNMP 的核心概念:它把设备的运行状态与配置参数组织成一棵命名树,每个节点是一个被管对象。

对象标识符 OID 是对象在树中的位置,用点分十进制表示,例如 1.3.6.1.2.1.1.5.0。每一段是该节点在其父节点下的编号,从根节点开始逐级拼接。

常用前缀的含义:

OID 前缀 对应节点 说明
1.3.6.1 iso org dod internet 全球互联网的标准前缀
1.3.6.1.2.1 mgmt mib-2 收录标准 MIB,管理信息的主干
1.3.6.1.2.1.1 system 系统信息组,设备的基本属性
1.3.6.1.2.1.2 interfaces 接口信息组,各网络接口的状态与计数
1.3.6.1.4.1 private enterprise 厂商自定义子树,由企业编号划分

标量对象的末尾 0:system 组中的对象都是标量,它们在设备上只有一个实例,因此完整 OID 末尾追加一段 0 表示实例。例如 sysName 的对象标识符是 1.3.6.1.2.1.1.5,其唯一实例的完整标识符是 1.3.6.1.2.1.1.5.0。相比之下,表类型对象(如接口表)的每一行都有各自的实例号,取值由行索引决定。

MIB 采用文本形式定义,内部由 ASN.1 描述对象的名称、语法、访问权限与含义。管理站与代理双方必须加载同一份 MIB 定义,才能正确解释报文中变量的语义。

3.7 SNMP 的三个版本

特性 SNMPv1 SNMPv2c SNMPv3
发布时间 1988 年 1996 年 2004 年
主要规范 RFC 1157 RFC 3416 与 RFC 3417 RFC 3410 至 RFC 3418
认证方式 团体名明文传输 团体名明文传输 用户名配合认证算法
加密传输 无 无 支持
访问控制 团体名匹配 团体名匹配 基于视图的访问控制模型
新增操作 五种基本操作 增加 GetBulk Inform Report 保持并扩展管理站管理
主要问题 无认证无加密 仍无加密 配置与实现较复杂

SNMPv3 引入两个模型:

模型 全称 作用
USM User-based Security Model 用户安全模型 提供身份认证、完整性校验与数据加密
VACM View-based Access Control Model 视图访问控制模型 规定哪些管理站可以访问哪些 MIB 对象

由于 v3 与 v1、v2c 的报文结构不同,一台设备通常同时提供三种版本,由管理站按需选择。实际部署中应优先使用 v3;若受设备限制只能使用 v2c,则必须通过网络隔离与访问控制列表限制管理口暴露范围。


四、示例

4.1 一次 SNMP 查询的完整旅程

以读取某台交换机的设备名称为例,完整过程跨越协议栈全部五层,是第二章各层知识的一次综合运用。

flowchart TD A[应用层管理站生成 GetRequest 报文] --> B[传输层添加 UDP 首部 目的端口 161] B --> C[网际层添加 IP 首部 目的地址与生存时间] C --> D[数据链路层添加帧首部与帧尾 目的 MAC] D --> E[物理层转换为比特流发送] E --> F[设备侧物理层还原比特为帧] F --> G[设备侧数据链路层校验帧校验序列并剥离首部] G --> H[设备侧网际层校验生存时间并剥离首部] H --> I[设备侧传输层按目的端口交付应用进程] I --> J[应用层代理按 OID 查询 MIB 并返回结果]

逐步说明如下:

步骤 所在层 动作
1 应用层 管理站 构造 GetRequest,填入版本号、团体名、request-id 与变量绑定表,变量绑定表中填入 OID 1.3.6.1.2.1.1.5.0
2 传输层 管理站 添加 UDP 首部,目的端口填 161,源端口填一个临时端口
3 网际层 管理站 添加 IP 首部,目的 IP 填设备的管理地址,填写生存时间
4 数据链路层 管理站 查询 MAC 地址表得到目的 MAC,添加帧首部与帧尾,形成完整帧
5 物理层 管理站 把帧转换为比特流,通过介质发送
6 物理层 设备 接收比特流并还原为帧
7 数据链路层 设备 校验帧尾的帧校验序列,正确则剥离首部,交上一层
8 网际层 设备 校验生存时间未超时,剥离 IP 首部,按协议类型交给 UDP
9 传输层 设备 按目的端口 161 把数据交给本机的 snmpd 进程
10 应用层 设备 按 OID 查询 MIB,取出该对象的取值
11 应用层 设备 构造 GetResponse,request-id 与请求保持一致,反向执行第 5 至 9 步

第 10 步若 MIB 中不存在该对象,代理返回 noSuchName 错误码而非静默失败;request-id 在第 11 步被原样带回,使管理站能够把响应与请求配对,在超时重发后也能识别重复响应并丢弃。

这条路径印证了第二章的三点:应用层协议负责报文的产生与解析;传输层只负责按端口把报文交给目标进程;完整的通信需要五层协同,任意一层失败都会导致查询无响应。

4.2 应用层协议的分层归属验证

用 1.3 的三条依据逐一判定下列协议所属的层次,可以验证判定方法本身的可靠性。

协议 依据一 报文格式 依据二 收发主体 所属层次
UDP 数据报含源端口与目的端口、校验和 内核协议栈 传输层
TCP 报文段含端口号、序号、确认号 内核协议栈 传输层
IP 分组含源与目的 IP 地址、生存时间 内核协议栈 网际层
ICMP 差错报告报文,含类型与代码字段 内核协议栈 网际层
ARP 报文含 IP 地址与 MAC 地址的映射 内核协议栈 网络接口层
Ethernet 帧含源与目的 MAC 地址、帧校验序列 网卡驱动与内核 数据链路层
DNS 查询报文含域名、资源记录类型与类别 应用进程或内核转发模块 应用层
HTTP 请求报文含方法、路径与首部字段 应用进程 应用层
SNMP 报文含版本号、团体名与操作单元 用户态进程 snmpd 应用层

三点说明:

  1. 传输层只有两个协议。 表中 UDP 与 TCP 之外的所有协议,都在使用或定义在传输层之上。
  2. ARP 的归类存在两种说法。 它的报文同时含 IP 地址与 MAC 地址,作用范围却仅限本链路。TCP/IP 模型中通常把它归入网络接口层;按 OSI 的划分则归入网络层。两种说法都指同一个协议。
  3. DNS 的实现位置随系统而异。 部分系统在内核中完成查询,另一些由用户态解析器完成。无论实现位置如何,它的报文格式属应用层,因此按依据一判定为应用层。

判定结论由依据一与依据二共同确定,依据三只用于排除误判。 表中所有使用 TCP 或 UDP 的协议,除了 TCP 与 UDP 自身之外全部位于应用层。

4.3 SNMPv2-MIB system 组的经典对象

system 组是 MIB 中最常被查询的一组,其 OID 前缀为 1.3.6.1.2.1.1。

名称 OID 后缀 完整 OID 含义 语法类型
sysDescr 1 1.3.6.1.2.1.1.1.0 设备描述,含厂商与型号 字符串
sysObjectID 2 1.3.6.1.2.1.1.2.0 厂商为该型号分配的标识 对象标识符
sysUpTime 3 1.3.6.1.2.1.1.3.0 设备启动后经过的百分之一秒数 时间计数器
sysContact 4 1.3.6.1.2.1.1.4.0 设备维护责任人 字符串
sysName 5 1.3.6.1.2.1.1.5.0 设备名称 字符串
sysLocation 6 1.3.6.1.2.1.1.6.0 设备所在物理位置 字符串
sysServices 7 1.3.6.1.2.1.1.7.0 设备在协议栈各层提供服务的能力 整数位图

其中 sysServices 值得单独说明。它是一个位图,标准为每一层规定了固定的位权值,该位为 1 表示设备在这一层提供服务:

位权值 二进制位 对应层次
1 0000 0001 物理层
2 0000 0010 数据链路层
4 0000 0100 网际层
8 0000 1000 传输层
128 1000 0000 应用层

把需要的能力对应的位权值相加,即得到该设备应返回的取值。常见的几个例子如下:

返回值 二进制展开 含义 典型设备
4 0000 0100 仅提供网际层服务 三层交换机的转发平面
6 0000 0110 提供数据链路层与网际层服务 路由器
136 1000 1000 提供传输层与应用层服务 运行网络操作系统的主机

主机返回 136,即 128 与 8 之和,说明该设备在传输层与应用层提供服务。这是通过 SNMP 反查设备分层能力的经典方法,也再次说明"设备提供了某层服务"与"该设备上运行的某个协议属于该层"是两个不同的问题。

sysUpTime 以百分之一秒为单位递增,管理站可通过两次采样的差值计算设备稳定性,或结合 sysUpTime 的骤降判断设备发生了重启。

4.4 用命令行工具读取对象

Linux 与 Windows 环境均提供 net-snmp 工具集,三个最常用的读取命令如下。

snmpget -v 2c -c public 192.168.1.1 1.3.6.1.2.1.1.5.0
snmpwalk -v 2c -c public 192.168.1.1 1.3.6.1.2.1.1
snmpbulkget -v 2c -c public 192.168.1.1 1.3.6.1.2.1.2.2.1.2
命令 作用 对应的操作类型
snmpget 读取指定对象的取值 GetRequest 与 GetResponse
snmpwalk 逐项遍历指定 OID 下的整个子树 连续 GetNextRequest 与 GetResponse
snmpbulkget 一次请求读取多个连续对象 GetBulkRequest 与 GetBulkResponse

命令参数的含义:

参数 含义
-v 2c 指定使用 SNMPv2c 版本
-c public 指定团体名为 public
192.168.1.1 目标设备的管理地址,对应网际层的 IP 地址
1.3.6.1.2.1.1.5.0 目标对象的标识符

三条命令在协议栈上的表现完全一致:snmpget 发出一次 GetRequest 报文,封装为 UDP 目的端口 161 的数据报;代理返回一次 GetResponse;命令等待响应并打印结果。snmpwalk 则连续发出多次 GetNextRequest,只是报文数远多于 snmpget。

public 是默认值,仅适用于实验环境。生产环境中团体名相当于共享口令且以明文传输,必须修改为不可猜测的字符串。

4.5 轮询与 Trap 的配合

sequenceDiagram participant N as 管理站 participant A as 代理 N->>A: 按周期发起 GetRequest A-->>N: 返回 GetResponse 常态数据 A-->>N: 事件发生时主动发送 Trap N->>A: 收到 Trap 后发起针对性查询确认

轮询与 Trap 解决的是同一问题的两个侧面,缺一不可:

维度 轮询 Trap
触发方 管理站 代理
触发时机 按固定周期 事件发生时
数据量 每次返回全部被查询对象 每次只上报事件相关信息
发现延迟 最长为一个轮询周期 接近实时
丢失后果 下次轮询可补上 事件永久丢失

实际部署中的典型配置是:管理站对关键指标每分钟轮询一次,对接口状态与设备运行时间等基础信息每五分钟轮询一次,同时开启 Trap 接收链路断开、接口状态变更、认证失败等告警事件。

Trap 存在固有的可靠性问题:它是 UDP 单向发送,代理不确认、管理站不重传,网络拥塞或链路故障时告警可能丢失。因此 Trap 通常只用于"提示有异常发生",不用于传递必须送达的关键数据;真正的确认通过 Trap 之后管理站发起的针对性查询来完成。


五、常见误区

5.1 分层判定上的误区

误区 说明
认为 SNMP 使用 UDP 因而属于传输层 使用某层的服务与属于该层是两回事,传输层协议只有 TCP 与 UDP
认为使用 TCP 或 UDP 的协议都属传输层 传输层只有 TCP 与 UDP 两个协议,其余全是使用它们的应用层协议
认为只有操作系统内核实现的才算协议 应用层协议由规范定义,只是其实现运行在用户态
认为应用层协议必须使用 TCP DNS、DHCP、SNMP 均使用 UDP
认为网络接口层与数据链路层是同一层 网络接口层包含数据链路层与物理层两部分
认为数据单元名称决定唯一层次 分组、报文这类名称在不同文献中偶有混用,需结合寻址标识判断

5.2 SNMP 相关的误区

误区 说明
认为 SNMP 需要先建立连接 SNMP 基于无连接的 UDP,不存在连接建立过程
认为 Trap 需要管理站预先请求 Trap 由代理主动发出,管理站只需在 162 端口监听
认为 GetRequest 一次只能读一个对象 变量绑定表可携带多个对象,一次请求即可批量读取
认为团体名提供了加密保护 团体名以明文传输,只起简易认证作用,不提供机密性
认为 SNMPv3 与 v1 v2c 不兼容 三者可同时部署在同一设备上,由管理站按需选择版本
认为 Trap 一定能送达 Trap 是 UDP 单向发送,丢失后不会重传,关键数据不应依赖 Trap 传递

六、总结

6.1 核心要点回顾

  1. 分层把寻址、可靠传输、路由等职责解耦,各层只向上层提供服务、只依赖下层接口。
  2. OSI 七层模型收敛为 TCP/IP 四层:三层合并为一层,两层合并为一层,网络层更名为网际层。
  3. 教材常用的五层划分把网络接口层拆为数据链路层与物理层,内容与四层一致。
  4. 数据单元是分层最直观的标识:报文、报文段、分组、帧、比特自上而下逐层变大。
  5. 封装是加首部的过程,解封装是剥离首部的过程,二者方向相反。
  6. 各层首部解决不同问题:端口号定位进程,IP 地址定位主机,MAC 地址定位下一跳。
  7. MAC 地址作用域为单条链路,IP 地址贯穿整条路径,端口号只在终点主机有效。
  8. 传输层协议只有 TCP 与 UDP 两种,因此凡使用它们的协议必定位于传输层之上。
  9. 判定协议层次的三条依据是报文格式、收发主体、依赖的服务层,其中第三条只能说明依赖关系。
  10. SNMP 是应用层协议:报文为应用语义结构,由用户态进程 snmpd 收发,借助 UDP 完成传输。
  11. SNMP 体系由管理站、代理、MIB、被管对象四类角色构成,两端的 SNMP 实体对等通信。
  12. 报文首部含版本号与团体名,PDU 含请求标识、错误状态、错误下标与变量绑定表。
  13. 变量绑定表允许一次请求携带多个对象,是 SNMP 批量读取的基础。
  14. SNMPv1 有五种基本操作,v2c 增加 GetBulk、Inform、Report,v3 引入 USM 与 VACM。
  15. OID 是树中节点到根的点分十进制路径,标量对象末尾追加 0 表示唯一实例。
  16. 请求发往代理的 UDP 161,Trap 发往管理站的 UDP 162,端口号属于传输层地址空间。
  17. SNMP 选择 UDP 是为降低开销与时延,可靠性由请求标识与超时重传在应用层弥补。
  18. sysServices 位图可反查设备在各层提供服务的能力,返回 136 表示传输层与应用层。

6.2 术语对照

中文 英文 缩写或取值
传输控制协议 Transmission Control Protocol TCP
用户数据报协议 User Datagram Protocol UDP
网际协议 Internet Protocol IP
网际控制报文协议 Internet Control Message Protocol ICMP
帧校验序列 Frame Check Sequence FCS
生存时间 Time To Live TTL
物理地址 Media Access Control Address MAC
简单网络管理协议 Simple Network Management Protocol SNMP
管理站 Management Station Manager 或 NMS
代理 Agent snmpd 进程
管理信息库 Management Information Base MIB
被管对象 Managed Object —
对象标识符 Object Identifier OID
报文数据单元 Protocol Data Unit PDU
变量绑定表 Variable Bindings VarBindList
团体名 Community String community
通用通告报文 Trap —
通知报文 Inform Request Inform
批量读取 Get Bulk Request GetBulkRequest
用户安全模型 User-based Security Model USM
视图访问控制模型 View-based Access Control Model VACM

6.3 后续学习方向

方向 内容
分层协议的更多实例 Netlink、BGP、ICMP 等协议的分层归属与判定过程
路由与转发的实现 路由器如何逐跳剥离封装并重新封装
TCP 与 UDP 的选择依据 可靠传输、流控、拥塞控制的内部机制
SNMP 的部署实践 管理站选型、团体名管理、访问控制列表、v3 的部署步骤
MIB 编写 用 SMIv2 描述自定义被管对象,建立厂商私有 MIB
轮询与采集优化 GetBulk 批量采集、分布式管理站架构、采集周期设计
告警处理 Trap 到告警的转换规则、抑制与收敛策略
posted @ 2026-11-07 23:35  RK5123153  阅读(0)  评论(0)    收藏  举报