QoS 只有两类手段:分类和排队——先给包打标记,再决定谁先走。 两条纪律:不能超订,而且只在拥塞时才有意义。
3.x 讲了链路的带宽是有限的,这一节讲「不够的时候怎么分配」。 5.8.4 的 ECN 是它的搭档,一个管「排队」,一个管「告诉对方慢一点」。
一、先看四个指标
「网络好不好」不是一个数,是四个数:
| 指标 | 含义 | 最怕它的业务 |
|---|---|---|
| 带宽 | 每秒能过多少 | 下载、备份 |
| 延迟 | 一个包要多久到 | 网页、游戏 |
| 抖动 | 延迟稳不稳 | 语音、视频 |
| 丢包 | 多少包没到 | 所有业务,TCP 尤其 |
第三行最容易被忽略:语音不怕「一直慢 100 毫秒」,怕「一会儿 20、一会儿 300」。 因为接收端要按节奏播放,抖动大了就得丢帧或者加缓冲,而加缓冲又会让延迟变大——两头堵。 这四行也解释了「为什么 QoS 不能解决所有问题」: 它管的是「排队顺序」,管不了「链路本身抖动」。 链路质量差,QoS 只能让「重要的先坏」,不能让它不坏。
二、分类:DSCP
分类就是「在包头里写一个优先级」:IP 首部里专门有 6 位,叫 DSCP,能分 64 档。
| DSCP | 含义 | 典型用途 |
|---|---|---|
| 46(EF) | 加速转发 | 语音 |
| 34(AF41) | 保证转发 | 视频 |
| 0(BE) | 尽力而为 | 普通数据 |
| 8(CS1) | 最低档 | 批量备份 |
第一行「46」这个数看着随意,其实有讲究: 它的高 3 位是 101,和老的 IP 优先级字段兼容—— 这样老设备即使不认识 DSCP,也能按「优先级 5」处理。 这种「向后兼容」的设计在协议里到处都是。 但标记有一个前提:路上所有人都得认。 出了自己的网,别人可能不认,甚至会把标记抹掉重写—— 所以「跨运营商的 QoS」基本靠合同(SLA),不靠技术。 这也是「QoS 只能在自己管的网里做」的原因。
三、排队:三种调度
标记只是「标签」,真正决定顺序的是队列调度:
| 算法 | 怎么排 | 毛病 |
|---|---|---|
| FIFO | 先来先走 | 谁都不能优先 |
| PQ(严格优先) | 高优先级永远先走 | 能把低优先级饿死 |
| WFQ(加权公平) | 按权重分带宽 | 配权重费心思 |
第二行的「饿死」不是夸张:只要高优先级的流量持续超过链路容量,低优先级就一个包都发不出去。 所以实际设备里更常见的是「带优先级的加权」—— 高优先级拿到保证带宽,剩下的按权重分,谁也不至于完全没得用。 第三行的「费心思」也是真事:权重配错了,等于把带宽分给了不重要的业务, 而这种错误「平时看不出来,一出事就放大」。
四、两条纪律
第一条:不能超订。 承诺的带宽总和超过链路容量,等于什么都没承诺——因为拥塞的时候,谁也拿不到自己那份。 所以「给语音 10%、视频 40%、数据 40%、其他 10%」这种分配,加起来必须正好 100%。 第二条:只在拥塞时有意义。 链路空闲的时候,标记和队列都不起作用——包来了就走,根本没排队。 所以「带宽够就别折腾 QoS」这句话是对的,而且折腾错了还会引入新问题(比如把控制协议误分类, 导致路由抖动)。 换个角度说:QoS 是「分配稀缺」的工具,不是「增加总量」的工具。 真缺带宽,唯一的办法是加带宽或者减流量,QoS 只能保证「加不了的时候,重要的那部分还能用」。
五、动手 Demo:QoS 就是排队和插队
按 10/40/40/10 分一条 100 Mbps 的链路,看加起来是不是正好 100。 这是「不能超订」这条纪律的具体算法。
total = 100
for name, pct in (('语音', 10), ('视频', 40), ('普通数据', 40), ('其他', 10)):
print('%-6s %2d%% %d Mbps' % (name, pct, total * pct // 100))
实跑输出:
--------------------------------------------------------------------
QoS 就是排队和插队
--------------------------------------------------------------------
**QoS 的全部手段就两类**:**分类(打标记)和排队(决定谁先走)。**
**没有第三种魔法。**
**分类靠 DSCP**:**首部里 6 位,能分 64 档**。
DSCP 含义 典型用途
-------------------------------------------------
**46(EF)** **加速转发** **语音**
**34(AF41)** **保证转发** **视频**
**0(BE)** **尽力而为** **普通数据**
**8(CS1)** **最低档** **批量备份**
**排队靠调度算法**,常见三种:**FIFO(先来先走)、PQ(严格优先)、WFQ(按权重分)。**
**严格优先的风险是「高优先级的流把别人饿死」**——**所以实际多用「带优先级的加权」。**
**算一个具体的分配**:
类别 占比 100 Mbps 链路上的带宽
--------------------------------------------
语音 10% 10 Mbps
视频 40% 40 Mbps
普通数据 40% 40 Mbps
其他 10% 10 Mbps
**加起来正好 100 Mbps**:
**QoS 的第一条纪律就是「不能超订」**——**承诺的总和超过链路带宽,等于什么都没承诺。**
**第二条纪律是「只在拥塞时有意义」**:
**链路空闲时,标记和队列都不起作用**——**所以「带宽够就别折腾 QoS」是对的。**
「加起来正好 100」不是巧合,是刻意的:只要有一档超了,就必定有另一档拿不到承诺的带宽, 而「哪一档被牺牲」在拥塞时是随机的。 真实的配置里还会留一点余量: 比如只承诺 80%,剩下 20% 不分配——这样突发流量有地方去,不会立刻触发丢弃。 「一点不留」看起来很公平,实际最先出问题。 最后一个观察:这张表里没有「控制协议」这一行, 而它必须单独留一档—— 因为路由协议、ARP、DHCP 这些包一旦被排队排到后面,整张网会「越拥塞越乱」, 这叫「控制平面被数据面挤死」。
30 秒实验
- 算一下:一条 200 Mbps 链路,按 5/30/50/15 分,各是多少?
- 想一下:为什么链路空闲时 QoS 完全不起作用?
- 想一下:为什么「控制协议」要单独留一档优先级?
常见误区
- 以为「QoS 能增加带宽」。 它只分配稀缺,总容量不变。
- 以为「标了 DSCP 就一定有优先」。 路上设备不认就等于没标,跨运营商要靠合同。
- 以为「严格优先最省事」。 能把低优先级饿死,实际多用带优先级的加权。
自测三问(点开对答案)
1. QoS 的两类手段是什么? —— **分类(打 DSCP 标记)和排队(FIFO、PQ、WFQ 这些调度算法)。** 2. 为什么承诺的带宽总和不能超过链路容量? —— **超了就必定有某一档拿不到承诺**,拥塞时谁被牺牲是随机的。 3. 什么时候 QoS 完全没意义? —— **链路不拥塞的时候**,包来了就走,队列根本用不上。下一节讲一个「不丢包也能报拥塞」的机制:ECN。
- ☐ (本节完,下一节 5.8.4 显式拥塞通知)