1. 流量工程简介
流量工程(Traffic Engineering)是一种在计算机网络中实现服务质量(QoS)的策略。随着互联网的快速发展,关于流量工程的讨论变得越来越频繁和重要。
在技术语境中,QoS 是一组用于控制网络流量、执行预定义策略并确保网络服务最低性能参数的技术和机制。流量工程可以通过多种方式实现,比如网络功能(无论是虚拟化还是非虚拟化)、软件定义网络(SDN)中的数据包转发策略,甚至作为提供网络服务的应用运行在服务器中。
流量工程包含多种技术,其中最常见的是:
- 整形(Shaping):通过排队和延迟特定数据包来管理网络流量的带宽建模技术
- 限速(Policing):通过丢弃部分传入流量来管理网络流量的带宽建模技术
- 调度(Scheduling):将网络流量分配到不同队列中,并采用不同的转发策略
- 清洗(Washing):丢弃数据包中非必要处理的数据部分
接下来我们将重点介绍流量整形和限速这两种技术。
2. 流量整形(Traffic Shaping)
流量整形是一种带宽建模技术,用于将网络流量负载控制在可接受的范围内。网络管理员或运营商会根据具体场景定义什么是“合理的流量负载”。
这个判断通常依赖多个因素,比如可用带宽、系统处理能力、服务在单位时间内能处理的请求数等。
流量整形机制在部署后可以对网络流量执行三种操作:
- ✅ 转发(Forwarding):当流量负载低于最大限制时
- ⏳ 延迟(Delaying):当流量超过限制,但队列还有空间
- ❌ 丢弃(Dropping):当流量超过限制且队列已满
因此,流量整形机制会使用队列来延迟超出限制的流量。与限速机制不同,它不会直接丢弃这些数据包,而是先尝试排队,等负载下降后再转发。
常见的流量整形算法包括:
- 令牌桶(Token Bucket)
- 漏桶(Leaky Bucket)
2.1 令牌桶整形(Token Bucket Shaper)
令牌桶机制使用一个“桶”来存储令牌,每个令牌通常代表一个字节的传输权限。
桶会以固定速率补充令牌,并有一个最大容量(称为“突发量 burst”)。当数据包到达时:
- 如果桶中有足够的令牌,就转发该数据包并消耗相应数量的令牌
- 如果令牌不足但队列有空位,则将数据包入队等待
- 如果令牌不足且队列已满,则丢弃数据包
如下图所示:
当桶中令牌恢复后,会处理队列中的数据包。
2.2 漏桶整形(Leaky Bucket Shaper)
漏桶机制则直接将数据包放入队列中,以固定速率按先进先出(FIFO)顺序转发。
漏桶也有一个最大容量(即“突发量”)。当流量速率高于漏桶的转发速率时,数据包会被缓存到桶中。如果桶满了,则丢弃新到达的数据包。
如下图所示:
当流量速率低于漏桶速率且桶中有数据包时,继续转发直到桶为空。
3. 流量限速(Traffic Policing)
流量限速与流量整形目标相似,都是控制网络带宽,确保流量在可接受范围内。
但与整形不同的是,限速机制不排队,而是直接丢弃超出限制的流量。
因此,限速机制只有两种行为:
- ✅ 转发:流量在限制范围内
- ❌ 丢弃:流量超出限制
常见的限速实现是令牌桶限速(Token Bucket Policing)
3.1 令牌桶限速(Token Bucket Policing)
令牌桶限速机制与整形中的令牌桶类似:桶以固定速率填充,每个令牌代表一定数量的传输权限。
区别在于:
- 没有队列:一旦令牌不足,直接丢弃数据包,不排队
如下图所示:
这种机制响应更快,但对突发流量的容忍度较低。
4. 对比总结
下面是对流量整形与限速的系统性对比:
特性 | 流量整形(Shaping) | 流量限速(Policing) |
---|---|---|
主要目标 | 控制流量负载,保持在可接受水平 | 控制流量负载,保持在可接受水平 |
是否使用队列 | ✅ 是 | ❌ 否 |
支持的操作 | 转发、延迟、丢弃 | 转发、丢弃 |
常见实现 | 令牌桶、漏桶 | 令牌桶 |
5. 总结
随着网络服务的普及,网络流量激增,流量工程成为保障服务质量的关键技术之一。其中,流量整形与限速是最常见的两种带宽控制手段。
- ✅ 流量整形 更适合容忍突发流量的场景,通过队列机制平滑流量,适用于对延迟不敏感但对丢包敏感的业务
- ✅ 流量限速 更适合需要快速响应、对突发流量容忍度低的场景,直接丢弃超限流量,适用于对延迟敏感的业务
在实际部署中,应根据业务需求选择合适的策略。例如:
- API 接口限流 → 限速(Policing)
- 视频流媒体带宽控制 → 整形(Shaping)
掌握这两种机制的原理与差异,有助于我们在高并发、高带宽需求的系统中做出更合理的架构决策。