计网 TC 流量控制

参考资料

总结的很好很全面 实际上是linux手册的中文翻译233
这个基本概念补充的更全一些
linux TC的设计论文
driver queue 和 qdisc 和socket buffer之间的关系

QDisc层之上就没有数据包队列了。这意味着Linux协议栈将数据包直接放在QDisc队列中 或者当QDisc队列已满时将数据包又返回存放到更上面的层中(例如:socket缓冲区中)
在这里插入图片描述

breif summary

  • 输出断口处建立一个队列进行TC
  • 方式分类
    • shaping (仅针对输出
    • scheduling (仅针对输出
    • policing (仅针对输入
    • dropping (仅针对输入输出均可

三个机制

qdisc 排队规则

classless QDisc [ 不可分类的QDisc]

			* [p|b]fifo
			* pfifo_fast -- 按TOS分为三个band
			* redn(Random Early Detection)  -- 非常适用于高带宽的情况
			* Sfq(Stochastic Fairness Queueing)
			* Tbf(Token Bucket Filter)
  1. 如果没有可分类QDisc,不可分类QDisc只能附属于设备的根
  2. 一个网络接口上如果没有设置QDisc,pfifo_fast就作为缺省的QDisc

CLASSFUL QDISC(分类QDisc)

  • CBQ(Class Based Queueing)
  • HTB(Hierarchy Token Bucket)
  • PRIO

class 类别

  • CLASSFUL QDISC可以包含class,并且在其上附有filter句柄,而classless QDISC就没有class和filter之说了
  • class仅存在于classful qdisc中(例如,HTB和CBQ)。class非常灵活,可以始终包含多个child class或单个child qdisc [1]。

不提倡使用一个没有child class的classful qdisc,它会带来极其复杂的流量控制方案。

  • leaf class (contains a qdisc(default is FIFO) ) & root class(inner class)

filter 过滤器

术语混肴

  • root qdisc and ingress qdisc实际上指的不是两类qdisc,而是qdisc机制部署的位置—— egress/root (outbound traffic) and ingress (inbound traffic).
  • 每个device两个都有
    • 最主要且更常见的是egress qdisc,称为root qdisc
    • ingress 则没有child class 但是有filter 作为策略上的过滤

    In short, you can do much more with an egress qdisc because it contains a real qdisc and the full power of the traffic control system. An ingress qdisc can only support a policer.

Theory Of Operation

类形成一棵树,其中每个类都有一个父级。一个班级可能有多个孩子。一些qdiscs允许在运行时添加类(CBQ,HTB),而其他qdiscs是使用静态子代数创建的。 允许动态添加类的Qdiscs可以具有零个或多个子类,可以将流量入队。 此外,每个类都包含一个叶子qdisc,默认情况下它具有pfifo行为,尽管可以将另一个qdisc附加到位。这个qdisc可能再次包含类,但是每个类只能有一个叶子qdisc。

  • 当数据包进入有类别的qdisc时,可以将其分类为其中的一个类别。可以使用三个条件,尽管并非所有qdiscs都将使用所有三个条件:

    • tc filters

    如果将tc过滤器附加到类上,请先咨询它们以获取相关说明。过滤器可以匹配数据包头的所有字段,也可以匹配ipchains或iptables应用的防火墙标记。

    • Type of Service(TOS)

    一些qdiscs内置了用于基于TOS字段对数据包进行分类的规则。

    • skb-> priority

    用户空间程序可以使用SO_PRIORITY选项在该字段中对class-id进行编码。

树中的每个节点都可以拥有自己的过滤器,但是较高级别的过滤器也可以直接指向较低的类。 如果分类不成功,则将数据包排队到附加到该类的叶子qdisc上。

linux TC设计理念 ( ref3

2-4节介绍了基本概念; 第5至8节更详细地描述了Linux内核中的TC元素;第9节介绍了作者已实现的排队规则。

概念介绍

在这里插入图片描述

  • class自己本身不负责存储数据包 使用queue ,一般说成qdisc(我们普通认为的queue实际上就是pfifo qdisc),然后里面还可以继续层层嵌套
  • 多个filter可以对对应同一个class

在这里插入图片描述

  • TBF token bucket filter 令牌桶过滤器 强制以最高速度为1Mbps的速度发包

基本流程

在这里插入图片描述

qdisc

  • 对于所有这些功能,排队规则通常由指向相应结构Qdisc的指针引用。 当数据包在接口上排队(net / core / dev.c中的dev_ queue_xmit)时,设备的排队规则(include / linux / netdevice.c中的struct device的eld qdisc)被调用。 然后,dev_queue_xmit在该设备上的include / net / pkt_sched.h中调用qdisc_唤醒,以尝试发送刚刚入队的数据包。
  • qdisc_wakeup立即在net / sched / sch_generic.c中调用qdisc_restart,这是轮询队列规则和发送数据包的主要功能。 qdisc_restart rst尝试从设备的排队规则中获取数据包,如果成功,它将调用设备的hard_start_xmit函数以实际发送数据包。 如果由于某种原因发送失败,则数据包将通过其requeue功能返回到排队规则
  • 当排队规则注意到某个数据包可能由于发送而到期时,排队规则也可以调用qdisc_wakeup。 在计时器到期时。 TBF是这种排队规则的一个示例。 也可以通过net / core / dev.c中net_bh的qdisc_ run_queues调用qdisc_restart。 net_ bh是网络堆栈的\ bottom-half“处理程序,并在将数据包排队等待进一步处理时执行。
  • 这里说明了requeue是为了使丢弃的包重新进入队列
  • 请注意,排队规则永远不会直接调用传递功能。 相反,他们必须等到被轮询为止。

class

filter

Policing

管制的目的是确保流量不超过特定范围。 为简单起见,我们将对policing进行广泛的定义,并考虑它包括各种以某种方式依赖于交通量的交通控制行动。

  • 我们考虑四种类型的管制机制:(1)通过过滤器进行管制决策;(2)拒绝对数据包进行排队;(3)从“内部”排队规则中丢弃数据包;以及(4)在排队时丢弃数据包 图11至15说明了这四种机制。

第一种 对过滤器进行管制决策

  • 是决策者做出的决定(图11)。 过滤器的分类功能可以返回三种类型的值以指示策略决策(这些值在include / linux / pkt_cls.h中声明:

TC_POLICE_OK不需要特殊处理。
TC_POLICE_RECLASSIFY数据包已被过滤,但在特定范围之外,应重新分类(请参见下文)。
过滤器选择了TC_POLICE_SHOT过滤器,发现该过滤器超出范围,因此应将其丢弃。

第二种 拒绝对数据包进行排对

第二种类型的管制发生在排队规则无法使数据包排队时(图13)。
在这种情况下,它通常会简单地丢弃该数据包(即通过调用kfree_skb)。 一些排队规则还向调用排队规则提供更复杂的反馈,并为它提供了使数据包排队的第二次机会:如果已经设置了reshape_fail回调函数(在结构Qdisc中),则\ inner“排队规则可以调用它来代替允许 “外部”排队规则以选择不同的类别。

第三种 从“内部”排队规则中丢弃数据包

如果排队规则决定在某个分组被“排队”之后从“内部”排队规则中丢弃某个数据包,则应用第三个策略机制,例如,以便为更重要的类的数据包创建空间(图14)。 sch_cbq的cbq_dequeue_prio函数通过cbq_under_limit使用它来从超出限制的类中删除数据包。

第四种(图15) 丢弃已经成功排队的数据包

如果排队规则的排队功能认为新数据包比一些旧数据包更重要,则可以丢弃旧数据包并将新数据包排队。 。 它通过返回零来向呼叫者表明这一点。

发布了177 篇原创文章 · 获赞 28 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/Hesy_H/article/details/104952779
tc
今日推荐