我阅读了有关 HFSC的原始SIGCOMM '97 PostScript 论文,它在技术上非常技术性,但我了解基本概念。您可以指定凸或凹的服务曲线,而不是提供线性服务曲线(与几乎所有其他调度算法一样),因此可以解耦带宽和延迟。然而,即使这篇论文提到了正在使用的调度算法(实时和链路共享),它总是只提到每个调度类的一条曲线(通过指定这条曲线来完成解耦,只需要一条曲线) )。
现在已经使用ALTQ调度框架为BSD(OpenBSD、FreeBSD等)实现了HFSC,并且已经使用TC调度框架(iproute2的一部分)在Linux上实现了HFSC。这两种实现方式增加了两个额外的服务曲线,这是不是在原来的文件!实时服务曲线和上限服务曲线。再次请注意,原始论文提到了两种调度算法(实时和链接共享),但在那篇论文中,它们都适用于一条服务曲线。您目前在 BSD 和 Linux 中发现的任何一条都没有两条独立的服务曲线。
更糟糕的是,某些版本的 ALTQ 似乎为 HSFC 添加了额外的队列优先级(原始论文中也没有优先级这样的东西)。我发现几个 BSD HowTo 提到了这个优先级设置(即使最新的 ALTQ 版本的手册页知道 HSFC 没有这样的参数,所以官方它甚至不存在)。
这一切都使得 HFSC 调度比原始论文中描述的算法更加复杂,互联网上有大量教程经常相互矛盾,一个声称与另一个相反。这可能是为什么似乎没有人真正了解 HFSC 调度的真正工作原理的主要原因。在我提出问题之前,我们需要某种设置示例。我将使用一个非常简单的方法,如下图所示:
替代文字 http://f.imagehost.org/0177/hfsc-test-setup.png
以下是一些我无法回答的问题,因为教程相互矛盾:
为什么我需要实时曲线?假设 A1、A2、B1、B2 都是 128 kbit/s 的链路共享(任何一个都没有实时曲线),那么如果根有 512 kbit/s 的分配(和A和B当然都是256 kbit/s),对吗?为什么我还要给 A1 和 B1 一条 128 kbit/s 的实时曲线?这有什么用?给这两个更高的优先级?根据原始论文,我可以通过使用曲线给他们更高的优先级,这毕竟是 HFSC 的全部内容。通过给这两个类一个 [256kbit/s 20ms 128kbit/s] 的曲线,它们都会自动获得比 A2 和 B2 两倍的优先级(平均仍然只有 128 kbit/s)
实时带宽是否计入链路共享带宽?例如,如果 A1 和 B1 都只有 64kbit/s 实时带宽和 64kbit/s 链路共享带宽,这是否意味着一旦它们通过实时 64kbit/s …
我对我正在使用的 HTB 结构有一些疑问。
我的目标是限制本地网络中用户的下载和上传速度。网络的每个用户都有一个个人域列表,其中包含他不能超过的域的上下速度。
这意味着用户 1 可以在 slashdot.org 上的访问权限限制为 8KB 下载和 3KB 上传,用户 2 可以在 slashdot.org 上访问限制为 4KB 和 1KB。
现在我设置了一个很好的 iptables/tc 对,但规模很小,同时使用 2 或 3 个虚拟主机(不幸的是,我无法执行实际大小测试)。
这是我当前的结构(我只会显示 LAN 出口的结构,用于上传的结构只是该结构的“副本”)
连接在接口上的 HTB qdisc(句柄 2:),默认流量类是类 FFFF。
根类 2:1 直接位于 HTB qdisc 下,具有速率和上限下行链路容量。
默认类 2:FFFF 作为 2:1 的子级,速率为 1kbsp,下行容量为 ceil。
然后,当某个域的用户有新的限制时,动态添加其他类,添加新的 tc 类来控制来自其域的下载速度。
现在,这就是我所做的:
新建一个具有唯一id的tc类(取自数据库,不是这里的重点),作为父类2:1,速率值为1bps,ceil值设置为限制下载速度。
下面是 tc 命令:
-------------- BEGIN SCRIPT --------------
DOWNLINK=800
## Setting up the static tc qdisc and class
$tc qdisc add dev $LAN_IFACE root handle 2: htb default …
Run Code Online (Sandbox Code Playgroud) 我正在尝试按照此处所述在 Linux 网关上设置流量整形。脚本需要自定义,因为我有多个 LAN 接口。因此,为了塑造 LAN 端,我计划创建一个 ifb 伪设备,如下所示:
modprobe ifb
ip link set dev ifb0 up
/sbin/tc qdisc add dev $WAN_INTERFACE ingress
/sbin/tc filter add dev $WAN_INTERFACE parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0
Run Code Online (Sandbox Code Playgroud)
上面提到的 gist repo 中的脚本有以下几行:
/sbin/tc qdisc add dev $WAN_INTERFACE handle ffff: ingress
/sbin/tc filter add dev $WAN_INTERFACE parent ffff: protocol ip prio 1 u32 match ip sport $INTERACTIVE_PORT 0xffff flowid :1
/sbin/tc filter add dev …
Run Code Online (Sandbox Code Playgroud) 我是使用tc和netem 的新手。我想延迟发送到特定 IP 地址的数据包。但是,以下命令会导致系统上的所有数据包延迟,而不仅仅是 IP 地址 1.2.3.4:
tc qdisc del dev eth0 root
tc qdisc add dev eth0 root handle 1: prio
tc qdisc add dev eth0 parent 1:1 handle 2: netem delay 500ms
tc filter add dev eth0 parent 1:0 protocol ip pref 55 handle ::55 u32 match ip dst 1.2.3.4 flowid 2:1
Run Code Online (Sandbox Code Playgroud)
我的猜测是我最后需要某种全能过滤器来指定所有剩余流量不应通过 netem。但我什么也做不了。我如何让这个工作?
我们有一个透明的代理设置。我尝试在 Linux 中寻找流量整形,我在网上能找到的只是通过接口(eth0/eth1...)限制流量。
我需要通过 IP 地址或 IP 范围来限制带宽(永远不要超过特定限制),但我找不到办法做到这一点。
有没有办法做到这一点?
我需要限制带宽使用,类似于某些 ISP 的做法,以便在几秒钟后降低速度。
我一直不明白是否可以对传入流量进行速率限制。我意识到没有直接的方法来控制远程服务器的发送数据包的速率(除非你控制两个端点),但考虑到这个限制,下载管理器究竟是如何让我成功设置下载速度限制的?
TCP 慢启动和限速传入流量之间是否存在任何联系?是否可以使用slow-start描述的方法人为限制发送方发送数据包的速率?
作为一个额外的考虑,应该注意的是,我想在其上实现流量整形的服务器本身建立 PPPoE 连接,并充当网络其余部分的路由器。
更新:到目前为止的答案已经对我提出的问题进行了公平的概述,但我仍然不知道下载管理器如何能够限制传入流量,更具体地说,是否可以在Linux 网关盒。
我目前正在为 ISP 级公司开发流量整形解决方案,并遇到了一个有趣的(有点哲学)问题。
查看系统应该处理的端点数量(大约 20k),我有点担心当我需要策略/调整更多用户的流量时会发生什么。由于我目前正在为整个网络使用 HFSC 整形树(参见 tc-hfsc,主要是与众所周知的 HTB 相同但更酷的东西),我需要使用更多的 ClassID(显然每个用户至少有一个)网络)。我发现的问题是 TC ClassID 的数量有限——它们是 16 位数字,这使我可能最多有 64k 用户受此解决方案影响。
同样,如果我想有效地管理 TC 过滤器(例如,不使用“刷新所有技术”),我需要能够删除或修改单个过滤器条目。(我正在使用类似于 LARTC [1] 中的哈希表的东西)。同样,似乎唯一可行的方法是使用单独的优先级为所有过滤器编号(tc filter add dev ... prio 1)。没有其他参数可用于此目的,遗憾的是,prio 也是 16 位的。
我的问题如下:是否存在一些好的方法来扩大可用的“标识符空间”,例如 'tc class' 命令的 32 位 clsid,以及 'tc filter' 的 32 位优先级(或任何其他修改句柄)命令?
非常感谢,
-mk
(顺便说一句,我希望这不会出现“64k 用户应该对每个人都足够”的情况......)
我有一个很好的整形器,带有散列过滤,构建在 linux 桥上。简而言之,br0
连接external
和internal
物理接口,VLAN 标记的数据包是“透明地”桥接的(我的意思是,那里没有 VLAN 接口)。
现在,不同的内核以不同的方式执行此操作。我可能对确切的内核版本范围有误,请原谅。谢谢。
因此,在 debian 中,2.6.26 及更高版本(我相信最高为 2.6.32)---这有效:
tc filter add dev internal protocol 802.1q parent 1:0 prio 100 \
u32 ht 1:64 match ip dst 192.168.1.100 flowid 1:200
Run Code Online (Sandbox Code Playgroud)
在这里,“内核”将“协议”字段中的两个字节与 0x8100 匹配,但将 ip 数据包的开头视为“零位置”(对不起,我的英语,如果我有点不清楚)。
同样,在 debian(我还没有构建 vanilla 内核)中,2.6.32-5 --- 这有效:
tc filter add dev internal protocol 802.1q parent 1:0 prio 100 \
u32 ht 1:64 match ip dst 192.168.1.100 at 20 flowid 1:200
Run Code Online (Sandbox Code Playgroud)
在这里,“内核”与协议匹配,但计算从该协议头开始的偏移量——我必须添加 4 个字节到偏移量(20,而不是 16 用于 …
以下情况:我们是一群学生管理当地宿舍的互联网连接,共有大约2000名最终用户。
我们有一个流量积分系统,每 MB 下载或上传都会花费积分,新积分按小时添加。目前,我们会在用户用完所有积分后阻止其访问互联网(通过将他置于 Debian 网关路由器上 iptables 中的 REJECT 策略中)。
我们只想限制用户的带宽。做这个的最好方式是什么?
简单的答案是对用户的交换机端口(主要是 Cisco Catalyst 3550)设置速率限制。然而,这是不可取的,因为我们自己的网络内部和到大学网络的流量应该保持无限。有没有办法限制 Cisco IOS 中具有特定目标或源 IP 范围(即出口和入口)的数据包的带宽?我找不到任何东西。
另一种方法是控制我们网关路由器上的流量。我想到了几种解决方案:
tc 或 tcng - 似乎两者都具有相当神秘的语法,并且都没有提供用于执行每个 IP 流量控制的良好功能。为这么多人准备的专用 QDisc 可能会大大降低路由器的速度。此外,关于两者的文档已经过时了。
shorewall - 似乎有一个相当简洁的配置语法,但是,我不确定它是否可以处理这么多的流量和用户,以及它是否适用于 per-IP 流量限制
pfSense - 看起来像一个用于像我们这样的目的的操作系统。但是,这需要我们完全重新安装我们的网关路由器。我们没有其他 BSD 系统,pfSense 也需要有非常好的流量统计功能(我们目前在那里使用 fprobe-ulog 和 ulog-acctd)。
你的经验是什么?哪种解决方案适合我们的需求并且最容易维护?你有其他想法吗?
如果您需要有关我们系统的任何其他信息,请随时询问。
提前致谢。
编辑:我已经用iptables
和实现了系统tc
。
每个用户都有一个 /28 子网、一个 VPN IP(都来自 10.0.0.0/8)和一个外部 IP,所有这些都通过一个 iptables 链进行控制。这条链只有一个规则,一个简单的RETURN
.
每五分钟,一个 Python 脚本读出这些规则的字节计数器。它会重置计数器并更新我们 PostgreSQL 数据库中用户的流量点帐户。
如果用户的点数余额低于某个阈值,则会为该用户创建两个 tc 类(一个用于传入,一个用于我们网关路由器上的传出接口),IP 将输入到属于这些类的 tc 过滤器中。这些课程受 HTB 限速。
与以前的系统相比fprobe-ulog
, …
traffic-shaping ×10
linux ×7
tc ×4
iptables ×3
networking ×3
bandwidth ×1
bsd ×1
cisco ×1
htb ×1
ip ×1
ip-address ×1
isp ×1
linux-kernel ×1
qos ×1
vlan ×1