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,因为外部域的标记策略不可控。
信任边界的本质是“责任划分”:边界设备负责把不可信流量归一化为可信标记,边界内设备只做快速转发。若边界设置过深,核心设备要承担大量分类工作;若设置过浅,则可能信任了不该信任的标记。
四、标记策略设计示例
下面给出一套适用于典型三层数据中心的标记策略示例,参数为教学假设值,实际部署需结合业务 SLA 调整。策略按“业务类型 → DSCP → 队列”三层映射设计:
| 业务类型 | 匹配条件(示例) | DSCP | CoS | 队列 |
|---|---|---|---|---|
| 存储 / 低时延 | TCP 3260、RoCE 流量 | EF (46) | 5 | 高优先级队列 |
| 语音 / 视频 | UDP 16384-32767 | AF41 (34) | 4 | 实时队列 |
| 关键业务 Web | TCP 443、80 | AF31 (26) | 3 | 业务保障队列 |
| 数据库同步 | TCP 1521、3306 | AF21 (18) | 2 | 中优先级队列 |
| 普通办公 | 其他 TCP/UDP | 0 | 0 | 默认队列 |
| 备份 / 大流量 | TCP 22、873 | CS1 (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 是否把不该匹配的流量纳入。排障时建议先确认“标记是否打上”,再确认“队列是否按标记调度”,把分类问题和调度问题分开定位,能显著缩短排查时间。