您的位置:首页 > 运维架构 > Linux

Linux Traffic Control Implement: The Overview阅读笔记

2016-01-29 22:40 405 查看

Linux Traffic Control Implement

Traffic Control是实现Differentiated Services的用户工具。

Differentiated Services (short: Diffserv) is an architecture for providing different types or levels of service for network traffic.

Traffic Control包含以下组件:

queueing disciplines

class(with in a queueing disciplines)

filter

policing

每个物理网卡都有一个相关联的队列规则,队列规则决定进入此队列中数据包的处理方式。简单的队列规则可能就含有一个队列,数据包进入时候被存储在队列中,网卡驱动程序尽可能地发送数据包。复杂一些的队列规则可能就含有分类器Filter,决定将数据划分到不同的类中,再根据类中处理方法对其进行处理。

队列规则和类经常绑定在一块,类就是队列规则的基本构成。相反,过滤器就不一样,她可以和队列规则绑定在一块,也可以和类绑定到一块,只要队列规则中有类。这样并不会缺乏灵活性。类通常不考虑存储数据包,类通常把数据交由类关联的队列规则进行处理。这个队列规则是一个内部队列规则,类将数据交由内部队列规则即可。



上述几个概念在tc中对应关系如下:



队列规则

队列规则和类都是采用32bit进行标识。将32分为major:minor

队列规则的minor为0。

类有两种标识方法,一种是class id由用户进行指定,另外一个是internal id由队列规则进行分配。class id是u32类型,internal id是ulong类型。内核一般引用的是internal id。注意多个class id可能映射到相同的internal id。这种情况下class id需要从分类器中获得附加信息,再发送到队列规则或者类。类也用32bit进行标识,分为major:minor。不过不要求minor为0。

在队列规则enqueue过程中将选择具体的类。返回的值可能是class id或者internal id。也有种捷径来获得class id。根据skb->priority来确定当期类的class id,可以通过sock_setsockpt的SO_PRIORITY选项来进行设置。注意内核2.2.3之前,SO_PRIORITY可以选择的范围仅有0…7,所以这条解禁并不起作用,但是所有队列规则都支持它。skb->priority可以获得其他的优先值,可以从IPv4头部的TOS字段获得。其值范围是0..65536。

选择完类之后,就调用类关联的队列规则的enqueue。

Filter

Filter用来将进入队列规则的数据分配到它的某个类中。这发生在队列规则的enqueue操作中。

Filter也有内部结构,也是32bit,但是没有被划分为major:minor。0标识自己。

Filter分为两种,generic和specfic。

Policing

Policing的目的是确保流量不会超过上限值。有四种Policing机制。

Filter返回的决定

拒绝进入队列规则

丢弃队列规则中的包

丢掉队列中优先级低的包,将新包加入队列。

第一个类型Filter决定,Filter过滤函数返回三个值,

TC_POLICE_OK 没有特殊要求

TC_POLICE_RECLASSIFY 包被过滤器选中,但是超出上限,应该被重新分类。

TC_POLICE_SHOT 包被过滤器选中,但是超出上限,应该被丢弃。

第二个类型是拒绝进入队列规则,此时数据包将被丢弃。

第三个类型是数据包已经进入队列中,但是需要从内部队列中丢掉数据包。

第四个类型是新的数据包到达,发现队列中优先级较低的数据包,于是将新数据包放入队列中。

可以将整个TC的控制框架看成是树,每个阶段就是队列规则,队列规则中可以有类也可以没有,不同的类的末端是不同的队列规则,进入不同类意味着数据将被区别对待。当数据包进入队列规则时,将由Filter决定将数据包放入哪一个类中。

本文内容根据Linux Network Traffic Control - Implementation Overview进行粗略总结。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: