3. 配置示例

此处显示的示例是可下载配置文件的修改示例,这些配置文件位于 此目录 中。

这些示例可以用作独立的配置文件,以馈送到 tcc 解析器中,或者它们可以与示例 SysV 启动脚本 结合使用。该启动脚本是对 raptor 在 LARTC 邮件列表中发布的脚本 的修改。

如果您要使用上述启动脚本,请查看此示例/etc/sysconfig/tcng:

示例 1。/etc/sysconfig/tcng

# - tcng meta-configuration file
#   (I never meta-configuration file I didn't like)
#
# -- 2003-03-15 created; -MAB
# -- 2003-03-31 modified to allow ENVAR override; -MAB
#
# -- this directory will hold all of the tcng configurations
#    used on this host
#
TCCONFBASEDIR=${TCCONFBASEDIR:-/etc/sysconfig/tcng-configs}

# -- this is the active, desired tcng configuration
#    note, that, because tcng provides the #include construct,
#    the modularity of configuration can be built into the
#    configuration files in $TCCONFBASEDIR
#
TCCONF=${TCCONF:-$TCCONFBASEDIR/global.tcc}

tcstats=${tcstats:-no}   # -- will suppress statistical output
tcstats=${tcstats:-yes}  # -- will throw the "-s" option to tc

tcdebug=${tcdebug:-0}    # -- for typical startup script usage
tcdebug=${tcdebug:-1}    # -- for a bit of information about what's happening
tcdebug=${tcdebug:-2}    # -- for debugging information
#
#
# -- an additional measure to take, you can override the default tc and tcc
#    command line utilities by specifying their pathnames here, for example:
#
#  tc=/usr/local/bin/tc
#  tcc=/usr/local/tcng/bin/tcc
#
#
    

3.1. 使用 tcng 仅对下载进行整形

许多通用概念将通过此示例介绍。此示例可以使用以下命令编译为其 tc 输出tccclass-selection-path.tcc.

示例 2。/etc/sysconfig/tcng/class-selection-path.tcc

/*
 * Simply commented example of a tcng traffic control file.
 *
 *   Martin A. Brown 
 *
 * Example:  Using class selection path.
 *
 * (If you are reading the processed output in HTML, the callouts are
 *  clickable links to the description text.)
 *
 */

#include "fields.tc"     (1)
#include "ports.tc"

#define INTERFACE  eth0  (2)

dev INTERFACE {
    egress { (3)

        /* In class selection path, the filters come first!  DSmark */ (4)

        class ( <$ssh> )    if tcp_sport ==  22 && ip_tos_delay == 1 ;
        class ( <$audio> )  if tcp_sport == 554 || tcp_dport == 7070 ;
        class ( <$bulk> ) \
            if tcp_sport == PORT_SSH || tcp_dport == PORT_HTTP ; (5)
        class ( <$other> )  if 1 ; (6)

        /* section in which we configure the qdiscs and classes */ 

        htb () { (7)
            class ( rate 600kbps, ceil 600kbps ) { (8)
                $ssh   = class ( rate  64kbps, ceil 128kbps ) { sfq; } ; 
              (9) $audio = class ( rate 128kbps, ceil 128kbps ) { sfq; } ;
                $bulk  = class ( rate 256kbps, ceil 512kbps ) { sfq; } ;
                $other = class ( rate 128kbps, ceil 384kbps ) { sfq; } ; (10)
            }
        }
    }
}
      
(1)
tcng 语言支持 C 风格的 include 指令,该指令可以包含任何文件。文件包含相对于当前目录或 tcng 库(通常是/usr/lib/tcng/include)。严格来说,没有必要#include ports.tcfields.tc,因为 tcc 默认会包含这些。

使用#include可以灵活地定义变量并包含通用的流量控制元素。

另请参阅 tcng 手册中关于 includes 的部分。

(2)
这些是 CPP 指令。#define可用于创建宏或常量。有关其用法的更多信息,您应该查看 tcng 手册中关于 variables 的部分。
(3)
Theegress关键字与dsmark关键字同义。此处的示例使用 class selection path。正是egress在此配置中使用关键字需要在内核和 tc 中支持 dsmark。
(4)
类选择路径是流量整形的一种方法。在类选择路径中,数据包在进入路由器时被标记(DiffServ 标记)。路由器可以根据此初始分类对数据包执行任意数量的操作或应用任意数量的策略、调度或整形操作。

有关更多详细信息,请查阅 tcng 手册中关于 class selection path 的部分。

