802.1Q标签的TCI字段中,Priority占3bit
报文携带的802.1p CoS → 交换机内部本地优先级 → 硬件队列号
cos的优先级及对应的报文:
| 802.1p值 | IEEE推荐业务 | 华为内部优先级→队列 | H3C S125-X默认队列 |
|---|---|---|---|
| 0 | Best Effort(普通数据) | BE → Q0 | Q2← 反例 |
| 1 | Background | AF1 → Q1 | Q0← 反例 |
| 2 | Excellent Effort | AF2 → Q2 | Q1← 反例 |
| 3 | Critical Applications | AF3 → Q3 | Q3 |
| 4 | Video(流媒体) | AF4 → Q4 | Q4 |
| 5 | Voice(VoIP) | EF → Q5 | Q5 |
| 6 | Internetwork Control(OSPF等) | CS6 → Q6 | Q6 |
| 7 | Network Control(BGP等) | CS7 → Q7 | Q7 |
数字越大优先级越高,这也是802.1p、IP Precedence、MPLS EXP共通的一致约定。
队列管理:
一、RED方法:
1. 简介
RED方法:Random Early Detection(随机早期检测),是一种主动式队列管理算法,用来避免网络拥塞。
简单说:路由器/交换机在队列还没满时,就随机丢弃少量数据包,提前通知发送端“要慢了”,从而避免队列填满后大量丢包。
传统尾部丢弃是队列满了之后,新来的包全部丢掉。这种方法容易造成所有 TCP 连接同时感受到丢包、同时降速、又同时恢复,带宽利用率暴跌,延迟剧烈抖动。
RED是别等满了再扔,在快要满的时候就开始随机扔几个包。
2. RED 怎么工作
RED 维护两个阈值:
- min_th:最小阈值(比如队列占 30%)
- max_th:最大阈值(比如队列占 70%)
还有一个max_p(最大丢弃概率,比如 10%):
当前平均队列长度 | RED 行为 |
|---|---|
< min_th | 不丢包,正常转发 |
min_th ~ max_th | 按线性增长的概率随机丢包(概率从 0 → max_p) |
> max_th | 所有新来包都丢(强制拥塞控制) |
关键:RED 用的是指数加权移动平均(EWMA) 计算的“平均队列长度”,不是瞬时长度,避免对突发流量过度反应。
3. RED 的效果
- ✅ 打破全局同步:不同 TCP 流在不同时间被丢包,错峰减速
- ✅ 队列深度稳定,延迟抖动减小
- ✅ 在高带宽延迟积(BDP)网络中吞吐更高
- ❌ 参数调不好反而更糟(min_th / max_th / max_p 要针对链路手动调)
- ❌ 对非 TCP 流量(UDP 视频流、QUIC)效果有限
4. 常见变种
变种 | 改进点 |
|---|---|
WRED | 对不同优先级/ DSCP 的流用不同丢弃曲线 |
ARED | 自适应调整 max_p,减少人工调参 |
CoDel | 基于“最小驻留时间”而非队列长度,更适应现代网络 |
PIE | 类似 CoDel,实现更简单,Linux 里 fq_codel 常用 |
二、共享缓冲区分配策略:
数据包进入相应的队列的准入规则:
Qlen< α * (可用空间)
Qlen 指的是队列当前使用的空间,α 指的是一个变量,它可以设置队列可以使用的缓冲区空间的上限。
队列可使用的空间可限制为共享缓冲区空间的:
其中 N 为拥塞队列的数量。
特点及理解:
1.越大,单个队列能用的比例越高。
2. 分母里有N,所以随着队列数量增多,每个队列能用的比例会下降。
这个公式的设计目的是防止单个队列饿死整个缓冲区,同时又允许一定程度的弹性占用。
- 队列少时,每个队列拿得多,但总占用不高(留有缓冲余量)
- 队列多时,每个队列拿得少,但总占用接近 100%
- 永远不会出现一个队列独占全部缓冲区的情况
关于Qmax的推导:
前提DT机制对所有队列一视同仁,N个活跃队列同时争抢、都贴着阈值排队时,稳态下各队列等长为 q。设总缓存为 B,剩余空闲空间设为 R:
每个队列的准入条件: q ≤ α × R
R = B − N·q(N个队列各占q)
取临界值(=号即上限):
q = α·(B − N·q)
q = αB − αNq
q(1 + αN) = αB
q_max = αB / (1 + αN)α=1 时退化为干净的形式:q_max = B/(1+N)
q_max 是机制的结构性上限,实际需要结合流量模型才能计算效果。