📚 第五章 IP协议相关技术
📄 一句话概括

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 秒实验

  1. 算一下:一条 200 Mbps 链路,按 5/30/50/15 分,各是多少?
  2. 想一下:为什么链路空闲时 QoS 完全不起作用?
  3. 想一下:为什么「控制协议」要单独留一档优先级?

常见误区

  1. 以为「QoS 能增加带宽」。 它只分配稀缺,总容量不变。
  2. 以为「标了 DSCP 就一定有优先」。 路上设备不认就等于没标,跨运营商要靠合同。
  3. 以为「严格优先最省事」。 能把低优先级饿死,实际多用带优先级的加权。
自测三问(点开对答案) 1. QoS 的两类手段是什么? —— **分类(打 DSCP 标记)和排队(FIFO、PQ、WFQ 这些调度算法)。** 2. 为什么承诺的带宽总和不能超过链路容量? —— **超了就必定有某一档拿不到承诺**,拥塞时谁被牺牲是随机的。 3. 什么时候 QoS 完全没意义? —— **链路不拥塞的时候**,包来了就走,队列根本用不上。

下一节讲一个「不丢包也能报拥塞」的机制:ECN。

相关笔记