(5)
此示例显示了对端口使用名称而不是数字。这是通过自动包含 tcng 提供的便利之一ports.tc。端口根据 IANA 端口名称命名。有关这些名称,请参阅 IANA 的注册端口 或查看文件ports.tc.

名称和数字同样可接受且有效。

(6)
请注意这个特殊的构造,它对尚未分类的任何数据包进行分类。任何尚未被上述分类器分类的数据包都会在此处放入 "$other" 类。if 1构造可用于对剩余的未分类流量进行分类。
(7)
这是根 qdisc 的创建,它附加到设备eth0在本例中为 eth0。有关每个 qdisc 的有效参数,请查阅 tcng 关于排队规则参数的附录 中的参考资料。任何 qdisc 参数都可以以与示例中下面的类参数相同的方式插入到括号中。如果不需要指定参数,则括号是可选的。
(8)
本示例中的顶级类设置允许通过此类的最大带宽。假设eth0是机器的内部网络接口。这会将传输到内部网络的总带宽限制为每秒 600 千比特。

参数rateceil对于任何使用过 HTB 的人来说都应该很熟悉。这些是 HTB 特定的参数,并且由 tcc 实用程序正确转换。请参阅关于 tcng 速率和速度规范 的表。

(9)
这是将类分配给变量。这通常作为类选择路径的一部分完成。
(10)
正如 Martin Devera 在 HTB 主页上建议的那样,嵌入式 SFQ 为每个类提供公平排队算法,用于将资源分配给通过该类的数据包竞争者。请注意嵌入式排队规则没有任何参数。

如果未为叶子类指定排队规则,则它们包含默认的 pfifo_fast qdisc。在叶子类中包含随机公平排队 qdisc 抑制了单个连接在给定类中占主导地位的能力。

3.2. 使用双速率三色计量器

示例 3。/etc/sysconfig/tcng/two-rate-three-color-meter.tcc

/*
 * Simply commented example of a tcng traffic control file.
 *
 *   Martin A. Brown 
 *
 * Example:  Using a meter.
 *
 * (If you are reading the processed output in HTML, the callouts are
 *  clickable links to the description text.)
 *
 */

#define   EXCEPTION      192.168.137.50
#define   INTERFACE      eth0

$meter = trTCM( cir 128kbps, cbs 10kB, pir 256kbps, pbs 10kB );  (1)

dev eth0 {
    egress {
        class ( <$full> )     if ip_src == EXCEPTION      ; (2)
        class ( <$fast> )     if trTCM_green( $meter )    ; (3)
        class ( <$slow> )     if trTCM_yellow( $meter )   ; (4)
        drop                  if trTCM_red( $meter )      ; (5)
        htb {
            class ( rate 600kbps, ceil 600kbps ) {
                $fast = class ( rate 256kbps, ceil 256kbps ) { sfq; } ;
                $slow = class ( rate 128kbps, ceil 128kbps ) { sfq; } ;
                $full = class ( rate 600kbps, ceil 600kbps ) { sfq; } ;
            }
        }
    }
}
      
(1)
这是用于对流量进行分类的计量器的声明。用于实现此计量器的底层技术是策略。有关不同类型的计量器,请参阅 tcng 手册中关于 meters 的部分。

此计量器是双速率三色计量器,是 tcng 语言中最复杂的计量器。此计量器根据承诺和峰值桶中提供的速率返回颜色绿色、黄色和红色。如果计量速率超过承诺速率,则此计量器将变为黄色;如果计量速率超过峰值速率,则此计量器将变为红色。

变量$meter可以通过适用于计量器类型的函数对其进行操作。在这种情况下,有三个函数可用于测试$meter的状态,trTCM_green, trTCM_yellowtrTCM_red。为了提高效率,还可以考虑 加速的对应物

(2)
在此示例中,IP 192.168.137.50 被明确排除在应用于在 eth0 上离开的流量的策略控制之外。
(3)
直到承诺信息速率(cir),数据包将通过此类。令牌将从cir/cbs桶中移除。

计量器为绿色。

(4)
超过cir/cbs桶的流量将在此处分类。pir/pbs桶(pir是峰值信息速率,pbs是峰值突发大小)。这允许特定流在给定速率下保证一种服务等级,然后在高于该速率时重新分类。

计量器为黄色。

(5)
超过pir/pbs桶的流量将在此处分类。常见的配置会导致流量在峰值速率之上被丢弃,尽管流量可以从保证类重新分类为尽力而为类。

计量器为红色。