3. 流量分类与标记

在 Nexus 数据中心里,QoS 能否真正生效,第一步并不在队列或调度器,而在“流量是否被正确识别并打上可信标记”。如果分类和标记阶段出错,后续所有队列、带宽、丢弃策略都会作用在错误的流量上。本节围绕四个标记字段、ACL/class-map 匹配机制,以及信任边界的划分方法展开,并给出一套可落地的标记策略设计思路。

一、四个标记字段的定位与差异

数据中心常见的三层标记字段是 IP 优先级(IP Precedence,3 bit)、DSCP(6 bit) 和 CoS(802.1p,3 bit),此外还有 MPLS EXP 等,但在纯以太网 Nexus 场景中主要关注前三者。它们的关键差异在于“承载位置”和“可见范围”:

  • IP 优先级:位于 IPv4 ToS 字节高 3 位,取值 0~7,是 DSCP 的前身,粒度粗,现代数据中心一般不再单独使用,但兼容旧设备时仍需识别。
  • DSCP:位于 ToS 字节高 6 位,取值 0~63,是三层标记的核心。常用值包括 EF(46)、AF41(34)、AF31(26)、AF21(18)、CS6(48)、CS7(56)、默认 0。DSCP 可跨三层设备传递,是端到端 QoS 的主标记。
  • CoS:位于 802.1Q 标签的 PCP 字段,3 bit,取值 0~7,只在二层链路本地有效。当报文经过三层路由或标签被剥离后,CoS 通常丢失,因此 CoS 更适合作为“接入侧临时标记”,进入核心前应映射为 DSCP。

需要特别注意的是,DSCP 与 IP 优先级存在位重叠关系:DSCP 的高 3 位恰好等于 IP 优先级。例如 DSCP 46(EF)的高 3 位为 101,即 IP 优先级 5。理解这一点,有助于在混合环境中做映射时避免冲突。

二、ACL 与 class-map 的匹配机制

Nexus 上分类的核心工具是 class-map,它通过 match 语句引用 ACL、DSCP、CoS 或协议字段。匹配逻辑遵循“自上而下、首次命中即停止”的原则,因此顺序设计直接决定分类结果。

ip access-list QOS-WEB
  10 permit tcp any any eq 443
  20 permit tcp any any eq 80

class-map type qos match-any CM-WEB
  match access-group name QOS-WEB
  match dscp af31

class-map type qos match-all CM-DB
  match access-group name QOS-DB
  match cos 4

policy-map type qos PM-MARK
  class CM-WEB
    set dscp af31
  class CM-DB
    set dscp af21
  class class-default
    set dscp 0

这里有两个容易踩坑的点。第一,match-any 表示“任一条件命中即匹配”,match-all 表示“全部条件同时满足才匹配”,二者语义相反,写错会导致分类范围被放大或缩小。第二,ACL 中 permit 在 class-map 语境下表示“匹配”,并不代表放行或丢弃,真正的丢弃动作由 policy-map 的 police 或 drop 决定。很多初学者看到 permit 就以为流量被允许,这是常见误解。

另外,Nexus 的 QoS policy 分为 type qos(分类标记)和 type queuing(队列调度)两类,前者负责“打标签”,后者负责“按标签调度”。分类阶段只改标记,不改变转发行为,这一点在排障时要牢记。

三、信任边界的设计

信任边界(Trust Boundary)指的是“从哪一点开始,设备信任报文自带的标记”。边界之外,标记不可信,需要重新分类;边界之内,标记可信,直接沿用。数据中心常见的三种边界位置:

  • 接入交换机端口:服务器直连端口设为 untrusted,由交换机根据 ACL/端口角色重新打标,防止服务器伪造高优先级标记抢占带宽。
  • 汇聚/核心上行口:设为 trusted,信任来自接入层的 DSCP,避免重复分类带来的性能开销。
  • 跨域互联口:如 DCI 或与 WAN 对接,通常重新设为 untrusted,因为外部域的标记策略不可控。

信任边界的本质是“责任划分”:边界设备负责把不可信流量归一化为可信标记,边界内设备只做快速转发。若边界设置过深,核心设备要承担大量分类工作;若设置过浅,则可能信任了不该信任的标记。

信任边界与标记策略:从接入到核心的标记流转 服务器 自带标记不可信 DSCP/CoS 可伪造 接入交换机(边界) 端口 untrusted ACL + class-map 重分类 set dscp af31 / af21 CoS → DSCP 映射 policy-map type qos 汇聚 / 核心 上行口 trusted 信任 DSCP 不再重分类 按 DSCP 入队调度 policy-map type queuing 外部域 / DCI 重新 untrusted 标记不可控 信任边界 域边界 标记字段速查 DSCP(6 bit) 三层,端到端主标记 CoS(3 bit) 二层,链路本地有效 IP 优先级(3 bit) DSCP 高 3 位,兼容用 class-map match-any / match-all

四、标记策略设计示例

下面给出一套适用于典型三层数据中心的标记策略示例,参数为教学假设值,实际部署需结合业务 SLA 调整。策略按“业务类型 → DSCP → 队列”三层映射设计:

业务类型匹配条件(示例)DSCPCoS队列
存储 / 低时延TCP 3260、RoCE 流量EF (46)5高优先级队列
语音 / 视频UDP 16384-32767AF41 (34)4实时队列
关键业务 WebTCP 443、80AF31 (26)3业务保障队列
数据库同步TCP 1521、3306AF21 (18)2中优先级队列
普通办公其他 TCP/UDP00默认队列
备份 / 大流量TCP 22、873CS1 (8)1低优先级队列

设计时遵循三条原则。第一,高优先级标记数量要少:EF 和 AF4x 只留给真正需要低时延的业务,否则高优先级队列会被挤满,失去意义。第二,标记要可追溯:每个 DSCP 值应对应明确的业务类别,便于后续用 show policy-map interface 统计各类流量。第三,边界统一归一化:所有进入核心的流量都应携带一致的 DSCP,避免同一业务在不同接入点被打成不同标记。

五、验证与排障要点

标记策略上线后,可用以下命令验证分类是否命中:

show policy-map interface ethernet1/1
show class-map type qos
show ip access-lists QOS-WEB
show qos statistics interface ethernet1/1

重点观察 show policy-map interface 输出中每个 class 的匹配报文计数。如果某个 class 计数为 0,通常说明 ACL 未命中、class-map 顺序被前面的 class 拦截,或流量方向与 policy 应用方向不一致。若计数异常偏高,则要检查 match-any 是否把不该匹配的流量纳入。排障时建议先确认“标记是否打上”,再确认“队列是否按标记调度”,把分类问题和调度问题分开定位,能显著缩短排查时间。

信任边界不是越靠核心越好。把边界放在接入层,可以让核心设备只做快速转发;把边界放在核心,则核心要承担全量分类,性能开销和配置复杂度都会上升。设计时应根据接入设备能力和业务规模权衡。