免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

QoS报文分类与标记:从原理到配置实战

QoS报文分类与标记:从原理到配置实战 做网络这一行天天跟 QoS 打交道但很多朋友对“报文分类和标记”的理解还停留在“用 ACL 匹配一下然后 remark”这一步。实际上分类和标记是整个 QoS 体系里最前置、最关键的环节——你后面队列调度做得再花哨前面报文没分对、没标好一切都白搭。这篇是 QoS 系列的第二篇上一篇聊了基础概念和整体框架这篇我们聚焦在最核心的“分类 标记”两个动作上。我会从原理讲起再到两种最常见的配置场景最后把我这些年踩过的坑和排查思路一起抖出来。不管是刚入门的新手还是被 QoS 折磨过的老鸟这篇都能给你点实在的东西。1. 先搞清楚报文分类和标记到底解决什么问题很多刚接触 QoS 的同学会有一个困惑报文在网络上跑得好好的为什么要费劲去分类、还要打标记这个问题的答案得从网络拥塞的本质说起。1.1 网络拥塞时的“众生平等”困境假设一台交换机只有 1Gbps 的出口带宽但下面接了 10 个业务网段每个网段都往外出 200Mbps 的流量出口瞬间就拥塞了。拥塞意味着什么意味着数据包要在设备里排队排队就要等等就要产生时延和丢包。这时候问题来了视频会议的数据包和员工下载大文件的数据包在交换机看来都是一样的“以太网帧”它不会因为你开的是视频会议就给你优先转发。如果拥塞严重视频会议的画面就会花屏、卡顿语音断断续续而另一边的大文件下载只是慢一点而已用户根本感知不到。QoS 的核心价值就是在拥塞发生时“偏心”——让关键业务优先通过让非关键业务往后靠。但设备怎么知道哪个包是视频会议的、哪个包是下载的这就需要“分类”。1.2 分类和标记在整个 QoS 体系里处于什么位置QoS 完整的处理流程我习惯归纳成三步分类标记、队列调度、拥塞避免。分类标记是第一步也是最基础的一步它决定了后续所有动作的“依据”。可以把分类标记理解成给旅客贴标签机场安检时头等舱旅客会被贴上红色标签经济舱旅客贴蓝色标签无行李的贴绿色标签。等到了登机口排队地勤一看标签就知道让谁先上。报文分类标记就是这个贴标签的过程而队列调度就是登机口的“按标签放行”。标记还有一个非常重要的意义——跨设备传递。报文从接入层交换机一路走到核心路由器如果每一跳设备都重新做一次深度报文检测不仅性能扛不住而且不同设备对“视频流量”的识别方法可能还不一样很容易出现前一台设备认为是视频、后一台设备认为是普通流量的情况。但如果在接入层就做好分类并把这个结论标记在报文头上后面所有设备只需要读标记就行既省性能又保证策略一致。2. 报文分类的两条路线简单匹配与复杂流分类报文的分类方法按识别复杂度可以大致分成两类简单流分类和复杂流分类。这个“简单”和“复杂”不是贬义和褒义而是指匹配的深度和维度不同。2.1 简单流分类看“外衣”就能认人简单流分类就是根据报文的头部字段来做匹配。这些字段都是报文自带的“外衣”不需要拆开报文内部去看内容。常用的匹配字段有这几类分类维度常见匹配字段实用场景二层字段源/目的 MAC、VLAN ID、802.1p 优先级区分不同终端设备、不同 VLAN 的业务三层字段源/目的 IP、DSCP/IP 优先级、协议号区分服务器网段、终端网段、特定协议流量四层字段源/目的端口号匹配特定应用如 5060 端口的 SIP 语音接口入接口、出接口按物理位置区分信任/非信任区域这种分类方式优点是快因为只需要读取报文头部几十个字节硬件可以线速处理缺点是不够精准比如邮件系统走的是 TCP 25/110/143 等端口但你不能保证只有邮件系统在用这些端口。不过对于大多数园区网和接入层的需求来说简单分类完全够用了。2.2 复杂流分类拆开“内里”看内容复杂流分类就不只看头部了它还要检查报文的数据载荷部分比如通过应用层特征来识别 HTTP 里的特定 URL、识别视频会议软件的音视频流。这种方式在 NGFW下一代防火墙、应用识别网关这类设备上很常见。复杂流分类的优点是真的精准能识别到具体的应用比如抖音的流量、Teams 的流量缺点是性能开销大设备需要做深度的报文解析处理能力跟不上时会成为瓶颈。另外如果流量做了加密现在很多应用都是 TLS 加密流量复杂流分类的效果也会大打折扣。对于交换机、路由器上的 QoS 实践我个人的建议是能用简单分类解决的绝对不用复杂分类。接入层做好基于 IP、端口、VLAN 的分类核心层基于 DSCP 分类这样整网 QoS 的“骨架”就搭起来了。复杂分类留给防火墙和应用识别设备去补充细节各司其职性能也最平衡。3. 报文标记的三种“颜料”IP优先级、DSCP、802.1p分类完成之后要把分类的结果“写”到报文里这个动作就是标记。标记的本质是修改报文头部的特定字段。我们常说的“打标记、remark、重新标记”操作的都是这几个字段。3.1 IP 优先级IP PrecedenceIPv4 报文头里的老前辈IPv4 报文头的第二个字节TOS 字节里高 3 位是 IP Precedence 字段取值范围 07。IP Precedence 的 07 取值里6 和 7 是保留的用于网络控制实际可用的是 05分别对应 Routine、Priority、Immediate、Flash、Flash Override、Critical。IP Precedence 在早期 QoS 里用得很广它的问题是粒度太粗只有 8 个值实际用 6 个而且没有统一的语义规范——有的设备认为 5 是语音有的认为 3 是语音跨厂商联动容易出问题。3.2 DSCP把 3 比特扩展成 6 比特DSCPDifferentiated Services Code Point差分服务代码点是对 TOS 字节的重新定义。它使用整个 TOS 字节的前 6 位取值范围 063后 2 位保留ECN 使用。DSCP 的出现就是为了解决 IP Precedence 粒度不足的问题。DSCP 最有价值的点在于它定义了一套标准化的 PHB逐跳行为也就是“约定好的处理方式”类别DSCP 值用途EF加速转发460x2E低时延、低抖动语音流量首选AF1x~AF4x确保转发10/12/14、18/20/22...分四个等级适合数据业务分级CSx类别选择8/16/24/32/40/48兼容老 IP Precedence 的映射BE尽力而为0默认等级所有没被打标的标准流量这里要特别注意 DSCP 和 IP Precedence 的换算关系。IP Precedence 取值为 07对应到 DSCP 里就是 CS0CS7具体算法是IP 优先级值乘以 8就得到对应的 DSCP 值。比如 IP Precedence 5 对应 DSCP 40CS5EF 是 46而语音通常用 EF46或者 CS540这两个值在不少场景下会混用一定要分清楚。3.3 802.1p二层报文头的优先级标记802.1p 优先级存在于 VLAN Tag 里的 Priority 字段占用 3 bit取值范围 07。这个字段只对带 VLAN Tag 的二层报文有意义主要用于交换机二层转发时的优先级区分。注意一点802.1p 是二层字段出了三层路由器就被剥离了不能跨三层传递。所以如果你的网络需要跨路由传递优先级就必须把 802.1p 映射成 DSCP让三层设备认 DSCP。这也是很多园区网做 QoS 时容易忽略的环节——接入交换机打了 802.1p但路由器只看三层结果优先级到了路由器就断了。3.4 内部优先级设备内部的“记账本”除了报文头里这三个真正写到报文里的字段设备内部还有一层“内部优先级”有的是 8 个队列有的是 16 个队列。报文进入设备后设备会根据映射规则把 DSCP / 802.1p 映射到内部的某个队列编号后续的队列调度、拥塞避免都是基于这个内部队列编号来做的。这个映射关系很重要因为不同厂商的映射表可能有差异。比如华为设备里 DSCP 到本地优先级07有默认映射表思科设备也有自己的映射。你在做跨厂商对接时一定要看两边的映射表对不对得上否则这边标 EF 的流量到那边可能就被映射到普通队列了。4. 实操三种典型的标记配置场景原理讲再多不如上手跑一遍。下面我用模拟器环境做几个典型的配置示例以常见的华为 VRP 风格命令为例。不同厂商命令有差异但思路是通用的。4.1 场景一接入层把语音流量打上 EF 标记这是最典型、也最简单的场景有一台接入交换机下联口接的是 IP 话机语音流量需要从其他流量中区分出来优先转发。我们在入方向做标记这样交换机从下联口收进来语音包时就给它打上 DSCP EF。# # 定义流分类匹配协议类型为 RTP 的 UDP 流量 # 简单起见这里按端口范围匹配 RTP 的动态端口常见为 16384-32767 # acl number 3001 rule 5 permit udp destination-port range 16384 32767 # traffic classifier voice if-match acl 3001 # # 定义流行为标记 DSCP 为 EF # traffic behavior mark-ef remark dscp ef # # 定义流策略将分类和行为绑定 # traffic policy voice-input classifier voice behavior mark-ef # # 在下联口入方向应用 # interface GigabitEthernet0/0/1 traffic-policy voice-input inbound配置过程三步走建 ACL 匹配感兴趣流量建类绑定 ACL建行为做标记最后把策略挂到接口上。注意remark dscp ef等价于remark dscp 46只是写法不同。这个场景的关键点在于一定要在“入方向”打标。如果语音流量进来时不打标等它进入交换矩阵排队时队列调度根本不知道它是谁出方向的标记再怎么打也都是事后诸葛亮。4.2 场景二基于用户网段的重标记 DSCP有些网络里接入层可能已经打了标记但管理员觉得标记不合理需要重新标记。比如原来所有流量都被打成了 AF21但老板要求财务系统走 AF31这就需要在某台汇聚设备上做一次“重标记”remark。重标记的逻辑和前面类似只是匹配条件变了# # 匹配财务系统服务器的目的 IP # acl number 3002 rule 5 permit ip destination 192.168.20.0 0.0.0.255 # traffic classifier finance if-match acl 3002 # traffic behavior remark-finance remark dscp af31 # traffic policy finance-policy classifier finance behavior remark-finance # interface GigabitEthernet0/0/2 traffic-policy finance-policy inbound重标记最讲究的是“信任谁、不信任谁”的问题。如果接入层设备是自己管理的、策略是可信的那上游设备最好直接信任入方向标记不要再重标如果接入层设备不可控比如有用户私接交换机那汇聚/核心层必须做重标记把不可信方向的标记全部清零或重写。4.3 场景三信任模式切换在很多交换机上接口默认信任报文自带的优先级trust 模式但有的场景下需要改为信任 DSCP或者干脆忽略报文的标记统一按端口优先级处理。这个“信任模式”的配置非常关键因为它决定了你的标记能不能“传得下去”。# # 接口 GE0/0/1信任 DSCP不做重标记 # interface GigabitEthernet0/0/1 trust dscp # # 接口 GE0/0/2忽略报文自带优先级统一按 802.1p 5 处理 # interface GigabitEthernet0/0/2 port priority 5 undo trust信任模式设错是 QoS 配置里最容易出问题的环节之一。我见过不少网络明明分类和标记都配了但因为是默认 trust 模式接入交换机收到报文时根本不看你标记的 DSCP直接把外部报文自带的优先级当宝贝一样信了最后队列调度全乱。所以配置完一定要确认每个接口的信任模式是符合预期的。5. 踩坑实录与排查技巧配置一时爽排障火葬场。QoS 分类标记这块的坑我踩过不少总结了几个最常见的希望能帮你省点时间。5.1 只分类没标记队列调度全是空的排障时最绝望的是ACL 配置了、策略也绑定了、接口也生效了但队列调度就是没效果关键业务还是卡。排查到最后发现整个策略里只做了traffic classifier和if-match但行为里面忘记写remark了。分类只是“认出来”标记才是“写上去”没写上去等于白忙活。还有个更隐蔽的版本分类匹配规则写反了。比如要匹配财务网段结果 ACL 里写的是permit ip source 192.168.20.0 0.0.0.255但实际财务网段是 10.10.20.0/24。这种错误用display traffic-policy applied-record能看到策略计数但如果匹配数为 0大概率就是 ACL 条件写偏了。5.2 DSCP 和 IP Precedence 的换算错误很多网工在配置跨厂商对接时会把 DSCP 和 IP Precedence 混为一谈。比如对端厂商的设备上显示ip precedence 5你在这边配置时想保持一样下意识写成了remark dscp 5结果 DSCP 5等价于 CS1 和 IP Precedence 1跟 IP Precedence 5 差了十万八千里。记住这个换算公式IP Precedence 乘以 8 就等于对应的 DSCP CS 值。IP Precedence 5 → DSCP CS540语音常用的 EF 是 46不是 40也不是 48。配置 DPDK、抓包分析时看到 ToS 字节的值也要会换算比如 ToS 0xB8 对应的就是 DSCP EF0x2E。5.3 二层 802.1p 三层的 DSCP 脱节这是园区网最常见的“断层”接入交换机给语音流量打了 802.1p 6但流量到了三层路由设备后路由器根本不看 802.1p直接按默认 0 处理语音优先级瞬间归零。原因是 802.1p 是二层标记路由器路由转发时要把二层头剥掉重封标记自然就丢了。解决办法是在接入交换机或者汇聚交换机上做一层映射把 802.1p 映射成 DSCP或者统一在接入层就把语音流标记成 DSCP EF让三层设备直接认 DSCP。最怕的就是各层用的标记不一致接入层打 802.1p汇聚层改成 IP Precedence核心层又只看 DSCP最后整条链路优先级一直在“翻译”中损耗。5.4 常见的排查命令和思路QoS 排障一定要看计数器特别是匹配计数器。以华为设备为例几个常用命令要记牢# 查看策略在接口上的应用情况和匹配统计 display traffic-policy applied-record # 查看指定接口入方向/出方向的统计信息 display traffic-policy statistics interface GigabitEthernet0/0/1 inbound # 查看 ACL 匹配计数确认流量是否命中规则 display acl 3001 # 查看接口当前的信任模式和队列统计 display qos trust interface GigabitEthernet0/0/1 display qos queue statistics interface GigabitEthernet0/0/1排查思路我习惯是这样先确认“流量是否被识别到”看 ACL 计数再确认“识别后是否被正确标记”抓包看 DSCP 字段或者看流策略计数最后再确认“标记后是否映射到了预期的队列”看队列统计。抓到关键点了可以直接在接口上开启抓包或者用镜像端口把报文引出来看。抓包时注意看 IP 头的 ToS 字节0x2E 是 EF0x00 是 BE0x28 是 CS5也就是 IP Precedence 5。如果抓包看到 ToS 是 0x00说明标记没生效问题出在标记这一环别浪费时间往后端查。6. 把分类和标记做成全局规划而不是逐台碰运气写到这里我特别想强调一件事报文分类和标记不要“哪台设备有需求就配哪台”而是要站在全网视角做统一规划。我在实际项目里见过太多网络因为各层设备各配各的优先级标记链断裂最后 QoS 形同虚设。我的经验是规划分类标记策略时至少要理清这四件事第一全网分成几个信任域哪些设备是可信的、标记可以信任哪些设备是半信半疑的、需要重标记第二定义一套统一的三层 DSCP 标记规范比如语音用 EF、视频用 AF41、重要数据用 AF31、普通业务用 AF21、默认用 BE全公司按这个标准走第三明确二层 802.1p 向三层 DSCP 的映射关系保证跨三层不“断标”第四在接入层做好“第一跳标记”在汇聚层做好“边界重标记”核心层尽量只调度不重标减少处理开销。这套规范一旦定下来后面新增设备时照着套就可以不用每台设备都临时想。分类和标记做扎实了后面的队列调度才不是空中楼阁。下一篇我计划聊聊队列调度——也就是报文打好标签之后设备内部怎么按标签分配带宽和优先级欢迎继续关注。
返回列表