就象在分类的队列规定一段中解释的,过滤器用与把数据包分类并放入相应的子队列。这些过滤器在分类的队列规定内部被调用。
下面就是我们可用的分类器(部分):
fw
根据防火墙如何对这个数据包做标记进行判断。如果你不想学习tc的过滤器语法,这倒是一个捷径。细节请参见队列那一章。
u32
根据数据包中的各个字段进行判断,如源IP地址等等。
route
根据数据包将被哪条路由进行路由来判断。
rsvp, rsvp6
根据数据包的RSVP情况进行判断。只能用于你自己的网络,互联网并不遵守RSVP。
tcindex
用于DSMARK队列规定,参见相关章节。
通常来说,总有很多途径可实现对数据包分类,最终取决于你喜欢使用哪种系统。
分类器一般都能接受几个参数,为了方便我们列出来:
protocol
这个分类器所接受的协议。一般来说你只会接受IP数据。必要参数。
parent
这个分类器附带在哪个句柄上。句柄必须是一个已经存在的类。必要参数。
prio
这个分类器的优先权值。优先权值低的优先。
handle
对于不同过滤器,它的意义不同。
后面所有的节都假定你试图对去往HostA的流量进行整形。并且假定根类配置为1:,并且你希望把选中的数据包送给1:1类。
1. u32分类器
U32分类器是当前实现中最先进的过滤器。全部基于哈希表实现,所以当有很多过滤器的时候仍然能够保持健壮。
U32过滤器最简单的形式就是一系列记录,每条记录包含两个部分:一个选择器和一个动作。下面要讲的选择器用来与IP包相匹配,一旦成功匹配就执行其指定的动作。最简单的动作就是把数据包发送到特定的类队列。
用来配置过滤器的tc命令行由三部分组成:过滤器说明、选择器和动作。一个过滤器可以如下定义:
tc filter add dev IF [ protocol PROTO ]
[ (preference|priority) PRIO ]
[ parent CBQ ]
上面行中,protocol字段描述了过滤器要匹配的协议。我们将只讨论IP协议的情况。preference字段(也可以用priority代替)设置该过滤器的优先权。这非常重要,因为你可能有几条拥有不同优先权的过滤器。每个过滤器列表都按照输入的顺序被扫描一遍,然后优先权值低(更高的偏好值)的列表优先被处理。“parent”字段定义了过滤器所属的CBQ的顶部(如1:0)。
上面描述的选项适用于所有过滤器,而不仅仅适用于U32。