TC HTB流量控制

. 背景简介
最近几个月在参与一个软路由器的开发. 该路由器的流量控制功能由TCHTB 实现。下面写点总结性的文字,因水平有限,不对之处敬请各位及时指出。
   TC TrafficControl 的缩写,HTB 顾名思义是一个层次式的过滤框架, 我们可以通过配置TC HTB 规则来实现流量控制.
. 基本概念
   TC 规则涉及到队列(queue), 分类器(class) 和过滤器(filter) 三个概念.
    队列用来实现控制网络的收发速度. 通过队列,linux 可以将网络数据包缓存起来, 然后根据用户的设置, 在尽量不中断连接( TCP) 的前提下来平滑网络流量. 需要注意的是,linux 对接收队列的控制不够好,所以我们一般只用发送队列,即控发不控收”,
  class 用来表示控制策略. 很显然, 很多时候, 我们很可能要对不同的IP 实行不同的流量控制策略, 这时候我们就得用不同的class 来表示不同的控制策略了.

  filter用来将用户划入到具体的控制策略中(即不同的class).正如前述,我们要对A,B两个IP实行不同的控制策略(C,D),这时,我们可 filter

A划入到控制策略C,将B划入到控制策略Dfilter划分的标志位可用u32打标功能或IPtablesset-mark功能来实 现。
三、应用过程
我们要实现这样的功能。局域网中的用户分为两类:特权用户和普通用户,对特权用户和普通用户的各应用的上行/下载实现独立的控制。设eth0为内网网络接口,eth1位外网网络接口。
   i)首先在eth0eth1分别建立qdiscA qdiscBqdiscA控制外网数据注入内网的速度,因此是用来控制下行速度的;qdiscB控制内网数据灌入外网的速度,因此是用来控制上行速度的。示例指令如下。
   tc qdisc add dev eth0 root handle 1:htb default 91
   解释如下:无论是队列,还是classfilter都有ID之类的标志符,一般都有parent,注意ID具有接口本地性,不同的网络接口可以有相同的ID。对于这里因为qdisc在顶部,所以parent无,用\'root\'字样来标识,ID1:来标志,\'default 91\'表示当某个ip流不满足任何已设定的filter规则时,将自动归入class 91.更详细的指令规则说明请参考手册.
  ii)然后在qdisc下建立两个root class,分别用来控制普通用户和特权用户的带宽(对于eth0是用来控制下行带宽,对于eth1是用来控制上行带宽的).示例指令如下.
  tc class add dev eth0 parent 1:0 classid1:30 htb rate 2mbit ceil 4mbit prio 2
   解释如下:rate是指在带宽紧张的情况下的最大网络速度,当带宽空闲时,class可通过向其兄弟借用带宽而达到ceil大的网络速度,注意,借用表兄弟之间也可借用带框.prio用来指示借用带宽时的竞争力,prio越小,优先级越高,竞争力越强.
iii)接着针对不同的应用在各rootclass下设置不同的类,.示例如下.
tc class add dev eth0 parent 1:30 classid 1:31 htbrate 0.5mbit ceil 2mbit prio 3
指令意义同ii).
同时为了不使一个会话永占带宽,在叶子结点(即本文的各应用结点)添加随即公平队列sfq.
tc qdisc add dev eth0 parent 1:31 handle 31:sfq perturb  10
iv)接着添加过滤器.
tc filter add dev eth0 parent 1: protocol ipprio 31 handle 31 fw flowid 1:31

v)iptable打标
   iptables -t mangle -I FORWARD -i eth1-p tcp --sport %80 -d $IPaddr--j MARK --set-mark 31
   iptables -t mangle -I FORWARD 2 -i eth1 -d $IPaddr--j RETURN

注意下行速率在eth0处控制,但打标应在进入eth0前进行,所以规则中出现了\'-i eth1\'字样.下行达标规则可类推之.
.遗留问题.
有很多细节需要考虑,如上行控制与下行控制应比较独立,即上行控制时,对下行中局域网内用户上行的ack之类的包应不予限制,这个显然应在iptable之类的打标上做文章,但我实在没想出什么具体的打标策略.有哪位比较清楚,烦请告诉我.
.附图.
整个应用中的规则示意图如下.

你可能感兴趣的:(openwrt,qos)