我正在尝试使用 Dijkstra 代码找到两个主机 H1 和 H2 之间的最短路径。在该路径上的其中一个交换机中设置一个条件。条件是:如果数据包发送到 H2,则自动更改路径。
我正在使用 Mininet,我想使用碳通过过滤进入交换机并发送到 H2 的数据包来减少出站带宽,然后 Dijkstra 代码将改变路径。
我想问一下,我可以使用(tc qdisc)控制给定链路上的出站带宽的使用?碳对物理链接或模拟链接有影响吗?
答案1
是的,是tc
为此设计的。TC 可以在任何类型的接口(物理和软件)上工作。最简单的队列调度程序是htb
(分层令牌桶)。
典型的简单配置:
- htb 根队列规程
- 根类(100% 带宽)
- 默认叶类(80% 带宽保证,最高可达 100% 带宽)
- 带宽受限叶类 1(10% 带宽保证)
- 带宽受限叶类 2(10% 带宽保证,最高 100% 带宽)
- 每个叶类上的 sfq 队列规则,以公平地共享流量之间的限制
子类的汇总带宽不应超过父类的带宽。否则调度程序将不准确。
猜测接口带宽为 100Mbit/s。因此,配置命令将如下所示:
tc qdisc add dev enp4s0f0 root handle 1: htb default 10
tc class add dev enp4s0f0 parent 1: classid 1:1 htb rate 100Mbit ceil 100Mbit quantum 15000
tc class add dev enp4s0f0 parent 1:1 classid 1:10 htb rate 80Mbit ceil 100Mbit quantum 15000
tc class add dev enp4s0f0 parent 1:1 classid 1:11 htb rate 10Mbit ceil 10Mbit quantum 15000
tc class add dev enp4s0f0 parent 1:1 classid 1:12 htb rate 10Mbit ceil 100Mbit quantum 15000
tc qdisc add dev enp4s0f0 parent 1:10 handle 10: sfq
tc qdisc add dev enp4s0f0 parent 1:11 handle 11: sfq
tc qdisc add dev enp4s0f0 parent 1:12 handle 12: sfq
配置完类的层次结构后,应配置分类。分类器有很多种,具有各种功能和各种用户友好度。分类器根据配置的标准检查数据包。如果数据包匹配,则将类分配给该数据包。
tc filter add dev <iface> parent 1: prio 1 protocol ip 800::1 u32 match dst ip 192.168.10.2/32 classid 1:11
tc filter add dev <iface> parent 1: prio 1 protocol ip 800::2 u32 match dst ip 192.168.10.0/24 classid 1:12
在这个小例子中,发往主机的数据包192.168.10.2
将被传递到 1:11 类,因此速度被限制为 10Mbit/s。发192.168.10.0/24
往子网中其他地址的数据包将被传递到 1:12 类。所有其他数据包将被传递到默认类 (1:10)。
这是该工具使用的快速起点tc
。
如果您有任何疑问,请提出。