摘要
Linux 提供了一整套丰富的流量控制(traffic control)功能。本文档概述了相应的内核代码设计,描述了其结构,并通过描述一种新的排队策略来说明新元素的添加。
1 引言
最近的Linux内核提供了多种流量控制功能。Alexey Kuznetsov(kuznet@ms2.inr.ac.ru)实现了流量控制的内核部分以及几个用户空间程序来控制它们。这项工作受到了[1]中描述的概念的启发,但它也涵盖了支持IETF“intserv”组[2]开发的架构所需的机制,并将作为支持更近期的“diffserv”[3]工作的基础。有关intserv和diffserv之间关系的更多详细信息,请参见[4]。本文档说明了底层架构,并描述了如何将新的流量控制功能添加到Linux内核中。我们使用的内核版本是2.2.6。
图1大致展示了内核如何处理从网络接收到数据,以及如何生成要发送到网络的新数据:传入的数据包被检查,然后要么直接转发到网络(例如,如果机器充当路由器或桥接器,则在不同的接口上),要么传递到协议栈的更高层(例如,传递给像UDP或TCP这样的传输协议)进行进一步处理。这些更高层也可能自己生成数据,并将其交给较低层执行封装、路由和最终传输等任务。
图 1 网络数据的处理
“Forwarding”包括选择输出接口、选择下一跳、封装等。一旦完成所有这些操作,数据包就会在各自的输出接口上排队。这就是流量控制发挥作用的地方。流量控制可以决定数据包是排队还是丢弃(例如,如果队列达到了某个长度限制,或者流量超过了某个速率限制),它可以决定数据包的发送顺序(例如,为某些流提供优先级),它也可以延迟数据包的发送(例如,限制出站流量的速率),等等。
一旦流量控制释放了一个数据包进行发送,设备驱动程序就会接管它并将其发送到网络。
第2至4节提供了概述并解释了一些术语。第5至8节更详细地描述了Linux内核中流量控制的元素。第9节描述了作者实现的一种排队规则。
全文https://mp.weixin.qq.com/s/77OhzYdlzJcqPRA1X6EVjw