TCP/IP 协议栈分层教学文档
目录
一、引言
1.1 协议分层解决什么问题
计算机网络要完成数据通信,需要解决寻址、可靠传输、路由选择、数据表示等一整组问题。若把这些功能揉进一个协议,任何一处设计变更都会牵动全局。分层模型的思路是把这些问题按职责拆开,每一层只向上层提供确定的服务,只依赖相邻下层提供的接口。
分层带来三项直接好处:
| 好处 | 说明 |
|---|---|
| 职责解耦 | 替换某一层的实现不影响其他层,例如把 TCP 换成 UDP,上层应用逻辑无需改动 |
| 实现复用 | 多个应用协议共享同一套下层实现,例如 HTTP 与 SNMP 共用 IP |
| 故障定位 | 报文未到达可逐层排查:应用层未收到则查上层,链路层不通则查下层 |
代价是每层添加首部带来额外开销,以及相邻层之间的接口需要额外设计。
"某个协议工作在第几层"这一问题,本质上是在问:该协议定义的报文格式属于哪一层的协议规范,由哪一层的实现负责收发。 判定方法见 1.3。
1.2 从 OSI 七层模型到 TCP/IP 四层模型
OSI 模型由国际标准化组织提出,是七层的参考模型。它把应用层的职责细分为应用层、表示层、会话层三层,理论结构完整,但没有对应到一套实际运行的协议族。
TCP/IP 模型是互联网实际采用的划分,层数更少,层与层之间的界线划在协议实现之上。下图给出两者的对应关系。
收敛规则有三条:
| 规则 | 说明 |
|---|---|
| 三层合并 | OSI 的应用层、表示层、会话层合并为 TCP/IP 的应用层 |
| 名称替换 | OSI 的网络层在 TCP/IP 模型中称为网际层,两者是同一层 |
| 两层合并 | OSI 的数据链路层与物理层合并为网络接口层 |
合并的工程原因在于实际的 TCP/IP 协议族没有严格区分表示与会话的职责:TLS 承担了部分表示层的功能,连接复用与状态管理承担了部分会话层的功能,强行分开只会增加接口复杂度。
1.3 判定协议所属层次的三条依据
遇到"某协议工作在第几层"的问题时,按下列三条依据依次检查,三条一致即可确定层次。
| 依据 | 检查内容 | 指向应用层的判据 |
|---|---|---|
| 依据一 报文格式 | 该协议定义的报文结构属于哪一类数据单元 | 报文由版本号、团体名、操作单元等应用语义字段构成,不是传输层首部结构 |
| 依据二 收发主体 | 该协议由操作系统的哪一部分实现 | 由用户态进程收发,不属于内核提供的传输功能 |
| 依据三 依赖的服务层 | 该协议借助哪一层完成端到端传输 | 借助 UDP 完成传输,只说明它依赖传输层服务 |
第三条最容易被误读。使用某层的服务与属于该层是两件不同的事。 判定归属要看依据一与依据二,依据三只能说明依赖关系。
以 SNMP 为例,三条依据的验证过程如下:
二、TCP/IP 四层模型
本章是全文的主干。第三章以 SNMP 为例展开应用层协议内部的组织方式,第四章的示例也以跨层的完整路径为主。
2.1 四层模型的划分
上表列出四层模型自上而下的四层及其职责。四层之间是相邻服务关系,上层调用下层提供的接口,不需要了解下层的实现细节。
| 层次 | 英文名称 | 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 |
三点需要注意:
- 端口号属于传输层的地址空间。 TCP 与 UDP 用端口号把数据交给本机的目标进程,应用层协议借用这一机制定位服务进程。端口号的所有权不改变应用层协议的层次归属。
- 同一端口号在不同传输层协议中可以复用。 53 号端口在 UDP 上属于 DNS,在 TCP 上属于与 DNS over TLS 相关的服务,两者是不同协议的监听端口。
- 响应通常从临时端口发出。 服务端监听固定端口,收到请求后以一个临时端口作为源端口回应,因此响应报文的源端口与目的端口通常对调。
三、应用层协议实例 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 体系由四类角色构成:
| 角色 | 中文名 | 所在位置 | 职责 |
|---|---|---|---|
| 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 的操作类型
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(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 查询的完整旅程
以读取某台交换机的设备名称为例,完整过程跨越协议栈全部五层,是第二章各层知识的一次综合运用。
逐步说明如下:
| 步骤 | 所在层 | 动作 |
|---|---|---|
| 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 |
应用层 |
三点说明:
- 传输层只有两个协议。 表中 UDP 与 TCP 之外的所有协议,都在使用或定义在传输层之上。
- ARP 的归类存在两种说法。 它的报文同时含 IP 地址与 MAC 地址,作用范围却仅限本链路。TCP/IP 模型中通常把它归入网络接口层;按 OSI 的划分则归入网络层。两种说法都指同一个协议。
- 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 的配合
轮询与 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 核心要点回顾
- 分层把寻址、可靠传输、路由等职责解耦,各层只向上层提供服务、只依赖下层接口。
- OSI 七层模型收敛为 TCP/IP 四层:三层合并为一层,两层合并为一层,网络层更名为网际层。
- 教材常用的五层划分把网络接口层拆为数据链路层与物理层,内容与四层一致。
- 数据单元是分层最直观的标识:报文、报文段、分组、帧、比特自上而下逐层变大。
- 封装是加首部的过程,解封装是剥离首部的过程,二者方向相反。
- 各层首部解决不同问题:端口号定位进程,IP 地址定位主机,MAC 地址定位下一跳。
- MAC 地址作用域为单条链路,IP 地址贯穿整条路径,端口号只在终点主机有效。
- 传输层协议只有 TCP 与 UDP 两种,因此凡使用它们的协议必定位于传输层之上。
- 判定协议层次的三条依据是报文格式、收发主体、依赖的服务层,其中第三条只能说明依赖关系。
- SNMP 是应用层协议:报文为应用语义结构,由用户态进程
snmpd收发,借助 UDP 完成传输。 - SNMP 体系由管理站、代理、MIB、被管对象四类角色构成,两端的 SNMP 实体对等通信。
- 报文首部含版本号与团体名,PDU 含请求标识、错误状态、错误下标与变量绑定表。
- 变量绑定表允许一次请求携带多个对象,是 SNMP 批量读取的基础。
- SNMPv1 有五种基本操作,v2c 增加 GetBulk、Inform、Report,v3 引入 USM 与 VACM。
- OID 是树中节点到根的点分十进制路径,标量对象末尾追加 0 表示唯一实例。
- 请求发往代理的 UDP 161,Trap 发往管理站的 UDP 162,端口号属于传输层地址空间。
- SNMP 选择 UDP 是为降低开销与时延,可靠性由请求标识与超时重传在应用层弥补。
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 到告警的转换规则、抑制与收敛策略 |

浙公网安备 33010602011771号