Linux 包含复杂的带宽管理系统 TC (流量控制,Traffic Control)。该系统支持分类、优先、共享和输入、输出流量限制等。这套系统可以与专用的带宽管理系统相媲美。
1. 基本的构成块 队列规定可以看作设备的流量/数据包管理器。 类由设备队列规定来管理。类由若干规则(rule)构成,这些规则用以管理那个类所拥有的数据。例如,某类里的全部数据包都受到 1 Mbps的速率限度,而在午夜和早上6点的一段时间段内允许最高达 3 Mbps。 一些队列规定可以绑定到类上,包括FIFO(先进先出),RED(随机早期探测),SFQ(随机公平队列)和令牌桶(Token Bucket)。 分类器或过滤器描述包,并且把他们映射到队列规定所管理的类。 这些过滤器通常都提供简单的描述语言,指定选择包、把包映射到类的方法。 TC代码位于内核,不同的功能块既能编译为模块,也能直接编进内核。与内核代码或模块的通信和配置由用户级程序tc完成。 2. 示例 2.1 编译内核 首先要确保选中 Kernel/User netlink socket,因为只有这样 tc 才能通过 netlink与内核通讯。 然后,把队列规定和分类器都编进内核。这其中包括: QoS or fair queueing, CBQ packet scheduler, CSZ packet scheduler, the simplest PRIO pseudoscheduler, RED queue, SFQ queue, TBF queue, QoS support, rate estimator, packet classifier API, routing-tables-based classifier, U32 classifier, special RSVP classifier 和 special RSVP classifier for IPv6。 然后就是大家熟知的编译和安装过程了。 2.2 建立 [因特网] —〈E3、T3 等〉— [Linux 路由器] — [Office+ISP] 上图中的 Linux 路由器有两个接口,不妨称之为 eth0 和 eth1。eth1 连接到路由器,eth0 连接到包括公司防火墙在内的子网上。 由于我们只能限制发送的内容,所以我们需要两套独立的、但可能非常相似的规则集。我们可以通过改变发送次序来控制传输速率。通过修改 eth0 上的队列,我们可以确定客户的下载(download)速率;通过修改 eth1 上的队列,我们可以确定我们公司自己的用户的上载(upload)速率。 比如说,公司连接到因特网的线路带宽为 10 兆,同时满足外部客户和公司自己用户的需要;此时,我们就需要一种策略,来进行管理和协调。CBQ 就可以满足我们的要求。 我们有两个主类:’ISP’ 和 ‘Office’。我们可以决定,客户有 8 兆的带宽,Office用户有 2 兆的带宽。 # tc qdisc add dev eth0 root handle 10: cbq bandwidth 10Mbit avpkt 1000 其含义是:我们配置了 eth0 的队列规定,root 表示这是根(root)规定,其句柄(handle)设定为 10:’。 下面生成根类(root class): # tc class add dev eth0 parent 10:0 classid 10:1 cbq bandwidth 10Mbit rate \ 这条命令其实不比前一条命令有更多的含义。其中,1514 是 MTU 的值。 下面生成 ISP 类: # tc class add dev eth0 parent 10:1 classid 10:100 cbq bandwidth 10Mbit rate \ 我们分配了 8 兆的带宽给它,其中 bounded 表示该类不能超过该阀值。 下面生成 Office 类: # tc class add dev eth0 parent 10:1 classid 10:200 cbq bandwidth 10Mbit 为了更清晰起见,我们的类可以用下图表示: +————-[10: 10Mbit]————————-+
我们已经向内核通知了我们的类,我们还需要告诉内核如何管理队列,如下所示: 这里,我们使用了随机公平队列(sfq),在消耗 CPU 周期较少的情况下,其性能还是可以接受的。其它一些队列规定可能更好,但要占用较多的 CPU 资源。令牌桶过滤器也经常使用。 下面还有一件事要作:告诉内核网络包和类的映射关系。 # tc filter add dev eth0 parent 10:0 protocol ip prio 100 u32 match ip dst \ # tc filter add dev eth0 parent 10:0 protocol ip prio 25 u32 match ip dst \ 这里,我们假定 Office 位于防火墙 150.151.23.24 的后面,其它 IP 地址都属于ISP。u32 匹配是一种比较简单的匹配,我们可以使用 netfilter 生成更加复杂的匹配规则。 我们已经分配了下载带宽,下面是上载带宽的分配: # tc qdisc add dev eth1 root handle 20: cbq bandwidth 10Mbit avpkt 1000 # tc class add dev eth1 parent 20:0 classid 20:1 cbq bandwidth 10Mbit rate \ # tc class add dev eth1 parent 20:1 classid 20:100 cbq bandwidth 10Mbit rate \ # tc class add dev eth1 parent 20:1 classid 20:200 cbq bandwidth 10Mbit rate \ # tc qdisc add dev eth1 parent 20:100 sfq quantum 1514b perturb 15 # tc filter add dev eth1 parent 20:0 protocol ip prio 100 u32 match ip src \ # tc filter add dev eth1 parent 20:0 protocol ip prio 25 u32 match ip src \ 这与前面的描述基本一致,所以就不做更多的解释了。 注: |